(++i)+(++i)+(++i)

ningweidong 2008-03-29 02:30:48
int i = 2;
x=(++i)+(++i)+(++i);
我的理解是x=5+4+3;
我觉得应该是12才对,为什么结果出来是13?
我用的是VC编译的,请问中间的过程是什么?
...全文
409 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
小小阿狸 2011-10-08
  • 打赏
  • 举报
回复
丫丫滴 我们考试就靠这样让人蛋疼的题目!!!!!!
yangdoing 2008-03-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 laolaoliu2002 的回复:]
无聊的问题.谁程序里面写出这种东西,就一个词"开除"
[/Quote]
哈哈哈,说的对,不过这种题在面试里面经常会出,学习C语言的时候也是必有的.
Soulic 2008-03-31
  • 打赏
  • 举报
回复
没有确定的求值顺序,结果是什么是由编译器确定的
huotom 2008-03-31
  • 打赏
  • 举报
回复
好像没什么,有点无聊
homesos 2008-03-31
  • 打赏
  • 举报
回复
在弄清楚所谓的无聊问题的答案过程中,更深层次地理解底层的处理过程,从而写出更加自信的代码,不但会写也会向他人描述其中的处理过程,提前规避可能出现的错误。

建议LZ可以看一下汇编中基本运算的知识,有助于分解高级语言中的表达式运算过程。

汇编代码中的问题我已经发消息给你了,如果解释的不清楚,你可以向其他高手请教一下。
stude 2008-03-30
  • 打赏
  • 举报
回复
刚学c时 用的是TC结果是12 4+4+4
夜雨_倚琴 2008-03-30
  • 打赏
  • 举报
回复
未定义行为.这个就是答案
zenny_chen 2008-03-30
  • 打赏
  • 举报
回复
各人认为即使是这样无聊的问题也应该在标准里说明清楚。
不过GCC的结果也是13,4+4+5。

这个homesos分析地正确。
vegas 2008-03-30
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 mengjunyi 的回复:]
这种题只会出现在无聊的笔试题中...
[/Quote]同意
lunarfan 2008-03-29
  • 打赏
  • 举报
回复
dev c++也是13
mengjunyi 2008-03-29
  • 打赏
  • 举报
回复
这种题只会出现在无聊的笔试题中...
NOW2008 2008-03-29
  • 打赏
  • 举报
回复
何必去钻牛角呢?
实际应用不可能出现的事。
houdongfeng 2008-03-29
  • 打赏
  • 举报
回复

int i = 2;
x=(++i)+(++i)+(++i);
=>
int i = 2;
i = i + 1;//3
i = i + 1;//4
tmp = i + i;//4+4=8
i = i + 1;//5
x = tmp + i;//8 + 5 = 13
treeheni 2008-03-29
  • 打赏
  • 举报
回复
lz的精神很诡异~~~我看到这个都蒙了
_printf 2008-03-29
  • 打赏
  • 举报
回复
...自增,自减里面,1条语句里面不要出现对同一个变量多次操作,会造成编译器犯傻的!值是不确定的!
MagiSu 2008-03-29
  • 打赏
  • 举报
回复
谁问这种问题,抽两耳光先!
ttkk_2007 2008-03-29
  • 打赏
  • 举报
回复
这样的问题你就不要研究了,你换个编译器还能得到另外的结果呢
homesos 2008-03-29
  • 打赏
  • 举报
回复
请参考VC6.0下反汇编代码(不同编译选项不同,仅参考)

//i + 1
00401044 8B 45 F0 mov eax,dword ptr [ebp-10h]
00401047 83 C0 01 add eax,1
0040104A 89 45 F0 mov dword ptr [ebp-10h],eax
//i + 1
0040104D 8B 4D F0 mov ecx,dword ptr [ebp-10h]
00401050 83 C1 01 add ecx,1
00401053 89 4D F0 mov dword ptr [ebp-10h],ecx
//i+i,暂存于edx寄存器中
00401056 8B 55 F0 mov edx,dword ptr [ebp-10h]
00401059 03 55 F0 add edx,dword ptr [ebp-10h]
//i+1
0040105C 8B 45 F0 mov eax,dword ptr [ebp-10h]
0040105F 83 C0 01 add eax,1
00401062 89 45 F0 mov dword ptr [ebp-10h],eax
//edx+i,(相当于表达式中的i+i+i)
00401065 03 55 F0 add edx,dword ptr [ebp-10h]
00401068 89 55 EC mov dword ptr [ebp-14h],edx
homesos 2008-03-29
  • 打赏
  • 举报
回复
不同的编译器结果不同,如果编译选项不同结果也不尽相同,VC如下:


int i = 2;
x=(++i)+(++i)+(++i);
=>
int i = 2;
i = i + 1;//3
i = i + 1;//4
tmp = i + i;//4+4=8
i = i + 1;//5
x = tmp + i;//8 + 5 = 13
zzwh_0 2008-03-29
  • 打赏
  • 举报
回复
这与编译器有关。vc实现如下:
i先自增两次变为4,然后执行加法操作得8,i自增变为5,再加法操作得13.
加载更多回复(3)

70,023

社区成员

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

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