在考試或者做題的時候,經常遇到這類問題,出題的老師就是愛在這點上面鑽牛腳尖,那就是自增自減操作的組合運算,我個人認為,考這樣的題,沒多大意思,因為各個編譯器不同,出來的結果也不同,而且這樣有一種誤導,而失去了語言學習的本質,真正的程序員,也不會寫出這樣的代碼,除非有神經病,呵呵。但是我們還是得面對……悲哀啊。下面我用匯編來分析一下這個例子:
#include "stdio.h"
int main()
{
int i=0,n = 0;
n = (++i)+(++i)+(++i);
printf(" n = %d\n",n);
printf(" i = %d\n",i);
return 0;
}
我在VC++.NET下編譯通過,結果為:n=9,i=3
讓我用STUDIO2003.NET的調試器來分析一下:
相關反匯編代碼如下:(各語句後面有我的注釋)
1
int i=0,n = 0;
00411A4E mov dword ptr [i],0 ;i初始化為0
00411A55 mov dword ptr [n],0 ;n初始化為0
n = (++i)+(++i)+(++i);
00411A5C mov eax,dword ptr [i] ;eax=0;
00411A5F add eax,1 ;eax=eax+1,所以eax=1
00411A62 mov dword ptr [i],eax ;把1賦值給i
00411A65 mov ecx,dword ptr [i] ;把i裝入ecx,此時ecx=1
00411A68 add ecx,1 ;ecx=ecx+1,此時ecx=2
0041A6B mov dword ptr [i],ecx ;把ecx賦值給i,此時i=2
00411A6E mov edx,dword ptr [i] ;把i裝入edx,(edx)=2
00411A71 add edx,1 ;edx=edx+1,(edx)=3
00411A74 mov dword ptr [i],edx ;把edx的置放回i,i=3
00411A77 mov eax,dword ptr [i] ;eax=3
00411A7A add eax,dword ptr [i] ;eax=eax+i=3+3=6
00411A7D add eax,dword ptr [i] ;eax=eax+3=6+3=9
00411A80 mov dword ptr [n],eax ;n=(eax)=9
從以上反匯編過程可以看出,n=9,i=3,輸出後也如此。輸出的匯編代碼就不貼了。
不同的編譯器輸出的結果可能不同,我想,可能反匯編出來的代碼也不一樣,所以結果自然也不一樣了。
從這裡可以看出,通過反匯編的代碼來分析,思路會清晰很多。studio2003.net的編譯器,對於(++i)+(++i)+(++i);這種運算,是先算i,也即將三個++i先算出來,結果等於3,然後才算括號外面的加法,結果當然是n=3+3+3=9。