while 循环
while 循环先判断,再执行循环体
#include <stdio.h>int main(){int i = 10;while(i>10){printf("%d ",i);i++;}}// 输出什么也不输出,因为先执行 i 是否大于 10 的判断,但并不大于 10 ,所以不执行循环体
do while 循环
#include <stdio.h>int main(){int i = 10;do{printf("%d ",i);i++;}while(i>10);}// 输出这是一个从 10 到 +∞ 的无限循环// 可以看到先执行 printf 和 i++ 的操作后,满足了判断条件 i>10
for 循环
逗号运算符
逗号运算符的优先级是所有运算符中最低的,且采用从左向右结合的方式
for 的格式
for(表达式1;表达式2;表达式3){// 执行代码}// 其中表达式并非只能一个语句,可以是多个语句,用逗号隔开// 1. 表达式 1 只在第一次初始化时存在,之后的循环将只受限于表达式 2,3
#include <stdio.h>int main(){int i,j;for(i=1,j=i+1;i<20;i++){printf("i=%d,j=%d\n",i,j);}}// 输出,可以看到 j 的值没有变,因为表达式 1 只在第一次时使用i=1,j=2i=2,j=2i=3,j=2i=4,j=2i=5,j=2i=6,j=2i=7,j=2i=8,j=2i=9,j=2i=10,j=2i=11,j=2i=12,j=2i=13,j=2i=14,j=2i=15,j=2i=16,j=2i=17,j=2i=18,j=2i=19,j=2
break 语句
break 用于跳出当前循环体的所有循环,即即使后面还有循环,也不再执行,这点和 continue 要区分
#include <stdio.h>int main(){int i=1;while(1){i++;printf("%d ",i);if(i==20) break;}}// 输出,这本来是一个无限循环,但是设置了 i == 20,跳出所有循环2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
note
- 对于嵌套循环来说(不管是 while,do while 还是 for),break 都只能跳出一个循环范围,比如有一个两层嵌套的结构,break 位于最里面,那么 break 只能跳出最里面的循环,外层循环体依旧执行。
#include <stdio.h>int main(){int i=0,j=0;while(i<20){while(j<5){if(j==3) break;printf("i=%d,j=%d\n",i,j);j++;}j=0;i++;}}// 输出,可以看到所有循环中,只有内层循环当 j == 3时,跳出,不在执行 j==4 和 j==5// 但 i 的每一次循环都执行i=0,j=0i=0,j=1i=0,j=2i=1,j=0i=1,j=1i=1,j=2i=2,j=0i=2,j=1i=2,j=2i=3,j=0i=3,j=1i=3,j=2i=4,j=0i=4,j=1i=4,j=2i=5,j=0i=5,j=1i=5,j=2i=6,j=0i=6,j=1i=6,j=2i=7,j=0i=7,j=1i=7,j=2i=8,j=0i=8,j=1i=8,j=2i=9,j=0i=9,j=1i=9,j=2i=10,j=0i=10,j=1i=10,j=2i=11,j=0i=11,j=1i=11,j=2i=12,j=0i=12,j=1i=12,j=2i=13,j=0i=13,j=1i=13,j=2i=14,j=0i=14,j=1i=14,j=2i=15,j=0i=15,j=1i=15,j=2i=16,j=0i=16,j=1i=16,j=2i=17,j=0i=17,j=1i=17,j=2i=18,j=0i=18,j=1i=18,j=2i=19,j=0i=19,j=1i=19,j=2
continue 语句
continue 用于跳过本次循环。
break 和 continue 的区别
我们用考试在打比方,假设参加某种考试,考试分成 5 轮,当你到第三轮时,如果你用 break 语句,那么后面的 4,5 就都不参加了,而当你用 continue 时,仅跳过本轮(第 3 轮),后面的 4,5 轮依然要参加。
同时需要注意的是,在当前轮中,二者都是仅从存在 break 或者 continue 的地方开始不参加,在这两个语句之前执行的代码依旧正常执行。
#include <stdio.h>int main(){int i=0;while(i<10){i++;printf("%d ",i);if(i==2){printf("跳过本次循环\n");continue;}printf("没有跳过\n");}}// 输出,可以看到第二轮执行了 continue,但也仅仅是从 continue 之后的代码才不执行,// printf("跳过本次循环\n"); 位于 continue 之前照样执行1 没有跳过2 跳过本次循环3 没有跳过4 没有跳过5 没有跳过6 没有跳过7 没有跳过8 没有跳过9 没有跳过10 没有跳过
