c语言中的自增问题

ora-0600 2010-04-13 01:17:13
# include "stdio.h"
void main( )
{ int i,k;

i=3;
k=(++i)+(++i)+(++i);
printf("i=%d\tk=%d\n",i,k);
}
为什么结果是i=6 k=16???
...全文
119 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
xrayseven 2010-04-13
  • 打赏
  • 举报
回复
好贴。
hxb3530 2010-04-13
  • 打赏
  • 举报
回复
这种问题是取决于编译器的,不同的编译器可能结果不同,,,不要为这些无聊的问题而烦恼
aichongqu 2010-04-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 shmiluwabi666 的回复:]

这种题不要讨论了

结果依赖编译器是怎么计算的
[/Quote]
本来以为K应该是15,看到下面的回帖,我发现自己太自以为是了。确实和编译器有很大关系啊
阿磊2013 2010-04-13
  • 打赏
  • 举报
回复
我承认,我这两天确实长见识了
huanmie_09 2010-04-13
  • 打赏
  • 举报
回复
看编译器对应的汇编码,这种东西跟编译器的实现有关的。
vs 2008下对应的汇编码为:

i=3;
0041357E mov dword ptr [i],3
k=(++i)+(++i)+(++i);
00413585 mov eax,dword ptr [i]
00413588 add eax,1
0041358B mov dword ptr [i],eax
0041358E mov ecx,dword ptr [i]
00413591 add ecx,1
00413594 mov dword ptr [i],ecx
00413597 mov edx,dword ptr [i]
0041359A add edx,1
0041359D mov dword ptr [i],edx
004135A0 mov eax,dword ptr [i]
004135A3 add eax,dword ptr [i]
004135A6 add eax,dword ptr [i]
004135A9 mov dword ptr [k],eax

运行结果为:
i=6 k=18
jeak123 2010-04-13
  • 打赏
  • 举报
回复
我这结果也是i = 6, k = 15.
ACE1985 2010-04-13
  • 打赏
  • 举报
回复
Dev-C++和VC++ 6.0的结果是i=6, k=16,编译器应该是先计算出(++i)+(++i),而且是先对i进行两次自增后才进行相加,即5+5=10,然后10再和(++i)相加的16;
而在VS2008中,编译器可能是直接先对i进行3次自增操作后才实现加法操作,6+6+6自然等于18了;
不同编译器结果不一致,因此这种用法应该尽量避免.
bobo364 2010-04-13
  • 打赏
  • 举报
回复
早上刚有,下午又有了,这个gcc和vc 6.0完全不同,涉及编译器的代码优化,讲编译原理是就得用这样的代码,要细究还是看汇编
柯本 2010-04-13
  • 打赏
  • 举报
回复
又见++,那月什么贴,总是有人研究
一句话"编译器相关"
fwp20033191606 2010-04-13
  • 打赏
  • 举报
回复
这是依赖你所用的编译器哈
icegrue 2010-04-13
  • 打赏
  • 举报
回复
哈哈,楼上是高人啊
icegrue 2010-04-13
  • 打赏
  • 举报
回复
- -杯具了,我用G++编译是16..不过编译有警告,提示i可能未定义
rtygbwwwerr 2010-04-13
  • 打赏
  • 举报
回复
++i :前缀自增操作符,先返回i+1的值,再将i增加1。由于三个++i改变了i的值,所以该表达式实际应为
k=(++i)+(++i)+(++i) =>k=(i + 3)+ (i + 3) + (i + 3) = 6 + 6 + 6
所以应该i = 6;k = 18(编译器:vs2008)
注意上述结果编译器相关,不同的编译器会得出不同的结果,建议楼主最好不要在右值表达式中包含能够改变变量值的表达式。
wangbinykit 2010-04-13
  • 打赏
  • 举报
回复
这种题不要讨论了

结果依赖编译器是怎么计算的
Amber小雅 2010-04-13
  • 打赏
  • 举报
回复
我在unix下算的cc编译~~
icegrue 2010-04-13
  • 打赏
  • 举报
回复
乱七八糟的..怎么会出现18
icegrue 2010-04-13
  • 打赏
  • 举报
回复
18!!! - -
Amber小雅 2010-04-13
  • 打赏
  • 举报
回复
我这结果也是i = 6, k = 15.
icegrue 2010-04-13
  • 打赏
  • 举报
回复
汗,用VS2005 k=18
icegrue 2010-04-13
  • 打赏
  • 举报
回复
k=15我这的结果,i=6(3次自增)

69,371

社区成员

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

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