1. 程式人生 > >【C/C++】自增運算子++詳解

【C/C++】自增運算子++詳解

關於 a = 2 * a++ *(3 –  ++a)的運算過程分析:

將以上原始碼進行反彙編之後的結果如下:

       int a = 2;

00C313DE mov         dword ptr [a],2  // a = 2;

       a = 2 * a++*(3 - ++a);

//進行++a運算 

00C313E5  mov        eax,dword ptr [a] 

00C313E8 add         eax,1 

00C313EB mov         dword ptr [a],eax 

// 進行3 – (++a)運算

00C313EE  mov        ecx,3 

00C313F3 sub          ecx,dword ptr [a] 

// 進行2 * a運算

00C313F6  mov        edx,dword ptr [a] 

00C313F9 shl           edx,1 

// 進行2 * a * (3 - ++a)運算

00C313FB  imul        edx,ecx 

00C313FE mov         dword ptr [a],edx 

// 進行(2 * a * (3 - ++a))+1運算

00C31401 mov         eax,dword ptr [a] 

00C31404  add         eax,1 

//a = (2 * a *(3 - ++a)) +1 運算結果賦值給a

00C31407 mov         dword ptr [a],eax 

下圖為整個運算的詳細圖解:


根據以上分析,可得出a = 2 *a++ *(3 –  ++a) 整個運算過程如下:

1、 由於()優先順序最高,所以先計算括號裡面的表示式,括號裡面++a的運算優先順序高於" - ",所以最先計算a = a + 1;然後計算(3- (++a))。

2、 由於" * "優先順序相同且為左結合性,所以先計算2 * a,然後計算(2 *a)* (3 - ++a)。

3、 a++為後自增,所以最後計算((2 * a)* (3 - ++a)) + 1,所以最終結果為1。

結論:前自增運算(++a),先將a的值+1,然後將+1後的a值參與運算試的運算;後自增運算子(a ++),在進行自增運算時會先計算運算試的結果然後再將整個運算結果+1,而不是a參與運算後a的結果立即+1。

思考:

請計算出以下表達式的輸出結果:

a = 2 * (a++) *(3 - ++a);

a= 2 * a++ *(a++ * (3 - ++a))