#include<stdio.h>
void main()
{
int i=3,j;
j=(++i)+(++i)+(++i);
printf("%d\n",j);
}
为什么j为16啊?讲一下求解过程。
#include<stdio.h>
void main()
{
int i=3,j;
j=(++i)+(++i)+(++i);
printf("%d\n",j);
}
为什么j为16啊?讲一下求解过程。
我在自己机器上实验过了,运行结果的确是16.
我试着解释一下,不知道是不是这样,供楼主【参考】。
首先,(++i)+(++i ),第一次++i,值为4(第一个加数增加1);第二次++i,值为5(第二个加数自加1);此时注意了,第二个加数的自加同时影响第一个加数,因为都是i,储存在同一个单元,所以(++i)+(++i )的结果是5+5,为10;此时10储存在内存单元,不自加,而++i再次自加,为6。所以,最后结果为10+6=16.
【PS】:谢谢四楼的同志“77086959”7对我的想法的验证。
第一个++i执行完后并没有马上使用,等到两个++i相加的时候才使用它的值,这时候两个i都是5
正解 按照他的思路 下面的程序应该输出13
#include<iostream> using namespace std; int main() { int i=3,j=0; j=(++i)+(i++)+(++i); printf("%d\n",i); printf("%d\n",j); return 1; }
不同编译器对++或者--的处理不同~
以VC6.0
编译器做如下处理得到16
mov eax,dword ptr [ebp-4] add eax,1 mov dword ptr [ebp-4],eax mov ecx,dword ptr [ebp-4] add ecx,1 两次自加得到5
mov dword ptr [ebp-4],ecx mov edx,dword ptr [ebp-4] add edx,dword ptr [ebp-4] 自生相加EDX得到10但是i为5 mov eax,dword ptr [ebp-4] 将i的值传到EAX add eax,1 EAX+1得到6 mov dword ptr [ebp-4],eax i现在是6 add edx,dword ptr [ebp-4] 与EDX中的10相加 mov dword ptr [ebp-8],edx 最终得到16