這是迅雷一問一答的題目: [cpp] #include <stdio.h> int main(void) { int a, b; a = 5; a = a + a++; printf("a = %d\n", a); a = 5; b = a + a++; printf("b = %d\n", b); return 0; } 輸出的結果是: 反匯編過程: [cpp] PUBLIC _main EXTRN _printf:NEAR _DATA SEGMENT $SG529 DB 'a = %d', 0aH, 00H $SG530 DB 'b = %d', 0aH, 00H _DATA ENDS _TEXT SEGMENT _a$ = -4 _b$ = -8 _main PROC NEAR ; 3 : int main(void) { push ebp mov ebp, esp sub esp, 8 ; 4 : int a, b; ; 5 : ; 6 : a = 5; mov DWORD PTR _a$[ebp], 5 ; 賦值,a = 5 ; 7 : a = a + (a++); mov eax, DWORD PTR _a$[ebp] add eax, DWORD PTR _a$[ebp] ; a += a(a = 10) mov DWORD PTR _a$[ebp], eax mov ecx, DWORD PTR _a$[ebp] add ecx, 1 ; a++,a = 11 mov DWORD PTR _a$[ebp], ecx ; 8 : printf("a = %d\n", a); mov edx, DWORD PTR _a$[ebp] push edx push OFFSET FLAT:$SG529 call _printf add esp, 8 ; 9 : ; 10 : a = 5; mov DWORD PTR _a$[ebp], 5 ; 11 : b = a + (a++); mov eax, DWORD PTR _a$[ebp] add eax, DWORD PTR _a$[ebp] ; a += a(a = 10,b = 10) mov DWORD PTR _b$[ebp], eax mov ecx, DWORD PTR _a$[ebp] add ecx, 1 ; a++,a = 11,b不變 mov DWORD PTR _a$[ebp], ecx ; 12 : printf("b = %d\n", b); mov edx, DWORD PTR _b$[ebp] push edx push OFFSET FLAT:$SG530 call _printf add esp, 8 ; 13 : return 0; xor eax, eax ; 14 : } mov esp, ebp pop ebp ret 0 _main ENDP _TEXT ENDS END 首先有一點必須要明確的是:表達式的運算順序是從左到右的 1. 對於 a = a + a++; 運算過程是:a = 5 + 5 = 10,然後 a 再自加 2. 對於 b = a + a++; 運算過程是:b = 5 + 5 = 10,然後 a 再自加 再看一個稍微復雜點的程序: [cpp] #include <stdio.h> int main(void) { int a, b; a = 5; a = a++ + a++; printf("a = %d\n", a); a = 5; b = (++a) + (a++) + (a++) + (++a) + (++a) + (a--); printf("a = %d\n", a); printf("b = %d\n", b); return 0; } 運算結果是: 不貼ASM代碼了 ----------------------------------- 首先有一點必須要明確的是:表達式的運算順序是從左到右的 語句 a = a++ + a++; 的執行過程是: 1. 第一個 a++ 的結果是5,第二個 a++ 的結果也是5 2. 此時表達式的結果是 a = 5 + 5 = 10,然後 a 再執行 2 個自加 語句 b = (++a) + (a++) + (a++) + (++a) + (++a) + (a--); 的執行過程是: 1. 第一個 ++a 的結果是6 2. 兩個 a++ 的結果都是6 3. 前一個 ++a 的結果是7,後一個 ++a 的結果是8 4. a-- 的結果是8 最後表達式的結果是 b = 6+6+6+7+8+8 = 41,接下來就是更新 a 的值了,a一共有2次後置自加,1次後置自減,所以a = a + 2 -1 = 9(因為前置運算在表達式運算時已經運算過,而到表達式運算結束時a的值是8)