C 17 和 操作符分析

2021-09-13 01:23:47 字數 2940 閱讀 1200

後置

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 你發現,儘管實現的同乙個功能,但第二段 要比第一段 是不是更...