**代碼:**
****
~~~
#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論壇](http://www.tiantianvc.com/)下首發
======= welcome to my HomePage([*http://blog.csdn.net/zhanxinhang*](http://blog.csdn.net/zhanxinhang)) to have a?communication =======