打印

作为老菜鸟,我要给小菜鸟好好显摆显摆for循环与++的妙处

[复制链接]
2427|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gaoyang9992006|  楼主 | 2012-5-31 19:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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


*/

相关帖子

沙发
gaoyang9992006|  楼主 | 2012-5-31 19:47 | 只看该作者
显然如果我们要在for后面的语句中加入break;跳出循环的条件,就可以根据for的变量 i 是否成功在条件上为假,上面的例子变化成
for(i=0;i<4;i++)
{
……
……
if(……) break;
……
}

if(i==4) ……

使用特权

评论回复
板凳
gaoyang9992006|  楼主 | 2012-5-31 19:48 | 只看该作者
是不是有个别人只是会用for,但是不知道for的具体流程啊?O(∩_∩)O哈哈~,高手不要出来笑话我了,我只是个老菜鸟

使用特权

评论回复
地板
kmani| | 2012-5-31 20:52 | 只看该作者
嘿嘿,我前几天菜农明白的

使用特权

评论回复
5
zb0830| | 2012-5-31 21:37 | 只看该作者
呵呵,很好,学习了。

使用特权

评论回复
6
TI_MCU| | 2012-6-1 09:50 | 只看该作者
感谢楼主分享!

个人也提个建议,楼主只是为了证明for的工作机制。for中间第三个条件尽量不要做改变i以外的其它事情,这样有利于编译器的优化。

for(i=0;i<4;i++,printf("XXX"));
写成
for(i=0;i<4;i++)printf("XXX");
更容易被编译器优化

使用特权

评论回复
7
gaoyang9992006|  楼主 | 2012-6-1 13:13 | 只看该作者
6# TI_MCU
我只是为了证明for都工作机制,才这那里加啦一条printf,是为了跟下面都对比,我已经标注啦1和2

使用特权

评论回复
8
gaoyang9992006|  楼主 | 2012-6-1 13:15 | 只看该作者
6楼说的很是,我这for里加printf只是为了证明for都机制,大家写程序时候了解就行啦,别学我那么写啊。

使用特权

评论回复
9
zhaofy521| | 2012-6-1 18:35 | 只看该作者
YY无极限

使用特权

评论回复
10
daisyly| | 2012-6-1 21:37 | 只看该作者
小菜鸟感谢老菜鸟。:lol

使用特权

评论回复
11
范范1214| | 2012-6-5 19:41 | 只看该作者
学过c语言都应该懂吧!

使用特权

评论回复
12
czdo| | 2012-6-5 20:53 | 只看该作者
:)支持这样的显摆!!!当然拿出点创新啊

使用特权

评论回复
13
爱在2012| | 2012-6-5 22:56 | 只看该作者
留印慢慢看。

使用特权

评论回复
14
拿起书本| | 2012-6-5 23:32 | 只看该作者
希望这样的贴子能多发点,学习了,谢谢楼主。

使用特权

评论回复
15
hobbye501| | 2013-9-27 08:42 | 只看该作者
看的出来 版主很善于思考问题并能拿出有效的解决办法!这点是很多人做不到的

使用特权

评论回复
16
e08610318| | 2013-9-27 11:43 | 只看该作者
同为老菜鸟的我,以前也不太明白,后来是调试程序时知道的。其实以前看课本时也说过,不过后来忘了

使用特权

评论回复
17
i1mcu| | 2013-9-28 11:32 | 只看该作者
学习学习的。

使用特权

评论回复
18
i1mcu| | 2013-9-28 11:33 | 只看该作者
一般不是太注意这些的。

使用特权

评论回复
19
dianzijiangren| | 2013-9-29 16:29 | 只看该作者
YY无极限

使用特权

评论回复
20
zezy371| | 2013-9-30 20:37 | 只看该作者
unsigned char i;
for(i=?1;i>?; )
{
PORTD=array;
}
大家认为条件里填写什么会合适呢,i=7;i>=0;i--
这样合适吗?我告诉大家看着合适实际上是错误的,原因往上看,因为i==0后,i会继续执行,但是它不会是小于零的数字,而是255,也就是0xFF,因为我们定义了字符型变量i。当小于零后会循环到八位全部是1,

记得有一次,我也是写成了这样的在调试时没有调试出想要的结果,弄了好半天才查出是i>=0的原因
当时我就是写的 for(i=7;i>=0;i--){ ; }

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:西安公路研究院南京院
简介:主要工作从事监控网络与通信网络设计,以及从事基于嵌入式的通信与控制设备研发。擅长单片机嵌入式系统物联网设备开发,音频功放电路开发。

1958

主题

15904

帖子

207

粉丝