while 循环

while 循环先判断,再执行循环体

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i = 10;
  5. while(i>10)
  6. {
  7. printf("%d ",i);
  8. i++;
  9. }
  10. }
  11. // 输出
  12. 什么也不输出,因为先执行 i 是否大于 10 的判断,但并不大于 10 ,所以不执行循环体

do while 循环

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i = 10;
  5. do
  6. {
  7. printf("%d ",i);
  8. i++;
  9. }while(i>10);
  10. }
  11. // 输出
  12. 这是一个从 10 +∞ 的无限循环
  13. // 可以看到先执行 printf 和 i++ 的操作后,满足了判断条件 i>10

for 循环

逗号运算符

逗号运算符的优先级是所有运算符中最低的,且采用从左向右结合的方式

for 的格式

  1. for(表达式1;表达式2;表达式3)
  2. {
  3. // 执行代码
  4. }
  5. // 其中表达式并非只能一个语句,可以是多个语句,用逗号隔开
  6. // 1. 表达式 1 只在第一次初始化时存在,之后的循环将只受限于表达式 2,3
  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i,j;
  5. for(i=1,j=i+1;i<20;i++)
  6. {
  7. printf("i=%d,j=%d\n",i,j);
  8. }
  9. }
  10. // 输出,可以看到 j 的值没有变,因为表达式 1 只在第一次时使用
  11. i=1,j=2
  12. i=2,j=2
  13. i=3,j=2
  14. i=4,j=2
  15. i=5,j=2
  16. i=6,j=2
  17. i=7,j=2
  18. i=8,j=2
  19. i=9,j=2
  20. i=10,j=2
  21. i=11,j=2
  22. i=12,j=2
  23. i=13,j=2
  24. i=14,j=2
  25. i=15,j=2
  26. i=16,j=2
  27. i=17,j=2
  28. i=18,j=2
  29. i=19,j=2

break 语句

break 用于跳出当前循环体的所有循环,即即使后面还有循环,也不再执行,这点和 continue 要区分

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i=1;
  5. while(1)
  6. {
  7. i++;
  8. printf("%d ",i);
  9. if(i==20) break;
  10. }
  11. }
  12. // 输出,这本来是一个无限循环,但是设置了 i == 20,跳出所有循环
  13. 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

note

  1. 对于嵌套循环来说(不管是 while,do while 还是 for),break 都只能跳出一个循环范围,比如有一个两层嵌套的结构,break 位于最里面,那么 break 只能跳出最里面的循环,外层循环体依旧执行。
  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i=0,j=0;
  5. while(i<20)
  6. {
  7. while(j<5)
  8. {
  9. if(j==3) break;
  10. printf("i=%d,j=%d\n",i,j);
  11. j++;
  12. }
  13. j=0;
  14. i++;
  15. }
  16. }
  17. // 输出,可以看到所有循环中,只有内层循环当 j == 3时,跳出,不在执行 j==4 和 j==5
  18. // 但 i 的每一次循环都执行
  19. i=0,j=0
  20. i=0,j=1
  21. i=0,j=2
  22. i=1,j=0
  23. i=1,j=1
  24. i=1,j=2
  25. i=2,j=0
  26. i=2,j=1
  27. i=2,j=2
  28. i=3,j=0
  29. i=3,j=1
  30. i=3,j=2
  31. i=4,j=0
  32. i=4,j=1
  33. i=4,j=2
  34. i=5,j=0
  35. i=5,j=1
  36. i=5,j=2
  37. i=6,j=0
  38. i=6,j=1
  39. i=6,j=2
  40. i=7,j=0
  41. i=7,j=1
  42. i=7,j=2
  43. i=8,j=0
  44. i=8,j=1
  45. i=8,j=2
  46. i=9,j=0
  47. i=9,j=1
  48. i=9,j=2
  49. i=10,j=0
  50. i=10,j=1
  51. i=10,j=2
  52. i=11,j=0
  53. i=11,j=1
  54. i=11,j=2
  55. i=12,j=0
  56. i=12,j=1
  57. i=12,j=2
  58. i=13,j=0
  59. i=13,j=1
  60. i=13,j=2
  61. i=14,j=0
  62. i=14,j=1
  63. i=14,j=2
  64. i=15,j=0
  65. i=15,j=1
  66. i=15,j=2
  67. i=16,j=0
  68. i=16,j=1
  69. i=16,j=2
  70. i=17,j=0
  71. i=17,j=1
  72. i=17,j=2
  73. i=18,j=0
  74. i=18,j=1
  75. i=18,j=2
  76. i=19,j=0
  77. i=19,j=1
  78. i=19,j=2

continue 语句

continue 用于跳过本次循环。

break 和 continue 的区别

我们用考试在打比方,假设参加某种考试,考试分成 5 轮,当你到第三轮时,如果你用 break 语句,那么后面的 4,5 就都不参加了,而当你用 continue 时,仅跳过本轮(第 3 轮),后面的 4,5 轮依然要参加。

同时需要注意的是,在当前轮中,二者都是仅从存在 break 或者 continue 的地方开始不参加,在这两个语句之前执行的代码依旧正常执行。

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i=0;
  5. while(i<10)
  6. {
  7. i++;
  8. printf("%d ",i);
  9. if(i==2)
  10. {
  11. printf("跳过本次循环\n");
  12. continue;
  13. }
  14. printf("没有跳过\n");
  15. }
  16. }
  17. // 输出,可以看到第二轮执行了 continue,但也仅仅是从 continue 之后的代码才不执行,
  18. // printf("跳过本次循环\n"); 位于 continue 之前照样执行
  19. 1 没有跳过
  20. 2 跳过本次循环
  21. 3 没有跳过
  22. 4 没有跳过
  23. 5 没有跳过
  24. 6 没有跳过
  25. 7 没有跳过
  26. 8 没有跳过
  27. 9 没有跳过
  28. 10 没有跳过