這道題是在飛思卡爾公司時,遇到的。看似很簡單,但是很容易錯。直接看題吧。
int sub(int a,int b)
{
return a-b;
}
int main(int argc,char **argv)
{
int i=2;
int y=sub(++i,++i);
printf("%d",y);
return 0;
}
請寫出輸出結果:
看到這道題,很多同學,就會糾結了,都在思考,這個sub函數調用,到底是先傳哪一個參數。從右往左呢?還是從左往右呢。所以心裏就在糾結這個答案是1還是-1.
我以前在做實驗的時候,調程序的時候遇到過一次這個問題,所以印象深刻,這個調用返回值其實不是1和-1.而真正的值是0.
很費解了吧,看彙編代碼就一目瞭解了。
從彙編代碼可以看出,是變量i連續做兩次自增,然後再傳,也就是push edx,push eax. 將參數入棧。 所以這裏兩個參數的值都是4. 計算結果爲0.我想這就和編譯器了關了。
他在傳遞參數前,先把參數計算好,再一次性把所有參數入棧,這裏我的理解就不一定正確了。 這樣設計肯定有一定的理由,大家可以分析分析。