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