基本魔法语言分支和循环 (二) (C语言)

🌊用有趣的言语来阐述苦涩难懂的代码世界,让每一个技术都充满风趣!
🔭个人主页:散峰而望
🚀学习方向: C/C++等方向
📌专栏系列:
- 📖《C语言:从基础到进阶》
- 📚《编程工具的下载和使用》
- 🚀《C语言刷题》
💬人生格言:冀以尘雾之微,补益山海,荧烛末光,增辉岁月。
🎬博主简介

文章目录
- 5. switch语句
- 5.1 if语句和switch语句的对比
- 5.2 switch语句中的break
- 5.4 switch语句中的case和default的顺序问题
- 6. while循环
- 6.1 if和while的对比
- 6.2 while语句的执行流程
- 7.for循环
- 7.1 语法形式
- 7.2 for循环的执行流程
- 7.3 for循环的实践
- 7.4 while循环和for循环的对比
- 8. do-while循环
- 8.1 语法形式
- 8.2 do-while循环的执行流程
- 8.3 do-while的实例
- 9. break和continue语句
- 9.1 while循环中的break和continue
- 9.1.1 break举例
- 9.2.2 continue举例
- 9.2 for循环中的break和continue
- 9.2.1 break举例
- 9.2.2 continue举例
- 9.3 do-while中的break和continue
- 10. 循环的嵌套
- 11. goto语句
- 结尾
5. switch语句
switch语句相当于多重命运咒,是一个决策性咒语,用于在多种已知的可能性中选择一条路径。相当于是一种特殊形式的if…else结构,把多重的if…else改成更易用、可读性更好的形式。下面是switch的语言基本模板。
switch(expression)
{
case value1:statement
case value1:statement
...
default:statement
}
上面代码中,根据expression不同的值,执行相应的case分支。如果找不到相应的值,就执行default分支。
注意:
- switch后面的expression必须是整型表达式
- case后面的值,必须是整形常量表达式
5.1 if语句和switch语句的对比
如:输入任意整数值,计算除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");elseprintf("余数为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;}}
上述的代码中,我们需要注意的点:
- case和后边的数字之间必须有空格。
- 每一个case语句中的代码执行完成后,需要加上break,才能跳出这个switch语句。
5.2 switch语句中的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;
}
5.4 switch语句中的case和default的顺序问题
在switch语句中case语句和default子句有顺序吗?default只能放在最后吗?
自然不是,放哪都行,不过通常将default放在最后处理。
6. while循环
while是一个条件持续咒语,只要魔力足够强(条件为真),就会执行咒语(循环体)。只要魔力足够,咒语就会一直执行。如此反复,直到魔力耗尽(条件为假),咒语自动解除。是一个先判断 ,后执行的咒语,如果一开始魔力就已经耗尽,那么咒语一次都不会生效。
同时while语句的语法结构和if非常相似。
6.1 if和while的对比
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语句是可以实现循环效果,一直重复下去。
6.2 while语句的执行流程

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

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

7.4 while循环和for循环的对比


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

在do-while循环中先执行图上的“语句”,执行完语句,在去执行“判断表达式”,判断表达式的结果是!= 0,则继续循环,执行循环语句;判断表达式的结果== 0,则循环结束。
所以在do-while语句中循环体是至少执行一次的,这是do-while循环比较特殊的地方。
注意:do-while里面创建的变量,while是无法使用的。
8.3 do-while的实例
在屏幕上打印1~9的值
int main()
{int i = 1;do{printf("%d ", i);i++;} while (i < 10);return 0;
}

一般do-while使用在循环体至少被执行一次的场景下,所以比较少。
9. break和continue语句
循环过程中,如果发生某些状况,需要提前终止循环,在C语言中提供了break和continue两个关键字,就是运用到循环中。
- break的作用是用于永远的终止循环,只要break被执行,直接就会跳出循环,继续执行。
- continue的作用是跳过本次循环中的continue后边的代码,在for循环和while循环中有所差异。
9.1 while循环中的break和continue
9.1.1 break举例
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。
9.2.2 continue举例
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几个数。
9.2 for循环中的break和continue
9.2.1 break举例
与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实现。
9.2.2 continue举例
如果改为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实现。
9.3 do-while中的break和continue
do-while语句基本上和while循环一模一样,大家可以自行测试体会。
10. 循环的嵌套
前面学习了三种循环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;
}

11. goto语句
C语言提供了一种特殊的语法,就是goto语句和跳转标号,goto语句可以实现同一个函数内跳转到设置好的标号处。
例如:
int main()
{printf("hehe\n");goto next;printf("haha\n");next:printf("跳过打印haha\n");return 0;
}

goto语句不仅可以向前跳,还可以向后跳,但会形成死循环。故goto循环使用不当,就会导致在函数内部随意乱跳,打乱程序的执行流程,所以尽量少用。但在多层循环代码中,想要快速跳转,使用goto非常方便。
结尾
往期回顾
基本魔法语言分支和循环 (一) (C语言)
结语:希望这些能帮助各位快速掌握分支和循环,同时期盼各位佬能给博主来个“一键四连”啦!
