求解一道c語言關於符號優先順序的基本題

時間 2021-06-30 03:29:56

1樓:我是人嗎似的

能想到這已經算是入門了。。。

這是編譯器的原因,c++的編譯器在同時處理!和++時會有一些混亂

b=!b++;以下是本條指令的彙編指令

0040163b mov eax,dword ptr [ebp-0ch]從儲存器取出b(!運算)

0040163e mov ecx,dword ptr [ebp-0ch]從儲存器取出b(++運算)

00401641 add ecx,1 b自增(++運算)

00401644 mov dword ptr [ebp-0ch],ecx 將b存回儲存器(++運算)

00401647 test eax,eax 邏輯取反(!運算 )

00401649 jne main+84h (00401654)

0040164b mov dword ptr [ebp-14h],1

00401652 jmp main+8bh (0040165b)

00401654 mov dword ptr [ebp-14h],0

0040165b mov edx,dword ptr [ebp-14h] 運算結果賦值(=運算)

0040165e mov dword ptr [ebp-0ch],edx 運算結果存回儲存器b(覆蓋掉了++運算的結果)

可以看出來在b=!b++中++對於最終b的取值沒有任何影響

get(a,!a++);以下是本條指令的彙編指令

004015ef mov eax,dword ptr [ebp-4]//首先運算!a++

004015f2 mov ecx,dword ptr [ebp-4]

004015f5 add ecx,1

004015f8 mov dword ptr [ebp-4],ecx

004015fb test eax,eax

004015fd jne main+38h (00401608)

004015ff mov dword ptr [ebp-10h],1

00401606 jmp main+3fh (0040160f)

00401608 mov dword ptr [ebp-10h],0

0040160f mov edx,dword ptr [ebp-10h]//以上都是在運算!a++,並將運算結果存於edx中,但是可以發現現在儲存器中的a的值已經發生了改變,變為a+1

00401612 push edx//將!a++的結果壓棧(c++中函式的引數的呼叫是通過棧來實現的,主函式將引數壓棧,被呼叫函式將引數出棧)

00401613 mov eax,dword ptr [ebp-4]//從儲存器讀取a(實際上值已經變為a+1)

00401616 push eax//將a壓棧(將a+1壓棧)

00401617 call @ilt+345(get) (0040115e)//呼叫函式

0040161c add esp,8

printf()的呼叫過程也與這個函式類似,可以看出最終get(a,!a++)實際上呼叫到的是get(a+1,!a++),這也就是為什麼後者顯示為2 0的原因了

2樓:匿名使用者

看不懂,你寫的什麼! 不等於 『!=』 如果把!當成邏輯判斷來處理,加個括號試試

c語言一道簡單表示式的結合方向和優先順序別的題

範 第一個 n n n n 是從右往左結合的,n n n n n n n 2 前面是 n n n 4 第二個,不清楚,反正 是 與 命題,就是必須滿足兩邊同時成立才為真 第二個問題 輸出 和 就不用說了,我們說說3 4 5 x 2 d d n 意思是x對2求餘,從x 3開始直到x 6結束,如果除得盡...

和 運算子優先順序(C,關於c 運算子優先順序 和 的?

菜刀撒 當然 的優先順序高 p 1 就是先做 p 然後 1 p 1 才是p指標的下一個位置 文庫精選 內容來自使用者 苟燁濤 c c 運算子的優先順序比較 優先順序 運算子 名稱 結合方向 說明 1 陣列下標,圓括號,物件,指標 1 2 型別 sizeof 負號,強制型別轉換,自增,自減,取值,取地...

求解一道C語言題,求解一道C語言題目

不考慮效能優化,只考慮功能可以這麼寫 include stdio.h include string.h define max str len 128int main char str2 max str len scanf s s str1,str2 for i 0 i strlen str1 i e...