2016-11-27 112 views
-4

我不明白爲什麼我們需要在函數結尾使用return 0;。我不知道爲什麼我們需要它在main()的末尾(爲了表示程序結束?),但我真的不明白爲什麼我們在普通函數結束時還需要它。爲什麼我們需要在C函數的末尾使用'return 0'?

+1

它取決於 - 它只是表示沒有錯誤的慣例 –

+0

如果你想讓調用進程知道它執行的程序的狀態,你需要在'main'的末尾返回一個值。例如,Windows批處理文件可以根據程序返回的值使用'errorlevel'來採取行動。 –

+1

'main'是*不需要'return'語句(從C99開始)的唯一函數。 – dreamlax

回答

1

如果您將返回類型聲明爲void

2

您不需要在每個函數中都返回0。例如:

void my_function(int *p_data) 
{ 
    *p_data = 5; 
} 

int main(void) 
{ 
    int data = 0; 
    my_function(&data); 
    printf("Data: %d", data); 

    return 0; 
} 

這將工作得很好。

3

如果在你的代碼,你說你的函數返回一個值,但你實際上並沒有返回一個:

int my_function(int x) 
{ 
    // bad practice! 
} 

...這是錯誤不好的做法。你說你要返回一個值(在這個例子中是'int'),但你沒有。

同樣,如果有通過你的功能的多條路徑:

int my_function(int x) 
{ 
    if (x == 3) 
     return 42; // good 

    // bad! 
} 

你又把聲明的意圖返回一個值,而是通過你的函數一些路徑不這樣做,那也是錯誤不好;你已經違背了你對函數調用者的承諾。

通過函數的所有路徑應在return語句結束:

int my_function(int x) 
{ 
    if (x == 3) 
     return 42; // good 

    return 1; // good 
} 

如果你不想返回任何值,然後聲明函數void:

void my_function(int x) 
{ 
    // good 
} 

UPDATE :以上,您可能會注意到我將「錯誤」替換爲「不良做法」。這是因爲「錯誤」這個詞在C標準中非常特別,並且忘記return聲明不符合該定義(相反,它被認爲是「未定義的行爲」,並且您的編譯器甚至可能不會抱怨)。但是,你作爲一個人應該認爲它是你的代碼中的一個錯誤,並且避免在函數外的所有退出路徑上遺忘返回語句。

+0

C中省略return語句並不是錯誤。如果你既省略了return語句,又試圖在調用代碼中使用返回值,那只是一個錯誤。 (而這種錯誤的本質是未定義的行爲,不需要診斷 - 編譯器不必警告這一點,儘管一些人會這樣做)。 –

+1

雖然你的評論是正確的,但看起來OP是一個新手,我覺得這樣的細節對於他/她來說太早了。我的回答是前瞻性的,朝着良好的編程習慣。如果你喜歡,我可以把我的話'錯誤'改爲'壞' –

0

如果一個函數聲明爲返回void以外的類型,那麼它必須有有一個return語句。唯一的例外是main函數,該函數從C99開始可以省略return語句(省略時,行爲與在main的關閉}之前有return 0;語句相同)。

考慮這個錯誤test功能:如果你調用test以0作爲參數

int test(int a) 
{ 
    if (a == 0) 
     return 123; 
} 

int main() 
{ 
    int x; 
    x = test(0); // x equals 123 
    x = test(1); // x equals ??? 
} 

,功能會給你回123,但是如果你比0以外的稱呼呢?你期望的結果是什麼?對於C中的函數,沒有「默認返回值」,如果返回類型不是void(有一個例外是main函數),則返回值必須

相關問題