後置
int i = 0;
(i++) + (i++) + (i++);
(++i) + (++i) + (++i);
兩個表示式的值分別會是多少呢?
例項分析: 令人頭疼的兄弟
#include int main()
輸出_1:vc
i = 3
r = 0
i = 6
r = 18
輸出_2:gcc
i = 3
r = 0
i = 6
r = 16
分析_1:【 彙編 - vc 】
r = (i++) + (i++) + (i++);
mov eax,dword ptr [i]
add eax,dword ptr [i]
add eax,dword ptr [i]
mov dword ptr [r],eax ; r = i + i + i ==> r = 0 + 0 + 0 = 0
mov ecx,dword ptr [i]
add ecx,1
mov dword ptr [i],ecx ; i = i + 1 = 1
mov edx,dword ptr [i]
add edx,1
mov dword ptr [i],edx ; i = i + 1 = 2
mov eax,dword ptr [i]
add eax,1
mov dword ptr [i],eax ; i = i + 1 = 3
r = (++i) + (++i) + (++i);
mov eax,dword ptr [i]
add eax,1
mov dword ptr [i],eax ; i = i + 1 = 4
mov ecx,dword ptr [i]
add ecx,1
mov dword ptr [i],ecx ; i = i + 1 = 5
mov edx,dword ptr [i]
add edx,1
mov dword ptr [i],edx ; i = i + 1 = 6
mov eax,dword ptr [i]
add eax,dword ptr [i]
add eax,dword ptr [i]
mov dword ptr [r],eax ; r = i + i + i = 6 + 6 + 6 = 18
分析_2: 【 彙編 - gcc 】
r = (i++) + (i++) + (i++);
int i = 0;
movl $0x0,0x1c(%esp)
int r = 0;
movl $0x0,0x18(%esp)
mov 0x1c(%esp),%eax
add %eax,%eax
add 0x1c(%esp),%eax
mov %eax,0x18(%esp) ; r = i + i + i ==> r = 0 + 0 + 0 = 0
addl $0x1,0x1c(%esp) ; i = i + 1 = 1
addl $0x1,0x1c(%esp) ; i = i + 1 = 2
addl $0x1,0x1c(%esp) ; i = i + 1 = 3
r = (++i) + (++i) + (++i);
addl $0x1,0x1c(%esp) ; i = i + 1 = 4
addl $0x1,0x1c(%esp) ; i = i + 1 = 5
mov 0x1c(%esp),%eax
add %eax,%eax ; eax = i + i = 10
addl $0x1,0x1c(%esp) ; i = i + 1 = 6
add 0x1c(%esp),%eax
mov %eax,0x18(%esp) ; r = i + eax = 16
【c 語言灰色地帶】+ 和 -- 參與混合運算結果是不確定的
**"++ -- 不要和其它運算子混合使用"**
編譯器究竟如何解釋?
#include int main()
輸出:
a = 2
b = 4
c = 5
分析:int j = ++i+++i+++i; ==> error: lvalue required as increment operand
==> ++i++ ==> 1 ++
c = a+++b; ==> a++ + b
b = b/*p; ==> 注釋開始
17 和 操作符分析
注 部落格中內容主要來自 狄泰軟體學院 部落格僅當私人筆記使用。測試環境 ubuntu 10.10 gcc版本 4.4.5 一 操作符的本質 1 和 操作符對應兩條彙編指令 前置 先遞增,再使用數值 變數自增 減 1 取變數值 後置 先使用數值,再遞增 取變數值 變數自增 減 1 二 操作符使用分析...
C語言學習記錄17 和 操作符分析
和 操作符對應兩條彙編指令。1 前置 變數自增 減 1 取變數值 2 後置 取變數值 變數自增 減 1 vs和gcc不同 灰色地帶 結果分析 vs先加後自增。為什麼結果不確定?1 c語言中只規定了 和 對應指令的相對執行程式 2 和 對應的彙編指令不一定連續執行 3 在混合運算中,和 的彙編指令可能...
C 操作符 和
先看如下 stringstrparam request.params param if strparam null stringstrparam request.params param null?request.params param 你發現,儘管實現的同乙個功能,但第二段 要比第一段 是不是更...