难点:循环的嵌套常见问题,break;和continue;的区别例题
1.单个for循环的使用
for(1;2;3)
语句A;
执行的流程:1→2,如果不成立(假)就跳出循环,如果成立(真)就语句A→3。然后开始第二轮循环,就直接3的值给2判断,如果不成立(假)就跳出循环,如果成立(真)就语句A→3。……依次这样循环。
Tips:需要特别注意表达式3是先执行循环体了再执行的。
2.多个for循环的使用( 外循环控制单个语句 )
for(1;2;3) //1
for(4;5;6) //2
语句A; //3
语句B; //4
解释:整体上有2个语句,//1,//2,//3是第一个语句,//4是第二个语句。第一个for控制的语句是第二个for(即//2和//3)为整体,第二个for控制//3行。
执行流程:内循环完毕再进行外循环。具体流程:首先2对1进行判断,如果成立,则4给5进行判断,如果成立则执行语句A,然后6,然后5,然后语句A,然后6,然后5这样一直循环……直到在5的时候判断不成立就回到第一个for语句的3,再2,如果成立就4,再5,这样一直循环……直到不成立就回到第一个for,如果第一个for的2也不成立则跳出控制的循环,开始执行语句B。
Q:为什么B不算在第二个的语句呢?
A:因为循环跟选择语句if一样只控制一个语句(花括号阔起来的多个语句算一个语句块,i.e一个语句),语句A和语句B没有用花括号阔起来,所以只控制语句A。
3.多个for循环的使用( 外循环控制多个语句 )
for(1;2;3){ //1
for(4;5;6) //2
语句A; //3
语句B; //4 }
语句C; //5
解释:整体上有2个语句。//1,//2,//3,//4是第一个语句,//5是第二个语句。第一个for控制的语句是//2,//3,//4;第二个for控制的是//3。
执行流程:内循环完毕再进行外循环。具体流程:首先2对1进行判断,如果成立,则4给5进行判断,如果成立则执行语句A,然后6,然后5,然后语句A,然后6,然后5这样一直循环……直到在5的时候判断不成立就开始执行语句B,再3,再2进行判断,如果成立就4,再5,这样一直循环……直到如果第一个for的2也不成立则跳出控制的循环,执行语句C。
例题1:输出九九乘法表
答案:
1 # include <stdio.h> 2 # include <math.h> 3 int main(){ 4 int i, j; 5 for (i = 1;i <= 9; i++){ 6 for (j = 1; j <= i; j++) 7 printf("%d*%d=%d\t", j, i, i * j); 8 printf("\n"); 9 } 10 return 0; 11 }
运行结果:

解析:\t是水平制表(相当于一个Tab=4个空格,一般用于数据对其)。
例题2:

答案:

解析:需要注意的是:内循环for语句中表达式1中没有给n赋值。这个n是外面定义的,所以外循环执行内循环时,n始终还是一直在加。j表达式1中定义了的,外循环到内循环首先 j 就变成了1。

例题3:

Q:break;continue;的区别?
A:break;是提前终止循环(直接跳出了,表达式3不执行,直接执行该循环以外的语句;break;只能用于循环语句和switch语句),continue;是结束结束本次循环(即表达式3都还是会执行)。break;是直接跳出整个循环,表达式3啥的都不执行了。continue;相当于结束了这个花括号内continue;后面的循环体语句了,表达式3还是会执行的。
Q:第三行为什么空白?第四行不应该在第三行吗?
A:当执行第二排10那个数字的时候 j=5,n=9。光标是在10的后面的,没有在下一排。然后回到for的表达式3,好了,j变成了6,n变成了10。表达式2进行判断,为假。
开始执行外循环,i=3,j=1,n还是等于10。然后表达式2判断,为真,从原先光标在第二排那个10后面,换到了下一行。然后if进行判断,为真,执行break;跳出了内循环。
又一轮外循环:i=4,j=1,n还是等于10,因为上面它跳过了直接break;内循环,n是没有进行再自加的。所以在第一个if语句中,又执行换行\n
例题4:


浙公网安备 33010602011771号