簡體   English   中英

檢查沒有返回語句的 function 的返回值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM