
switch语句相当于多重命运咒,是一个决策性咒语,用于在多种已知的可能性中选择一条路径。相当于是一种特殊形式的if…else结构,把多重的if…else改成更易用、可读性更好的形式。下面是switch的语言基本模板。
switch(expression)
{
case value1:statement
case value1:statement
...
default:statement
}上面代码中,根据expression不同的值,执行相应的case分支。如果找不到相应的值,就执行default分支。
注意:
如:输入任意整数值,计算除3之后的余数
如果用if语句
int main()
{
int n = 0;
scanf("%d", &n);
if (n % 3 == 0)
printf("整除,余数为0\n");
else if (n % 3 == 1)
printf("余数为1\n");
else
printf("余数为2\n");
return 0;
}如果用switch语句改写,是这样的
int main()
{
int n = 0;
scanf("%d", &n);
switch (n % 3)
{
case 0:
printf("整除,余数为0\n");
break;
case 1:
printf("余数为1\n");
break;
case 2:
printf("余数为2\n");
break;
}
}上述的代码中,我们需要注意的点:
break相当于咒语结界符,当你执行一道正确的多重命运咒魔法,这个结界会立即将你传送出整个多重命运咒,防止你继续执行后面并行魔法咒语。如果上面的代码中除去break,会出现什么情况?
int main()
{
int n = 0;
scanf("%d", &n);
switch (n % 3)
{
case 0:
printf("整除,余数为0\n");
case 1:
printf("余数为1\n");
case 2:
printf("余数为2\n");
}
}
我们发现,3除以3本来余数是0,但是我们发现程序运行的结果多了两行“余数为1”和“余数为2”的打印。
这是为什么呢?
原因是switch语句是分支效果的,只有在switch语句中使用break才能跳出switch语句,如果某一个case语句的后面没有break语句,代码会继续执行下去,有可能执行其他case语句中的代码,直到遇到break语句或switch语句结束,就如上图。
所以在switch语句中break语句是非常重要的,能实现真正的分支效果。
当然,break也不是每个case语句都要有,这要根据实际情况来看。如输入1~5输出“工作日”, 6~7输出“休息日”:
int main()
{
int day = 0;
scanf("%d\n", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
default:
printf("输入错误\n");
break;
}
return 0;
}在switch语句中case语句和default子句有顺序吗?default只能放在最后吗?
自然不是,放哪都行,不过通常将default放在最后处理。
while是一个条件持续咒语,只要魔力足够强(条件为真),就会执行咒语(循环体)。只要魔力足够,咒语就会一直执行。如此反复,直到魔力耗尽(条件为假),咒语自动解除。是一个先判断 ,后执行的咒语,如果一开始魔力就已经耗尽,那么咒语一次都不会生效。
同时while语句的语法结构和if非常相似。
if(表达式)
语句;
while(表达式)
语句;//如果想包含更多的语句,可以加大括号当然可以用具体的代码对比一下:
int main()
{
if (1)
printf("Welcome to China\n");
return 0;
}
int main()
{
while (1)
printf("Welcome to China\n");
return 0;
}
可以看到if和while的区别,while语句是可以实现循环效果,一直重复下去。

首先上来就是执行判断表达式,表达式为0,循环直接结束;表达式的值不为0,执行循环语句,语句执行完继续判断,是否进行下一次判断。
for循环是一个精密炼成阵,需要一个固定的“仪式三部曲”,是三种循环使用最多的循环。
for循环的语法形式如下:
for(表达式1;表达式2;表达式3;)
语句;//如果想包含更多的语句,可以加上大括号仪式三部曲: 1.仪式准备(表达式1):需要一个计数器并赋予初始值(int i = 0) 2.仪式条件(表达式2):设定仪式持续的结界(i < 10) 3.仪式步骤(表达式3):每完成一次小仪式,计数器就按预定规律变化(i++)

首先执行表达式1初始化循环变量,接下来执行表达式2的判断部分,表达式2结果如果== 0,则循环结束;表达式2的结果如果!= 0则执行循环语句,循环语句执行完后,再去执行表达式3,调整循环变量,然后再去表达式2的地方执行判断,表达式2的结果是否为0,决定循环是否继续。
整个循环过程中,表达式1初始化部分只执行1次,循环的是表达式2、循环语句、表达式3在循环。
如在屏幕上打印1~10的值
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
printf("%d ", i);
return 0;
}


for和while在实现循环的过程中都有初始化、判断、调整三个部分,但是for循环的三个部分非常集中,便于代码的维护,如果代码较多的时候,while循环的三个部分比较分散,所以形式上for循环更优一些。
do-while相当于无悔誓约咒,与while咒语不同,先不顾一切地执行一次咒语效果(循环体),然后才去感知魔力(条件表达式)。如果魔力依然充沛,就重新执行咒语,否则咒语结束。
在循环语句中do-while语句使用的最少,语法如下:
do
语句;
while(表达式); while和for这两种循环都是先判断,条件如果满足就进入循环,执行循环语句,如果不满足就跳出循环;
而do-while循环则是先直接进入循环体,执行循环语句,然后再执行while后的判断表达式,表达式为真,就会执行下一次,表达式为假,则不再继续循环。

在do-while循环中先执行图上的“语句”,执行完语句,在去执行“判断表达式”,判断表达式的结果是!= 0,则继续循环,执行循环语句;判断表达式的结果== 0,则循环结束。
所以在do-while语句中循环体是至少执行一次的,这是do-while循环比较特殊的地方。
注意:do-while里面创建的变量,while是无法使用的。
在屏幕上打印1~9的值
int main()
{
int i = 1;
do
{
printf("%d ", i);
i++;
} while (i < 10);
return 0;
}
一般do-while使用在循环体至少被执行一次的场景下,所以比较少。
循环过程中,如果发生某些状况,需要提前终止循环,在C语言中提供了break和continue两个关键字,就是运用到循环中。
int main()
{
int i = 0;
while (i < 10)
{
if (i == 5)
break;
printf("%d", i);
i = i + 1;
}
return 0;
}
打印了01234后,当i == 5时,循环在break地方终止,不再打印,不再循环。
所以break的作用是永久的终止循环,只要break被执行,break外的第一层循环终止。故以后想终止循环,则可以使用break。
continue是继续的意思,在循环中的作用就是跳过本次循环中continue后边的代码,继续执行下一次循环的判断。那么break改为continue会是什么结果呢?
int main()
{
int i = 0;
while (i < 10)
{
if (i == 5)
continue;
printf("%d", i);
i = i + 1;
}
return 0;
}
发现当i == 5时,就执行continue,直接跳过某一次循环continue后边的代码,去循环判断的地方,因为这里跳过i = i + 1,所以i一直为5,陷入死循环,无法结束程序,所以终端只有01234几个数。
与while循环中一样,for循环break也是用于终止循环,不管循环还需要循环多少次,只要执行到break,循环就彻底终止。
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
break;
printf("%d", i);
}
return 0;
}
break的作用是永久终止循环,故不想继续循环的时候,可以用break实现。
如果改为continue会是什么样的呢?
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d", i);
}
return 0;
}
发现for循环中的continue的作用是跳过本次循环,然后接着后面的循环的调整部分,因此打印的其他数都有,唯独没有5。故当某个条件发生时,本次循环无需再执行后续操作时候,可以用continue实现。
do-while语句基本上和while循环一模一样,大家可以自行测试体会。
前面学习了三种循环while、do-while、for,这三种循环往往会嵌套在形成一个复杂的魔法阵,从而更好的解决问题。这就是所说的:循环嵌套。
举一个例子:找出100~200之间的素数,并打印在屏幕上。
int main()
{
int i = 0;
//循环产生100~200之间的数
for (i = 100; i <= 200; i++)
{
//判断i是否为素数
//判断2~i-1之间的数
int j = 0;
int flag = 1;//假设i为素数
//flag作用是为了给一个变量,标记是不是素数
for (j = 2; j < i; j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
printf("%d ", i);
}
return 0;
}
注意:在判断i % j == 0这里不能用if…else…格式来写,比如9不会被2整除,走else判断 flag == 1,但是9不是素数。
int main()
{
int i = 0;
//循环产生100~200之间的数
for (i = 1; i <= 10; i++)
{
//判断i是否为素数
//判断2~i-1之间的数
int j = 0;
int flag = 1;//假设i为素数
//flag作用是为了给一个变量,标记是不是素数
for (j = 2; j < i; j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
else
{
flag = 1;
break;
}
}
if (flag == 1)
printf("%d ", i);
}
return 0;
}
C语言提供了一种特殊的语法,就是goto语句和跳转标号,goto语句可以实现同一个函数内跳转到设置好的标号处。
例如:
int main()
{
printf("hehe\n");
goto next;
printf("haha\n");
next:
printf("跳过打印haha\n");
return 0;
}
goto语句不仅可以向前跳,还可以向后跳,但会形成死循环。故goto循环使用不当,就会导致在函数内部随意乱跳,打乱程序的执行流程,所以尽量少用。但在多层循环代码中,想要快速跳转,使用goto非常方便。
往期回顾
结语:希望这些能帮助各位快速掌握分支和循环,同时期盼各位佬能给博主来个“一键四连”啦!