代碼疑雲(2)-c函數調用約定

代碼:

#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 =======

發佈了33 篇原創文章 · 獲贊 550 · 訪問量 38萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章