來看一個C語言筆試題,應(yīng)該很少有人能給出正確答案。
#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; }
代碼很簡單,函數(shù) f 輸出一個字符串,返回整數(shù) 1。
函數(shù) g 輸出一個字符串,返回整數(shù) 2。
主函數(shù)中用 printf 輸出兩個函數(shù)的函數(shù)值,后面的參數(shù)一個是函數(shù) f,一個是函數(shù) g。
運行程序應(yīng)該會有三行輸出,兩個函數(shù)輸出兩個,主函數(shù)中再打印兩個數(shù)字。
問題是,這三個輸出的順序應(yīng)該是什么樣的?有沒有同學(xué)能看出答案,可以寫在評論區(qū)。
運行程序,先打印 g,再打印 f,最后輸出 1 2。
這個結(jié)果確實耐人尋味,先調(diào)用了函數(shù) g,然后再調(diào)用函數(shù) f,寫在前面的反而最后調(diào)用。
不過這還沒結(jié)束,再來換個 ARM 平臺。
相同的代碼,這次卻先輸出 f,再輸出 g,順序和參數(shù)的順序一致。
好像已經(jīng)看出了結(jié)果,調(diào)用的順序不一定,得看編譯器。
最后,再來看下C語言官方文檔,確實提到了這一點,函數(shù)參數(shù)的計算順序?qū)儆跒橹付ㄐ袨椤?/p>
之所以未指定,是想讓編譯器充分利用自身架構(gòu)的特點,所以在寫代碼的時候,不要依賴他們的計算順序。
-
C語言
+關(guān)注
關(guān)注
180文章
7605瀏覽量
136976 -
代碼
+關(guān)注
關(guān)注
30文章
4791瀏覽量
68676
原文標(biāo)題:又一個無解筆試題
文章出處:【微信號:學(xué)益得智能硬件,微信公眾號:學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論