在乙個群裡遇到一哥們問表示式運算順序:
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,這個就是錯誤表示式,產生未定義...