嵌入式C面試題

這道題是在飛思卡爾公司時,遇到的。看似很簡單,但是很容易錯。直接看題吧。

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.我想這就和編譯器了關了。

他在傳遞參數前,先把參數計算好,再一次性把所有參數入棧,這裏我的理解就不一定正確了。  這樣設計肯定有一定的理由,大家可以分析分析。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章