注册 登录
编程论坛 C++教室

关于i=(++i)+(++i)+(++i)为什么等于7的个人理解

kenwong_bbs 发布于 2009-07-18 17:32, 1987 次点击
请直接看代码!

#include<iostream>
using namespace std;
int main()
{
    int i=0;
    i=(++i)+(++i)+(++i);
    //第一步:i=(++i)+(++i)+1    此时i=1
    //第二步:i=(++i)+2+1        此时i=2
    //第三步:i=(++i)+3            此时i=3
    //第四步:i=4+3                此时i=4
    //第五步:i=7
    cout<<i<<endl;
    return 0;
}
22 回复
#2
y_afu2009-07-18 18:25
这是什么逻辑啊,“第三步:i=(++i)+3   此时i=3” 。 这里要++i后i才等于3,怎么还没++i就等于3啦,我想这个表达式很大程度上和编译器有关。以我的理解是加法从左到右计算首先计算第一个加法的两个操作数所以先做两个++i,此时i=2,所以第一个加法的值等于4,编译器这时会为这个值分配一个临时存储空间放于活动记录表的临时变量区(请参考编译原理)然后再做第二个加法的两个操作数,第一个已经是4,第二个为++i做这个操作之前的i为2完成++i后i的值为3,所以第二个加法的值为4+3=7;
#3
niuyufeng2009-07-18 20:47
这个表达式很大程度上和编译器有关
#4
hhei2009-07-19 12:06
赞同,跟编译器有关,我用的是VS2005,结果是9
猜测是这样的,可能他是先给i连续做3 次++i
结果i=3,然后3个位置的i相加,就是9 了
#5
明次2009-07-19 14:28
结果是与编译器有关的,不同的编译器结果也会不同!
#6
hfdss2009-07-19 19:56
看到楼上的朋友们的解释,我就不用担心整天纠缠于这种题目了。
不知道这种题目是否有用否?也许可以写得更清晰一些。对吧?
#7
home582009-07-20 21:50
从来不对这种狗屁代码进行深究。
#8
home582009-07-20 21:53
5楼说得对,具体什么结果,还得问编译器。

脑子进水的人才会写出这种东西。
#9
yu5890681yu2009-07-22 15:25
回复 6楼 hfdss
呵呵 我感觉这种代码很锻炼程序员的思维 平时玩玩也好啊
#10
bmc2009-07-23 23:58
有点乱!
#11
y_afu2009-07-25 13:30
这种题目需要对编译原理的知识有所了解,编译行为取决于编译器,所以对这样的问题没必要深究。
#12
静☆2009-07-31 17:27
粗略看了一下给弄糊涂了,不过还是赞同从左往右计算。
#13
dracovash2009-07-31 18:30
考试出过这种题  我放弃了
#14
pokemonzj2009-07-31 22:49
回复 楼主 kenwong_bbs
我的运行结果也是7
^_^
#15
金多虾2009-08-04 05:39
理解就行了啊,编译器无所谓了吧!
#16
wywy7032009-08-04 09:18
纯粹是为了考试的代码,实际中谁会这样写,既有歧义,有不好整明白!
#17
zwei_02009-08-04 10:12
研究一下
#18
蓝色神话2009-08-04 11:59
又开始抽筋了!
#19
shangke2009-08-04 16:47
我感觉就是得7 我感觉应该没有别的答案吧????
#20
傻朋2009-08-04 20:37
这种代码根本没必要去钻 牛角尖
#21
我爱我家5212009-08-04 22:48
呵呵  新手 不太懂  我不说话  我就安静的看看
#22
我爱我家5212009-08-04 22:48
呵呵  新手 不太懂  我不说话  我就安静的看看
#23
shiweifu2009-08-05 22:11
程序代码:
    int i = 0;
004132DE  mov         dword ptr [i],0  
    i = (++i) + (++i) + (++i);
004132E5  mov         eax,dword ptr [i]  
004132E8  add         eax,1  
004132EB  mov         dword ptr [i],eax  ;i = 1
004132EE  mov         ecx,dword ptr [i]  
004132F1  add         ecx,1              
004132F4  mov         dword ptr [i],ecx  ;i = 2
004132F7  mov         edx,dword ptr [i]  
004132FA  add         edx,1  
004132FD  mov         dword ptr [i],edx  ;i = 3
00413300  mov         eax,dword ptr [i]  ;eax = 3
00413303  add         eax,dword ptr [i]  ;eax = eax + i
00413306  add         eax,dword ptr [i]  ;eax = eax + i
00413309  mov         dword ptr [i],eax  ;i = eax
所以i是9

以上是DEBUG版本的VC2008编译器的处理
1