來看一個C語言筆試題,應該很少有人能給出正確答案。
#includeint f(){ printf("this is f ... "); return 1; } int g(){ printf("this is g ... "); return 2; } int main() { printf("%d %d ", f(), g()); return 0; }
代碼很簡單,函數 f 輸出一個字符串,返回整數 1。
函數 g 輸出一個字符串,返回整數 2。
主函數中用 printf 輸出兩個函數的函數值,后面的參數一個是函數 f,一個是函數 g。
運行程序應該會有三行輸出,兩個函數輸出兩個,主函數中再打印兩個數字。
問題是,這三個輸出的順序應該是什么樣的?有沒有同學能看出答案,可以寫在評論區。
運行程序,先打印 g,再打印 f,最后輸出 1 2。
這個結果確實耐人尋味,先調用了函數 g,然后再調用函數 f,寫在前面的反而最后調用。
不過這還沒結束,再來換個 ARM 平臺。
相同的代碼,這次卻先輸出 f,再輸出 g,順序和參數的順序一致。
好像已經看出了結果,調用的順序不一定,得看編譯器。
最后,再來看下C語言官方文檔,確實提到了這一點,函數參數的計算順序屬于為指定行為。
之所以未指定,是想讓編譯器充分利用自身架構的特點,所以在寫代碼的時候,不要依賴他們的計算順序。
-
C語言
+關注
關注
180文章
7608瀏覽量
137111 -
代碼
+關注
關注
30文章
4801瀏覽量
68735
原文標題:又一個無解筆試題
文章出處:【微信號:學益得智能硬件,微信公眾號:學益得智能硬件】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論