int hanshu() {
int i; // 未初始化,未執行 return
}
int main() {
printf("%d", hanshu()); // 輸出什麼?
}
根據 C++ 標準(ISO/IEC 14882),非 void 函式若控制流程到達函式結尾而未遇到 return 語句,行為未定義。編譯器不保證任何特定輸出值。
0。原因通常是函式回傳值透過 EAX 暫存器傳遞,而區域變數 i 在堆疊上,函式結尾未修改 EAX,殘留值恰巧為 0。-O2 或 -O3 下,編譯器可能直接刪除該函式呼叫或產生 ud2 (無效指令) 導致立即崩潰。// GCC/Clang
warning: control reaches end of non-void function [-Wreturn-type]
// MSVC
warning C4715: 'hanshu': not all control paths return a value
建議:將警告視為錯誤(-Werror=return-type / /WX),在編譯階段攔截此類缺陷。
int hanshu() {
int i = 0; // 明確初始化
// ... 業務邏輯 ...
return i; // 所有路徑必須有 return
}
// 或使用 C++17 [[nodiscard]] 屬性強制調用者處理回傳值
[[nodiscard]] int hanshu();
缺少 return 不是「回傳垃圾值」這麼簡單,而是引發未定義行為,程式可能在任何平台、任何最佳化等級下表現不同。嚴格遵循「所有控制路徑皆有回傳值」是專業 C++ 開發者的基本素養。