代碼:
#include<iostream>
using namespace std;
void foo(int p1,int p2,int p3)
{
cout<<"p1="<<p1<<endl
<<"p2="<<p2<<endl
<<"p3="<<p3<<endl;
}
int main()
{
int i;
cout<<"first call:"<<endl;
i=0;
foo(++i,++i,++i);
cout<<"second call:"<<endl;
i=0;
foo(++i,i++,i++);
return 0;
}
疑:兩次調用foo函數分別輸出了什麼,爲什麼?
解答:按照cedel函數調用的約定,編譯器使參數從左到右的入棧。第一次調用爲什麼p1,p2,p3的值全是3呢,原因在此,在foo被call之前三++i 操作將先被操作也就是連續自增了3次,最終結果i 的值是3,然後是編譯器push(i),push(i),push(i)三次入棧,然後call到foo定義處依次出棧並相應地複製給了形參。第二次調用foo時,一開始與第一次一樣先是計算三次++操作,但是所不同的是最後兩個是i++,i++ 剛沒說到它們的計算順序,編譯器計算這些的順序是由右到左的,也就是先i++,再i++,最後是++i,而運算i++是先取值再自增的,編譯器會先把i (這時爲0)存入寄存器(cpu中的存儲器),再加1,然後計算下一個i++ 與前一次一樣,所不同的是這次 i 的值是1,因爲前面已加1 ,最後++i 。
!!代碼疑雲系列由本人在天天唯C論壇下首發
=======
welcome to my HomePage(http://blog.csdn.net/zhanxinhang) to
have a communication =======