[英]Checking return value of a function without return statement
請解釋為什么有時不需要返回語句?
Function 有返回類型,但缺少返回語句。 同時,程序編譯並運行良好。
請幫助我更好地理解這一點
char* handleInput() {
fgets(buffer, 1024, stdin);
// return buffer; <---- COMMENTED RETURN
}
void main() {
char* ptr = handleInput();
int flag = atoi(ptr);
if (flag < 0) break;
printf("You entered: %s\n", ptr);
}
基本上得到的回報是愚蠢的運氣。 當它返回時,您會得到 CPU 寄存器中發生的情況。 例如,如果返回值在 AX 中,而char*
恰好在 AX 中,那么你就走運了。 我相信這是一種未定義的行為; 即 C 語言規范沒有告訴你應該這樣做,所以它留給編譯器。 我很驚訝現代編譯器至少不會向您發出警告。
C99 6.9.1/12“功能定義”說:
如果到達終止 function 的 },並且調用者使用了 function 調用的值,則行為未定義。
C90 6.6.6.4“ return
聲明”標准說了一些具有類似效果的東西:
如果執行了沒有表達式的
return
語句,並且調用者使用了 function 調用的值,則行為未定義。 到達終止 function 的}
等效於沒有表達式的return
語句。
So returning from a function without returning something from the function is permitted - but the caller of the function isn't allowed to use the 'result' of the function call. 這是未定義的行為,就像其他答案提到的那樣,您可以通過未定義的行為獲得“預期”的結果,但這只是偶然。
我相信這樣做的理由是,如果 function 沒有明確聲明(或者如果聲明省略了返回類型),則預標准 C 默認為函數的返回類型int
,並且當 Z0D21670F834DFCAD4 標准化時繼續支持. 其中許多函數被設計為僅針對它們產生的副作用調用,並且沒有預期或提供返回值。
一些旁注:
-Wall
選項,gcc 將對此發出警告。 默認情況下,MSVC 會發出警告。if (flag < 0) break;
行,因為break
不在循環或開關中。main()
應該返回int
而不是void
( -Wall
也會對此發出警告)。 當然,您還應該顯式返回一些值...在聲明返回值的 function 中不使用“返回”至少可以說是不好的做法。 大多數編譯器應該生成警告。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.