乙個表示式運算順序的問題

2021-08-25 16:21:52 字數 1758 閱讀 5726

在乙個群裡遇到一哥們問表示式運算順序:

int main(int argc, char* argv)

結果為:

i=2j=0

檢視彙編**:

9:        int i = 2;

00401028 mov dword ptr [ebp-4],2

10: int j ;

11: j = ( i++ ) *( --i )/ (i << 1);

0040102f mov eax,dword ptr [ebp-4]

00401032 sub eax,1

00401035 mov dword ptr [ebp-4],eax

00401038 mov eax,dword ptr [ebp-4]

0040103b imul eax,dword ptr [ebp-4]

0040103f mov ecx,dword ptr [ebp-4]

00401042 shl ecx,1

00401044 cdq

00401045 idiv eax,ecx

00401047 mov dword ptr [ebp-8],eax

0040104a mov edx,dword ptr [ebp-4]

0040104d add edx,1

00401050 mov dword ptr [ebp-4],edx

12: return 0;

其中:

變數 i 對應 dword ptr [ebp-4]

變數 j 對應 dword ptr [ebp-8]

運算過程為:

--i

0040102f   mov         eax,dword ptr [ebp-4]

00401032   sub         eax,1

00401035   mov         dword ptr [ebp-4],eax*

00401038   mov         eax,dword ptr [ebp-4]

0040103b   imul        eax,dword ptr [ebp-4]

<<

0040103f   mov         ecx,dword ptr [ebp-4]

00401042   shl         ecx,1

00401044   cdq/

00401045   idiv        eax,ecx

00401047   mov         dword ptr [ebp-8],eax

i++

0040104a   mov         edx,dword ptr [ebp-4]

0040104d   add         edx,1

00401050   mov         dword ptr [ebp-4],edx

首先 --i,自減,i=1;

然後 *,相乘,1*1=1;

然後 << ,左移,1<<1=2;

然後 /,相除,1/2=0;

然後 =,賦值,j=0;

最後 i++,自加,i=2。

過程還挺複雜的,不看彙編**,真不好理解。

給出乙個表示式,求取表示式的值

include include include include include using namespace std 思路 1.字串預處理,針對可能出現的 等特殊情況進行替換,判斷 是負號還是減號,負號前面 0,轉變成減法運算 2.將中綴字串轉變為字尾字串陣列 3.對字尾字串陣列進行求解 int ...

用陣列順序棧實現表示式運算 中綴表示式

只有關鍵的運算部分有 只要例項化,棧是根據教科書上的寫的,如果要用stl可以修改下就可以用,這個是中序表示式的運算,由於按照老師要求,可能寫的有點繁瑣.include include seqstack.h 教科書上的順序陣列棧,改為相應的stl棧函式就可以直接例項化呼叫class calculato...

C 運算表示式求值順序

優先順序雖然規定了運算物件的組合方式,但是沒有說明運算物件按照什麼順序求值。例如 int i f1 f2 我們不知道先求f1還是先求f2,倘若f1和f2指向並修改了同一物件,則會引發錯誤。例如 int i 0 cout 結果 本人在vs2017中得到的允許結果為1 1,這個就是錯誤表示式,產生未定義...