這是迅雷一問一答的題目:
[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)