for循环语句头的执行顺序

来源:互联网 发布:wine源码安装 编辑:程序博客网 时间:2024/05/16 13:06

算是温习吧。问题比较基础,但是也比较重要。

for循环可以说在每个程序中都少不了的,语句头包括三个部分:初始化,判读条件,一个表达式。

但是这三个部分的执行顺序是什么,这是我们所关心的,也是本文所要讨论的。

下面先看一段简单的代码。

[cpp] view plain copy
  1. #include <stdio.h>  
  2.   
  3. int main()  
  4. {  
  5.     int x, a;  
  6.       
  7.     for (x=0,a=0; a<=1 && !x++; a++)  
  8.     {  
  9.         a++;  
  10.     }  
  11.       
  12.     printf("%d", a);  
  13.     return 0;  
  14. }  

代码很简单,可是打印结果呢?

有的朋友可能会想当然的认为,  打印结果是1.

可是,真的是1吗?   复制到编译器上跑跑,奇迹般的发现,其实是2.

下面就分析下这简单代码。


第一步:初始化定义,x = 0, a = 0;

第二步:a小于1, x 的非为1,符合循环条件

第三步:x++后x自增为1.

第四步:进入循环体,a++,a自增为1.

第五步:执行循环语句头中的a++,a自增为2.

第六步:执行循环语句头的判读条件,a=2>1,故不满足,不执行循环语句。

第七步:打印a的值为2.


怎么样,现在豁然开朗了吧。(如果还是不懂...那就抱歉了。)


从这个例子,我们可以得出如下结论:

执行顺序是:初始化--判断--函数体——然后for循环的第3句--判断——函数体---for循环的第三句--判断……


下面解答几点疑惑:

1、第一次例如初始化i=0,是否还执行后面的i++或++i?

第一次先初始化,然后判断,i++就不执行了

2、第一次完了以后,初始化这句就不用了,是先执行i++还是限制性判断语句呢?

先执行i++

3、现在知道是先执行i++,再执行判断语句,i++不是后++吗,例如i为1,那i++后执行判断语句,i是几呢?

i是2.

4、好像i++和++i在for()里时结果都一样。

都一样,for语句头的执行顺序决定了这两个写法都一样,都是i++或这++i这两句执行完了再进行判断,此时(两种情况)i已经加1了。


分析了这么多,相信大家也都懂了。

留个经典的例子,让大家自己去分析吧。

[cpp] view plain copy
  1. #include <stdio.h>  
  2.   
  3. int main( )  
  4. {  
  5.     int i = 0, j = 10;  
  6.     for(i=0; i<j; i++,j--)  
  7.     {  
  8.         if(j==10)  
  9.         {  
  10.             printf("%d,%d ",i,j);  
  11.             j--;  
  12.         }  
  13.         j++;  
  14.     }  
  15.     printf("%d,%d ",i,j);  
  16.     return 0;  
  17. }  

打印结果:

0,10 9,9 

如果不懂的,可以参照下面这个对上述例子逐句打印的例子,应该会有助于理解。

[cpp] view plain copy
  1. #include <stdio.h>  
  2.   
  3. int print1(int i,int j)  
  4. {  
  5.     printf("执行判断条件,i=%d,j=%d \n",i,j);  
  6.     return 1;  
  7. }  
  8.   
  9. int main( )  
  10. {  
  11.     int i = 0, j = 10;  
  12.       
  13.     for(i=0;((print1(i,j)) && (i<j));  
  14.         i++,j--,printf("执行for()中的第三个语句,i=%d,j=%d \n",i,j))  
  15.     {  
  16.         if(j==10)  
  17.         {  
  18.             printf("%d,%d ",i,j);  
  19.             j--;  
  20.         }  
  21.         j++;  
  22.         printf("执行for循环体中的最后一句,i=%d,j=%d\n ",i,j);  
  23.     }  
  24.     printf(" %d,%d ",i,j);  
  25.     return 0;  
  26. }  

打印结果:

执行判断条件,i=0,j=10 

0,10 执行for循环体中的最后一句,i=0,j=10

 执行for()中的第三个语句,i=1,j=9 

执行判断条件,i=1,j=9 

执行for循环体中的最后一句,i=1,j=10

 执行for()中的第三个语句,i=2,j=9 

执行判断条件,i=2,j=9 

执行for循环体中的最后一句,i=2,j=10

 执行for()中的第三个语句,i=3,j=9 

执行判断条件,i=3,j=9 

执行for循环体中的最后一句,i=3,j=10

 执行for()中的第三个语句,i=4,j=9 

执行判断条件,i=4,j=9 

执行for循环体中的最后一句,i=4,j=10

 执行for()中的第三个语句,i=5,j=9 

执行判断条件,i=5,j=9 

执行for循环体中的最后一句,i=5,j=10

 执行for()中的第三个语句,i=6,j=9 

执行判断条件,i=6,j=9 

执行for循环体中的最后一句,i=6,j=10

 执行for()中的第三个语句,i=7,j=9 

执行判断条件,i=7,j=9 

执行for循环体中的最后一句,i=7,j=10

 执行for()中的第三个语句,i=8,j=9 

执行判断条件,i=8,j=9 

执行for循环体中的最后一句,i=8,j=10

 执行for()中的第三个语句,i=9,j=9 

执行判断条件,i=9,j=9 

 9,9