需要返回值的函數(shù),沒return會怎么樣?
掃描二維碼
隨時隨地手機看文章
直接說結(jié)論,如果一個函數(shù)聲明了返回類型(如int、float、char等),那它必須在所有可能的執(zhí)行路徑上返回一個相應類型的值。否則,會導致未定義行為。
下面會詳細探討不同情況下不返回值的后果,包括普通函數(shù)和main函數(shù)。
普通函數(shù)不返回值
當一個普通函數(shù)聲明了返回類型但沒有在所有路徑上返回值時,它的行為是未定義的。
未定義意味著程序可能表現(xiàn)出任意行為,包括崩潰、產(chǎn)生錯誤結(jié)果或偶爾正常工作。
示例代碼:
#includeint shouldReturnValue() { printf("This function is supposed to return an int.\n"); // No return statement! } int main() { int value = shouldReturnValue(); // Undefined behavior! printf("Value: %d\n", value); return 0; }
在上面的代碼中,shouldReturnValue函數(shù)聲明返回int,但實際上沒有返回任何值。當main函數(shù)調(diào)用shouldReturnValue并試圖使用其“返回值”時,程序行為未定義??赡艿暮蠊?/span>value變量包含垃圾值,或程序異常終止。
熟悉函數(shù)調(diào)用棧幀的朋友應該會知道原理,函數(shù)的返回值會保存在某個寄存器上或者棧的某個位置處,如果某個函數(shù)它應該返回值卻沒返回,那就會復用之前這個寄存器上或棧上的值,其行為那就是未定義了。
main函數(shù)不返回值
main函數(shù)是C程序的入口點,它的返回類型通常是int。
根據(jù)標準,main函數(shù)應返回一個整數(shù),該整數(shù)通常用于指示程序的退出狀態(tài)。返回0通常表示程序成功執(zhí)行,非零值表示發(fā)生了錯誤或異常情況。
如果main函數(shù)沒有返回值,大多數(shù)現(xiàn)代C編譯器會隱式地插入一個return 0;的語句。
然而,依賴這種隱式行為并不是好的編碼習慣,它可能不是所有編譯器都支持。
示例代碼:
#includeint main() { printf("Hello, World!\n"); // No return statement! }
最好是顯式地返回一個值,如:
#includeint main() { printf("Hello, World!\n"); return 0; // Explicit return statement }
我們直接看匯編代碼來確認int main是否會隱式返回0。
先看帶有return 0的匯編代碼:
xor eax, eax,表示使用異或操作將eax寄存器的值清零。在x86-64架構(gòu)中,main函數(shù)的返回值通常通過eax寄存器傳遞。因此,這行代碼表示main函數(shù)返回0。
再看不帶有return 0的匯編代碼:
這里可以看到,還是有xor eax, eax的指令,這表示編譯器會隱式的給我們**return 0**。





