【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))