(++i)+(++i)+(++i) 与(i++)+(i++)+(i++)表达式

若i=0,分别求两个表达式的值,你给出的答案为多少呢? 

(++i)+(++i)+(++i)   6?7?9?

(i++)+(i++)+(i++)   0? 3? 或者其他答案。


我在vc 6.0上做了测试,并把对应的汇编语言也附上。


110:  int main(int argc, char* argv[])
111:  {
0040D790   push        ebp
0040D791   mov         ebp,esp
0040D793   sub         esp,48h
0040D796   push        ebx
0040D797   push        esi
0040D798   push        edi
0040D799   lea         edi,[ebp-48h]
0040D79C   mov         ecx,12h
0040D7A1   mov         eax,0CCCCCCCCh
0040D7A6   rep stos    dword ptr [edi]
112:      int i=0,k=0;
0040D7A8   mov         dword ptr [ebp-4],0
0040D7AF   mov         dword ptr [ebp-8],0
113:      k=(++i)+(++i)+(++i);
0040D7B6   mov         eax,dword ptr [ebp-4]
0040D7B9   add         eax,1
0040D7BC   mov         dword ptr [ebp-4],eax	;++i
0040D7BF   mov         ecx,dword ptr [ebp-4]
0040D7C2   add         ecx,1
0040D7C5   mov         dword ptr [ebp-4],ecx    ;++i      先完成前2个i++
0040D7C8   mov         edx,dword ptr [ebp-4]
0040D7CB   add         edx,dword ptr [ebp-4]    ;(i)+(i)  再完成前2个表达式逻辑加法运算
0040D7CE   mov         eax,dword ptr [ebp-4]
0040D7D1   add         eax,1
0040D7D4   mov         dword ptr [ebp-4],eax    ;++i      再完成最后一个i++
0040D7D7   add         edx,dword ptr [ebp-4]    ;adx+i
0040D7DA   mov         dword ptr [ebp-8],edx    ;         最后逻辑加法运算。
114:
115:      k=0;
0040D7DD   mov         dword ptr [ebp-8],0
116:      i=0;
0040D7E4   mov         dword ptr [ebp-4],0
117:      k=(i++)+(i++)+(i++);
0040D7EB   mov         ecx,dword ptr [ebp-4]
0040D7EE   add         ecx,dword ptr [ebp-4]
0040D7F1   add         ecx,dword ptr [ebp-4]
0040D7F4   mov         dword ptr [ebp-8],ecx    ;先完成i+i+i逻辑运算,结果为0.
0040D7F7   mov         edx,dword ptr [ebp-4]
0040D7FA   add         edx,1
0040D7FD   mov         dword ptr [ebp-4],edx    ;i++
0040D800   mov         eax,dword ptr [ebp-4]
0040D803   add         eax,1
0040D806   mov         dword ptr [ebp-4],eax    ;i++
0040D809   mov         ecx,dword ptr [ebp-4]
0040D80C   add         ecx,1
0040D80F   mov         dword ptr [ebp-4],ecx    ;i++ 后完成三次i++.
118:
119:      return 0;
0040D812   xor         eax,eax
120:  }

通过汇编分析,两个表达式的值为别为2+2+3=7,i=3 以及0+0+0=0,i=3。

由于编译器差异可能第一个表达式的值会有差异,不如答案为3+3+3=9.

你可能感兴趣的:(编程语言)