请教个i++的问题。

shifan3221 2012-12-19 10:00:23
main()
{
int i,a[10];
for(i=0;i<=9;)
{
a[i++]=i;
}
for(i=9;i>=0;i--)
{
printf("%d",a[i]);
}
}
为什么程序的输出是9876543210,而不是10987654321?
...全文
377 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
hbb1025 2012-12-20
  • 打赏
  • 举报
回复
新手,应该先去哪里学习呀
pubuzhixia 2012-12-20
  • 打赏
  • 举报
回复
i++为用后自增,不影响本次计算。赋值循环中,每次把i赋值给a[i]然后i自增,然后进入下一次赋值,直到i=9时,弄完a[9]=9时,i继续自增到10,for判断失败跳出循环。至此完成a[0]~a[9]的赋值。所以结果本来就是9876543210。 a[i++]=i; 完全等效于: a[i]=i; i++; 楼主的写法对于编译器应该不存在歧义,因为应该所有正常的编译器都认可如上的等效。 有争议的可能是: a[++i]=i; a[i]=++i;
proorck6 2012-12-20
  • 打赏
  • 举报
回复
看一看汇编代码,就明白了。
昵称不合法 2012-12-20
  • 打赏
  • 举报
回复
来晚了。。19L正解。
buringBlade 2012-12-20
  • 打赏
  • 举报
回复
楼主单步debug一下应该很容易看出来其中过程的
shifan3221 2012-12-20
  • 打赏
  • 举报
回复
嗯,谢谢各位。结贴。
  • 打赏
  • 举报
回复
引用 26 楼 shifan3221 的回复:
接上。。。 如 main() { int i =0,a; a = (i++)*i+6*(4*(i--))+6; printf("%d,%d\n",a,i); } 最后输出为a=6;i=0; 那么是不是说i--是用后自减。++i是用后自增,--i是用后自减呢? 请高手指点。
具体请参看副作用和顺序点,i++和i--这种情况在不同的编译器有时会有不同的结果 至于你举的这个例子,我只能说对于 a = (i++)*i+6*(4*(i--))+6;这是一个完整的表达式,一般一个完整的表达式属于一个顺序点,所以在执行这一整句之后,才执行i++和i--,而不是在执行了i++后i就加了1,所以才有楼主那个结果6. 更具体的,请参看C primer plus和本帖置顶这位大神的文章: [置顶] C,C++表达式求值顺序 裘老的解释。 [推荐]
pubuzhixia 2012-12-20
  • 打赏
  • 举报
回复
引用 27 楼 shifan3221 的回复:
说错了。 那么是不是说i--是用后自减。++i是自增后用,--i是自减后用呢? 请高手指点。
i++,先让i参与表达式中的计算,再自增。 ++i,先让i自增,自增的结果再参与表达式的计算。 比如, i=5; j=i++; //执行后j=5 a=5; b=++a; //执行后b=6 至于同一个表达式中有多个++,可能需要考虑编译器的执行顺序等因素。
赵4老师 2012-12-20
  • 打赏
  • 举报
回复
引用 14 楼 shifan3221 的回复:
引用 9 楼 zhao4zhong1 的回复:引用 8 楼 yxs650203 的回复:LZ的意思好像是问i++为什么没有加上去,大家好像答非所问 无汇编,无真相。 汇编还不会啊。并且我用的是vs2010,看内存和寄存器的变化也不会。 我看这种情况我还是先记忆一下吧。
VC调试时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
shifan3221 2012-12-20
  • 打赏
  • 举报
回复
说错了。 那么是不是说i--是用后自减。++i是自增后用,--i是自减后用呢? 请高手指点。
shifan3221 2012-12-20
  • 打赏
  • 举报
回复
接上。。。 如 main() { int i =0,a; a = (i++)*i+6*(4*(i--))+6; printf("%d,%d\n",a,i); } 最后输出为a=6;i=0; 那么是不是说i--是用后自减。++i是用后自增,--i是用后自减呢? 请高手指点。
shifan3221 2012-12-20
  • 打赏
  • 举报
回复
引用 23 楼 pubuzhixia 的回复:
i++为用后自增,不影响本次计算。赋值循环中,每次把i赋值给a[i]然后i自增,然后进入下一次赋值,直到i=9时,弄完a[9]=9时,i继续自增到10,for判断失败跳出循环。至此完成a[0]~a[9]的赋值。所以结果本来就是9876543210。 a[i++]=i; 完全等效于: a[i]=i; i++; 楼主的写法对于编译器应该不存在歧义,因为应该所有正……
用后自增,不影响本次计算 我的理解为i++在一个语句当中,不管参加了什么运算,包括赋值等,都是要先用,等语句结束后再作自增。 按照这个理解下去。++i应该是用后自增,为什么会存在歧义呢?
LheroPfire 2012-12-19
  • 打赏
  • 举报
回复
LZ的意思好像是问i++为什么没有加上去,大家好像答非所问
赵4老师 2012-12-19
  • 打赏
  • 举报
回复
VC调试时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
shifan3221 2012-12-19
  • 打赏
  • 举报
回复
引用 5 楼 dream_server 的回复:
main() { int i,a[10]; for(i=0;i<=9;) { a[i++]=i;// 改:a[i] = ++i;你可以试下 } for(i=9;i>=0;i--) { printf("%d",a[i]); } }
你这个写法不对。你这样写的话相当于没有对a[0]进行赋值,会输出一个随机数的。
ImportantPerson 2012-12-19
  • 打赏
  • 举报
回复
main() { int i,a[10]; for(i=0;i<=9;) { a[i++]=i;// 改:a[i] = ++i;你可以试下 } for(i=9;i>=0;i--) { printf("%d",a[i]); } }
shifan3221 2012-12-19
  • 打赏
  • 举报
回复
嗯,似乎编译器理解为a[i++]=i等效于a[i]=i;i++;。
lilianjie001 2012-12-19
  • 打赏
  • 举报
回复
因为你里面存的数据位0123456789,而你输出的时候是倒序输出的。 自己调试一下不就明白了吗。不建议这么个写法。
jiuchang 2012-12-19
  • 打赏
  • 举报
回复
最好不要写这种代码,要把i++提到for语句中写
东大坡居士 2012-12-19
  • 打赏
  • 举报
回复
亲,看编译器咋解析噢! 不过看这种混淆的代码没有啥意思噢!
加载更多回复(11)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧