高手来看下i++问题

来源:百度知道 编辑:UC知道 时间:2024/07/03 12:46:04
int i=2,j=0;
j=(++i)+(++i);
cout<<j<<endl;
j怎么会等于8
在vc6.0中调试
首先说一点 不要说是两个i都自加后i等于4,然后两个++i相加等于8,因为
如果是(++i)+(++i)+(++i) 结果是13
如果是(++i)+(++i)+(++i)+(++i) 结果是19
如果是(++i)+(++i)+(++i)+(++i)+(++i) 结果是26
所以上面那种说法说不过去 也别说两个相加是特殊情况
结果会不会和内存关联有关系
这个问题是三年前在大学时候提的,以现在的标准看,针对这个问题,各个编译器在实现的时候就已经有区别了,所以在学习和世界工作中尽量应该避免这中写法,由于编译器实现的不统一,这种写法不可能完全按照语法的规定去执行,因此,这种问题还是需要在实际情况中规避。希望能给别人点提示。

不考试的话不用扣这么细吧```
不知不觉上你当了``
(++i)+(++i)=7
3个(++i)=12
4个(++i)=18
。。。。。
以上答案是我在编译器上运行的`你可别说我错了
不管++ -- 先左还是先右一样道理么
(++i)+(++i) 先算右边(++i)i=3 再左边i=4
第一个答案就当我凑了``

首先声明一下,这种写法在编写程序中是不规范的!!
所有考试和教学中出现的这些表达式都在误导大家……
每个编译器都有自己的计算方式……
打开VC6的汇编器,有

9: int i=2,j=0,z=0;
mov dword ptr [ebp-4],2
mov dword ptr [ebp-8],0
mov dword ptr [ebp-0Ch],0

10: j=(++i)+(++i);
;eax=i|i=2
mov eax,dword ptr [ebp-4]
;eax++|i=2
add eax,1
;i=eax|i=3
mov dword ptr [ebp-4],eax;
;ecx=i|i=3
mov ecx,dword ptr [ebp-4]
;ecx++
add ecx,1
;i=ecx|i=4
mov dword ptr [ebp-4],ecx
;edx=i|i=4
mov edx,dword ptr [ebp-4]
;edx+=i|i=4,edx=8
add edx,dword ptr [ebp-4]
;j=edx
mov dword ptr [ebp-8],edx

11: i=2;
mov dw