Re: [cpp]很基础的问题,请高手解答

li guojian guojianlee at gmail.com
Fri Dec 15 12:03:48 CST 2006


On 12/14/06, Science <gis at 126.com> wrote:
> int i = 1;
> int j = (++i) + (++i) + (++i);
> cout << j << endl;
> 为什么j输出10?
>
> int i = 1;
> int j = (i++) + (i++) + (i++);
> cout << j << endl;
> 为什么输出3?
>
> 以上都是在VC6+SP6环境
>
>
>
vc6+sp6环境下生成的汇编
6:    int i = 1;
00401578   mov         dword ptr [ebp-4],1
7:    int j = (++i) + (++i) + (++i);
0040157F   mov         eax,dword ptr [ebp-4]
00401582   add         eax,1
00401585   mov         dword ptr [ebp-4],eax
                                  ///i++;
00401588   mov         ecx,dword ptr [ebp-4]
0040158B   add         ecx,1
0040158E   mov         dword ptr [ebp-4],ecx
                                   //i++;
00401591   mov         edx,dword ptr [ebp-4]
                                     ///int c=i;
00401594   add         edx,dword ptr [ebp-4]

                                  //     c+=i;
00401597   mov         eax,dword ptr [ebp-4]
0040159A   add         eax,1
0040159D   mov         dword ptr [ebp-4],eax
                                  //i++;
004015A0   add         edx,dword ptr [ebp-4]
                                /// c+=i;
004015A3   mov         dword ptr [ebp-8],edx
                                 // j=c;
///////////
综上所诉
int j = (++i) + (++i) + (++i);被编译成:
/////
int j;
i++;
i++;
int c=i;
c+=i;
i++;
c+=i;
j=c;
所以结果j=10
具体的原因是:在语句中,++i,i++,是复合的运算,就象a+b+c,也是复合运算
会被编译成多个句子,具体怎么分解复合运算,没有具体标准,不同的编译器有不同的
算法。++i和i++的区别就是在运算前分解和运算后分解。
int j = (++i) + (++i) + (++i);包含了两种类型的符合运算,有点复杂,可以先理解
int j=(++i)+(++i);和int d=a+b+b;的原因,再去理解,可能会简单点。
关于 int j = (i++) + (i++) + (i++); 原理相同不在赘述



More information about the Cpp mailing list