| 本帖最后由 gaoyang9992006 于 2012-6-4 19:32 编辑 
 #include<stdio.h>
 void main(void)
 {
 int i;
 for(i=0;i<4;i++,printf("      %d\n",i))     //2
 printf("   i=%d",i);                               //1
 getchar();
 }
 /*
 
 执行的顺序是这样的:
 先对i赋值0,判断条件0<4,为真,执行printf()1,然后回到for执行i++,printf()2,这样i++后,再使用到的就是i=1,所以打印出来的是1,
 接下来进行i<4的判断,判断之后再执行printf()1,……,直到执行printf()1,i=3,然后 执行i++,printf()2,然后判断i<4,这时候i=4,4<4,
 为假,所以结束循环。
 可以看出,for循环的结构是先赋初值,然后判断初值,然后执行for之后的语句,然后回来改变变量,然后进行条件判断,然后决定是否执行后面的语句
 所以每个初级的for循环结束后的变量都是刚好不满足条件的一个数。这里的例子就是i==4.
 例程的打印如下:
 *******************************************************************************
 i=0     1
 i=1     2
 i=2     3
 i=3     4
 ********************************************************************************
 根据打印的结果我们可以得出上面所讨论的结论。
 大家会疑问--i与i--都是自减1,那么有什么不同之处呢,其中前者是减1之后立马应用,后者是先使用再减1,那么我们来举个例子吧。来看看,为何必须两者都要存在,存在就必须有它存在的道理。
 定义一个数组:
 
 array[8]={1,2,3,4,5,6,7,8};
 
 现在我们需要按照正序逐个输出到PORTD
 只需要
 unsigned char i;
 for(i=0;i<8;i++)
 {
 PORTD=array;
 }
 即可,我们分析该循环体,可以发现i执行到最后的结果是8,也就是,i最后自加到8判断条件不成立结束循环体。
 下面我们再试着写一个按照倒序输出的函数体
 unsigned char i;
 for(i=?1;i>?; )
 {
 PORTD=array;
 }
 大家认为条件里填写什么会合适呢,i=7;i>=0;i--
 这样合适吗?我告诉大家看着合适实际上是错误的,原因往上看,因为i==0后,i会继续执行,但是它不会是小于零的数字,而是255,也就是0xFF,因为我们定义了字符型变量i。当小于零后会循环到八位全部是1,
 那么怎么写这个循环体呢,这时候--i,就派上了用场了,正确的写法如下
 unsigned char i;
 for(i=8;i>0;)
 {
 PORTD=array[--i];
 }
 我们分析这次为什么对了,首先判断条件变化了,这次是要求i大于0,所以i最后的值为0,这是可以的,当i==1时候,条件成立,执行语句,这时候传递到语句的是--i,也就是传递的0;再次判断条件,发现0>0是假的,是骗人的,好了结束循环体。
 大家看到了吧,同样大家可以思考一下++的应用,在什么条件下能帮你写出高质量的代码?
 
 作者:gaoyang9992006
 
 
 */
 |