程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C++中計算次序問題

C++中計算次序問題

編輯:關於C語言
 

今天計算技術基礎課上有同學提出一個問題,C++裡,a=0,(++a)+(++a)+(++a)為什麼會等於7?

當時想可能就是自己想的,但不確定,回來後把程序反匯編一下,發現和自己想的是一樣的。對此問題的解釋如下:

C++程序為:

int main()
{
int a = 0;
int b = 0;
b = (++a) + (++a) + (++a);
return 0;
}

反匯編以後的主要語句代碼如下:

[01]:00401028 C745FC00000000 mov [ebp-04], 00000000
[02]:0040102F C745F800000000 mov [ebp-08], 00000000
[03]:00401036 8B45FC mov eax, dword ptr [ebp-04]
[04]:00401039 83C001 add eax, 00000001
[05]:0040103C 8945FC mov dword ptr [ebp-04], eax
[06]:0040103F 8B4DFC mov ecx, dword ptr [ebp-04]
[07]:00401042 83C101 add ecx, 00000001
[08]:00401045 894DFC mov dword ptr [ebp-04], ecx
[09]:00401048 8B55FC mov edx, dword ptr [ebp-04]
[10]:0040104B 0355FC add edx, dword ptr [ebp-04]
[11]:0040104E 8B45FC mov eax, dword ptr [ebp-04]
[12]:00401051 83C001 add eax, 00000001
[13]:00401054 8945FC mov dword ptr [ebp-04], eax
[14]:00401057 0355FC add edx, dword ptr [ebp-04]
[15]:0040105A 8955F8 mov dword ptr [ebp-08], edx

下面是對每句指令的分析(注:+是右運算符,是從左向右計算):

[01]:將0賦給a,a所在的地址為[ebp-04],int型變量在內存中占四個字節
[02]:將0賦給b,b的地址為[ebp-08]
[03]:把a放到寄存器eax中,eax中值為0,dword ptr代表以雙字(4字節)放入
[04]:寄存器eax中數值+1,計算結果是:++0=1,應該是計算第一個括號裡的++a
[05]:把寄存器計算結果放入內存,a所在的地址。——此時a即地址[ebp-04]中的值為1
[06]:把a放到寄存器ecx中,ecx中值為1
[07]:寄存器ecx中數值+1,計算結果是:++1=2,應該是計算中間括號裡的++a
[08]:把寄存器計算結果放入內存,a所在的地址。——此時a即地址[ebp-04]中的值為2
[09]:把a放到寄存器edx中,edx中值為2
[10]:把edx寄存器中的值加上a的值,實際是為了計算(++a)+(++a),計算結果是:edx:2+2=4
[11]:把a放到寄存器eax中,eax中值為2
[12]:寄存器eax中數值+1,計算結果是:++2=3,應該是計算最後一個括號裡的++a
[13]:把寄存器計算結果放入內存,a所在的地址。——此時a即地址[ebp-04]中的值為3
[14]:把a的值加到edx上,計算第一個括號外面的加號,得:edx:3+4=7
[15]:把edx中的計算結果放入b所在的地址,[ebp-08]

結論:

由此可見,之所以會產生a=0,(++a)+(++a)+(+ +a)=7的情況,是由語句的執行順序決定的,語句執行時候先計算“+”號兩邊的值,然後再把它們的計算結果相加。當兩邊都是++a時,兩次++先執行,再執行+,這樣就造成了“+”號兩邊的值是一樣的,2+2=4,其他的依次類推。

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved