• 万字C语言之分支语句和循环语句


    前言:

    📕作者简介:热爱编程的小七,致力于C、Java、Python等多编程语言,热爱编程和长板的运动少年!

    📘相关专栏Java基础语法,JavaEE初阶,数据库,数据结构和算法系列等,大家有兴趣的可以看一看。

    😇😇😇有兴趣的话关注博主一起学习,一起进步吧!

    一、什么是语句

    C语句可分为以下五类:

    1. 表达式语句

    2. 函数调用语句

    3. 控制语句

    4. 复合语句

    5. 空语句

    控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语言有九种控制语句。

    可分成以下三类: 1. 条件判断语句也叫分支语句:if语句、switch语句; 2. 循环执行语句:do while语句、while语句、for语句; 3. 转向语句:break语句、goto语句、continue语句、return语句。


    二、分支语句(选择结构)

    2.1 if语句

    1. 语法结构:
    2. //1.第一种表示
    3. if(表达式)
    4. 语句;
    5. if(表达式)
    6. 语句1;
    7. else
    8. 语句2;
    9. //2.第二种方式(多分支)
    10. if(表达式1)
    11. 语句1;
    12. else if(表达式2)
    13. 语句2;
    14. else
    15. 语句3;

    在C语言中:0表示假,非0表示真。

    1. #include
    2. int main()
    3. {
    4. int age=0;
    5. printf("请输入年龄:\n");
    6. scanf("%d",&age);
    7. if(age>=0 && age<18)
    8. {
    9. printf("未成年\n!");
    10. }
    11. else if(age>=18 && age <=35)
    12. {
    13. printf("中年人!\n");
    14. }
    15. else if(age>35 && age< 80)
    16. {
    17. printf("老年人!\n");
    18. }
    19. else{
    20. printf("老不死\n!");
    21. }
    22. return 0;
    23. }
    24. //执行结果:
    25. [root@VM-16-7-centos Day909]# ./test
    26. 请输入年龄:
    27. 44
    28. 老年人!
    29. [root@VM-16-7-centos Day909]# ./test
    30. 请输入年龄:
    31. 15
    32. 未成年
    33. ![root@VM-16-7-centos Day909]# ./test
    34. 请输入年龄:
    35. 99
    36. 老不死

     2.1.1悬空else

    1. #include
    2. int main()
    3. {
    4. int a = 0;
    5. int b = 2;
    6. if (a == 1)
    7. if (b == 2)
    8. printf("hehe\n");
    9. else
    10. printf("haha\n");
    11. return 0;
    12. }
    13. #include
    14. int main()
    15. {
    16. int a = 0;
    17. int b = 2;
    18. if (a == 1)
    19. if (b == 2)
    20. printf("hehe\n");
    21. else
    22. printf("haha\n");
    23. return 0;
    24. }
    25. [root@VM-16-7-centos Day909]# ./test
    26. [root@VM-16-7-centos Day909]#

    总结:代码风格很重要,我们可以使用适当的{}使我们的逻辑更加清楚。

    1. #include
    2. int main()
    3. {
    4. int a = 0;
    5. int b = 2;
    6. if (a == 1)
    7. {
    8. if (b == 2)
    9. {
    10. printf("hehe\n");
    11. }
    12. else
    13. {
    14. printf("haha\n");
    15. }
    16. }
    17. return 0;
    18. }

     else的匹配:else是和它离的最近的if匹配的。

    2.1.2if书写形式的对比

    1. //代码1
    2. if (condition) {
    3. return x;
    4. }
    5. return y;
    6. //代码2
    7. if (condition)
    8. {
    9. return x;
    10. }
    11. else
    12. {
    13. return y;
    14. }
    15. //代码3
    16. int num = 1;
    17. if (num == 5)
    18. {
    19. printf("hehe\n");
    20. }
    21. //代码4
    22. int num = 1;
    23. if (5 == num)
    24. {
    25. printf("hehe\n");
    26. }

    代码2和代码4更好,逻辑更加清晰,不容易出错。

    2.1.3练习

    1. 判断一个数是否为奇数

    1. #include
    2. int main()
    3. {
    4. printf("请输入一个整数:\n");
    5. int num=0;
    6. scanf("%d",&num);
    7. if(num%2==0)
    8. {
    9. printf("这是一个偶数!\n");
    10. }
    11. else{
    12. printf("这是一个奇数!\n");
    13. }
    14. return 0;
    15. }
    16. [root@VM-16-7-centos Day909]# ./test1
    17. 请输入一个整数:
    18. 7
    19. 这是一个奇数!
    20. [root@VM-16-7-centos Day909]# ./test1
    21. 请输入一个整数:
    22. 8
    23. 这是一个偶数!

    2. 输出1-100之间的奇数

    1. #include
    2. int main()
    3. {
    4. //输出1-100之间的奇数
    5. for(int i=1;i<=100;1++)
    6. {
    7. if(i % 2==1)
    8. {
    9. pritnf("%d ",i);
    10. }
    11. }
    12. return 0;
    13. }
    14. [root@VM-16-7-centos Day909]# ./test1
    15. 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99 [root@VM-16-7-centos Day909]#

    2.2switch语句

    switch语句也是一种分支语句。

    比如:

    输入1,输出星期一

    输入2,输出星期二

    输入3,输出星期三

    输入4,输出星期四

    输入5,输出星期五

    输入6,输出星期六

    输入7,输出星期日

    1. switch(整型表达式)
    2. {
    3. 语句项;
    4. }

     而语句项是什么呢?

    1. //是一些case语句:
    2. //如下:
    3. case 整形常量表达式:
    4. 语句;

    2.2.1在switch语句中的 break

    在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。

    1. #include
    2. int main()
    3. {
    4. printf("请输入:\n");
    5. int num=0;
    6. scanf("%d",&num);
    7. switch(num)
    8. {
    9. case 1:
    10. printf("星期一\n");
    11. break;
    12. case 2:
    13. printf("星期二\n");
    14. break;
    15. case 3:
    16. printf("星期三\n");
    17. break;
    18. case 4:
    19. printf("星期四\n");
    20. break;
    21. case 5:
    22. printf("星期五\n");
    23. break;
    24. case 6:
    25. printf("星期六\n");
    26. break;
    27. case 7:
    28. printf("星期日\n");
    29. break;
    30. default:
    31. printf("您的输入有误,请重试\n");
    32. break;
    33. }
    34. return 0;
    35. }
    36. [root@VM-16-7-centos Day909]# ./test1
    37. 请输入:
    38. 1
    39. 星期一
    40. [root@VM-16-7-centos Day909]# ./test1
    41. 请输入:
    42. 5
    43. 星期五
    44. [root@VM-16-7-centos Day909]# ./test1
    45. 请输入:
    46. 8
    47. 您的输入有误,请重试

    有时候我们的需求变了:

    1. 输入1-5,输出的是“weekday”;

    2. 输入6-7,输出“weekend”

    1. #include
    2. int main()
    3. {
    4. printf("请输入:\n");
    5. int num=0;
    6. scanf("%d",&num);
    7. switch(num)
    8. {
    9. case 1:
    10. case 2:
    11. case 3:
    12. case 4:
    13. case 5:
    14. printf("工作日\n");
    15. break;
    16. case 6:
    17. case 7:
    18. printf("工作日\n");
    19. break;
    20. default:
    21. printf("您的输入有误,请重试\n");
    22. break;
    23. }
    24. return 0;
    25. }
    26. [root@VM-16-7-centos Day909]# ./test1
    27. 请输入:
    28. 4
    29. 工作日
    30. [root@VM-16-7-centos Day909]# ./test1
    31. 请输入:
    32. 6
    33. 工作日

    break语句的实际效果是把语句列表划分为不同的分支部分。

    编程好习惯:

    一般情况下:在最后一个 case 语句的后面加上一条 break语句。

    实际根据情况而选择是否添加break。

    2.2.2default子句

    如果表达的值与所有的case标签的值都不匹配怎么办?其实也没什么,结构就是所有的语句都被跳过而已。

    程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?你可以在语句列表中增加一条default子句,把下面的标签default:写在任何一个case 标签可以出现的位置。当 switch 表达式的值并不匹配所有case 标签的值时,这个default 子句后面的语句就会执行。所以,每个switch语句中只能出现一条default子句。但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。

    在每个 switch 语句中都放一条default子句是个好习惯,甚至可以在后边再加一个 break 。

    2.3循环语句

    • while

    • for

    • do while

    2.3.1while循环

    应用场景:同一件事情我们需要完成很多次。

    1. //while 语法结构
    2. while(表达式)
    3. 循环语句;

    练习:在屏幕上打印1-10的数字。

    1. #include
    2. int main()
    3. {
    4. int i=0;
    5. for(i=0;i<10;i++)
    6. {
    7. printf("%d ",i);
    8. }
    9. printf("\n");
    10. return 0;
    11. }
    12. [root@VM-16-7-centos Day909]# ./test1
    13. 0 1 2 3 4 5 6 7 8 9
    2.3.1.1while语句中的break和continue

    break介绍:

    1. #include
    2. int main()
    3. {
    4. int i=0;
    5. while(i<10)
    6. {
    7. if(i==5){
    8. break;
    9. }
    10. printf("%d ",i);
    11. i++;
    12. }
    13. printf("\n");
    14. return 0;
    15. }
    16. //当i等于5的时候退出循环,不再进行接下来的操作
    17. [root@VM-16-7-centos Day909]# ./test1
    18. 0 1 2 3 4

    总结:break在while循环中的作用:

    其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。

    所以:while中的break是用于永久终止循环的。

    continue介绍:

    1. #include
    2. int main()
    3. {
    4. int i=0;
    5. while(i<10)
    6. {
    7. if(i==5){
    8. continue;
    9. }
    10. i++;
    11. printf("%d ",i);
    12. }
    13. printf("\n");
    14. return 0;
    15. }
    16. //当i==5的时候,跳过本次循环进入下一次循环。
    17. //执行结果如下:
    18. [root@VM-16-7-centos Day909]# ./test1
    19. 0 1 2 3 4 6 7 8 9

    continue在while循环中的作用就是:

    continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,

    而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。

    2.3.1.2练习
    1. //代码1
    2. #include
    3. int main()
    4. {
    5. int ch = 0;
    6. while ((ch = getchar()) != EOF)
    7. putchar(ch);
    8. return 0;
    9. }
    10. 这里的代码适当的修改是可以用来清理缓冲区的.
    11. //代码2
    12. #include
    13. int main()
    14. {
    15. char ch = '\0';
    16. while ((ch = getchar()) != EOF)
    17. {
    18. if (ch < ‘0’ || ch > ‘9’)
    19. continue;
    20. putchar(ch);
    21. }
    22. return 0;
    23. }
    24. //这个代码的作用是:只打印数字字符,跳过其他字符的、

    2.3.2for循环

    1. for(表达式1; 表达式2; 表达式3)
    2. 循环语句;

    表达式1为初始化部分,用于初始化循环变量的。

    表达式2为条件判断部分,用于判断循环时候终止。

    表达式3为调整部分,用于循环条件的调整。

    1. #include
    2. int main()
    3. {
    4. int i = 0;
    5. //for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
    6. for (i = 1; i <= 10; i++)
    7. {
    8. printf("%d ", i);
    9. }
    10. return 0;
    11. }

    现在我们对比一下for循环和while循环:

    1. int i = 0;
    2. //实现相同的功能,使用while
    3. i = 1;//初始化部分
    4. while (i <= 10)//判断部分
    5. {
    6. printf("hehe\n");
    7. i = i + 1;//调整部分
    8. }
    9. //实现相同的功能,使用while
    10. for (i = 1; i <= 10; i++)
    11. {
    12. printf("hehe\n");
    13. }

    可以发现在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹;for循环使用的频率也最高。

    2.3.2.1break和continue在for循环中
    1. //代码1
    2. #include
    3. int main()
    4. {
    5. int i = 0;
    6. for (i = 1; i <= 10; i++)
    7. {
    8. if (i == 5)
    9. break;
    10. printf("%d ", i);
    11. }
    12. return 0;
    13. }
    14. //代码2
    15. #include
    16. int main()
    17. {
    18. int i = 0;
    19. for (i = 1; i <= 10; i++)
    20. {
    21. if (i == 5)
    22. continue;
    23. printf("%d ", i);
    24. }
    25. return 0;
    26. }
    2.3.2.2for语句的循环控制变量
    1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。

    2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。

    1. //同样都是进行十次循环
    2. int i = 0;
    3. //前闭后开的写法
    4. for (i = 0; i < 10; i++)
    5. {
    6. }
    7. //两边都是闭区间
    8. for (i = 0; i <= 9; i++)
    9. {
    10. }
    2.3.2.3一些for循环的变种
    1. int main()
    2. {
    3. //代码1
    4. for (;;)
    5. {
    6. printf("hehe\n");
    7. }
    8. //for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问
    9. 题。
    10. //代码2
    11. int i = 0;
    12. int j = 0;
    13. //这里打印多少个hehe?
    14. for (i = 0; i < 10; i++)
    15. {
    16. for (j = 0; j < 10; j++)
    17. {
    18. printf("hehe\n");
    19. }
    20. }
    21. //代码3
    22. int i = 0;
    23. int j = 0;
    24. //如果省略掉初始化部分,这里打印多少个hehe?
    25. for (; i < 10; i++)
    26. {
    27. for (; j < 10; j++)
    28. {
    29. printf("hehe\n");
    30. }
    31. }
    32. //代码4-使用多余一个变量控制循环
    33. int x, y;
    34. for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
    35. {
    36. printf("hehe\n");
    37. }
    38. return 0;
    39. }

    2.3.3do...while()循环

    do语句的语法:

    1. do
    2. 循环语句;
    3. while(表达式);

    执行流程:

    2.3.3.1do语句的特点

    循环至少执行一次,使用的场景有限,所以不是经常使用。 

    1. #include
    2. int main()
    3. {
    4. int i = 10;
    5. do
    6. {
    7. printf("%d\n", i);
    8. } while (i < 10);
    9. return 0;
    10. }
    11. //输出结果:10
    2.3.3.2do while循环中的break和continue
    1. #include
    2. int main()
    3. {
    4. int i = 10;
    5. do
    6. {
    7. if (5 == i)
    8. break;
    9. printf("%d\n", i);
    10. } while (i < 10);
    11. return 0;
    12. }
    13. #include
    14. int main()
    15. {
    16. int i = 10;
    17. do
    18. {
    19. if (5 == i)
    20. continue;
    21. printf("%d\n", i);
    22. } while (i < 10);
    23. return 0;
    24. }

    2.4练习

    2.4.1编写代码,演示多个字符从两端移动,向中间汇聚。

    1. #include
    2. #include
    3. #include //sleep()函数
    4. int main()
    5. {
    6. char arr1[] = "welcome to bit...";
    7. char arr2[] = "#################";
    8. int left = 0;
    9. int right = strlen(arr1) - 1;
    10. printf("%s\n", arr2);
    11. //while循环实现
    12. while (left <= right)
    13. {
    14. Sleep(1000);
    15. arr2[left] = arr1[left];
    16. arr2[right] = arr1[right];
    17. left++;
    18. right--;
    19. printf("%s\n", arr2);
    20. }
    21. //for循环实现
    22. for (left = 0, right = strlen(src) - 1;
    23. left <= right;
    24. left++, right--)
    25. {
    26. Sleep(1000);
    27. arr2[left] = arr1[left];
    28. arr2[right] = arr1[right];
    29. printf("%s\n", target);
    30. }
    31. retutn 0;
    32. }

    2.4.2编写代码实现,模拟用户登录情景,并且只能登录三次。

    1. //代码2
    2. int main()
    3. {
    4. char psw[10] = "";
    5. int i = 0;
    6. int j = 0;
    7. for (i = 0; i < 3; ++i)
    8. {
    9. printf("please input:");
    10. scanf("%s", psw);
    11. if (strcmp(psw, "password") == 0)
    12. break;
    13. }
    14. if (i == 3)
    15. printf("exit\n");
    16. else
    17. printf("log in\n");
    18. }

    2.4.3猜数字游戏实现
     

    1. #include
    2. #include
    3. #include
    4. void menu()
    5. {
    6. printf("**********************************\n");
    7. printf("*********** 1.play **********\n");
    8. printf("*********** 0.exit **********\n");
    9. printf("**********************************\n");
    10. }
    11. //RAND_MAX--rand函数能返回随机数的最大值。
    12. void game()
    13. {
    14. int random_num = rand() % 100 + 1;
    15. int input = 0;
    16. while (1)
    17. {
    18. printf("请输入猜的数字>:");
    19. scanf("%d", &input);
    20. if (input > random_num)
    21. {
    22. printf("猜大了\n");
    23. }
    24. else if (input < random_num)
    25. {
    26. printf("猜小了\n");
    27. }
    28. else
    29. {
    30. printf("恭喜你,猜对了\n");
    31. break;
    32. }
    33. }
    34. }
    35. int main()
    36. {
    37. int input = 0;
    38. srand((unsigned)time(NULL));
    39. do
    40. {
    41. menu();
    42. printf("请选择>:");
    43. scanf("%d", &input);
    44. switch (input)
    45. {
    46. case 1:
    47. game();
    48. break;
    49. case 0:
    50. break;
    51. default:
    52. printf("选择错误,请重新输入!\n");
    53. break;
    54. }
    55. } while (input);
    56. return 0;
    57. }

    2.5goto语句

    C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。

    从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。

    但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。例如:一次跳出两层或多层循环。多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。

    1. goto语言真正适合的场景如下:
    2. for (...)
    3. for (...)
    4. {
    5. for (...)
    6. {
    7. if (disaster)
    8. goto error;
    9. }
    10. }
    11. error :
    12. if (disaster)
    13. // 处理错误情况

    一个关机程序:

    1. #include
    2. int main()
    3. {
    4. char input[10] = { 0 };
    5. system("shutdown -s -t 60");
    6. again:
    7. printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
    8. scanf("%s", input);
    9. if (0 == strcmp(input, "我是猪"))
    10. {
    11. system("shutdown -a");
    12. }
    13. else
    14. {
    15. goto again;
    16. }
    17. return 0;
    18. }

    而如果不适用goto语句,则可以使用循环:

    1. #include
    2. #include
    3. int main()
    4. {
    5. char input[10] = { 0 };
    6. system("shutdown -s -t 60");
    7. while (1)
    8. {
    9. printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
    10. scanf("%s", input);
    11. if (0 == strcmp(input, "我是猪"))
    12. {
    13. system("shutdown -a");
    14. break;
    15. }
    16. }
    17. return 0;
    18. }

    shutDown命令拓展https://baike.baidu.com/item/%E8%87%AA%E5%8A%A8%E5%85%B3%E6%9C%BA/7875386?fr=aladdin&fromtitle=shutdown&fromid=10469108

  • 相关阅读:
    力扣刷题:整数反转、 字符串转换整数 (atoi)、回文数
    Python使用抽象工厂模式和策略模式的组合实现生成指定长度的随机数
    竹云荣膺2023十大数字化转型创新企业
    数据库事务,JDBC操作和数据类型
    Spring @Transactional 与 JTA @Transactional
    Dubbo3 Triple 协议简介与选型思考
    电源方案对比
    特征缩放和转换以及自定义Transformers(Machine Learning 研习之九)
    统计学补(似然函数+EM算法)
    常见的ssh功能
  • 原文地址:https://blog.csdn.net/m0_75022408/article/details/132780742