我不明白爲什麼我們需要在函數結尾使用return 0;
。我不知道爲什麼我們需要它在main()
的末尾(爲了表示程序結束?),但我真的不明白爲什麼我們在普通函數結束時還需要它。爲什麼我們需要在C函數的末尾使用'return 0'?
回答
如果您將返回類型聲明爲void
您不需要在每個函數中都返回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;
}
這將工作得很好。
如果在你的代碼,你說你的函數返回一個值,但你實際上並沒有返回一個:
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
聲明不符合該定義(相反,它被認爲是「未定義的行爲」,並且您的編譯器甚至可能不會抱怨)。但是,你作爲一個人應該認爲它是你的代碼中的一個錯誤,並且避免在函數外的所有退出路徑上遺忘返回語句。
C中省略return語句並不是錯誤。如果你既省略了return語句,又試圖在調用代碼中使用返回值,那只是一個錯誤。 (而這種錯誤的本質是未定義的行爲,不需要診斷 - 編譯器不必警告這一點,儘管一些人會這樣做)。 –
雖然你的評論是正確的,但看起來OP是一個新手,我覺得這樣的細節對於他/她來說太早了。我的回答是前瞻性的,朝着良好的編程習慣。如果你喜歡,我可以把我的話'錯誤'改爲'壞' –
如果一個函數聲明爲返回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
函數),則返回值必須。
- 1. 我們必須在函數「return」的末尾寫什麼?在C++
- 2. 爲什麼我們需要在.each()函數中使用$(this)?
- 3. 什麼是仿函數,爲什麼我們需要它們?
- 4. 爲什麼我們需要使用ExitWindowsEx
- 5. 爲什麼我們需要使用prompt.start()?
- 6. Python C API:我們什麼時候在Python指令的末尾?
- 7. 我們什麼時候需要在codeIgniter中使用base_url()函數?
- 8. 裝配需要什麼?爲什麼我們使用它們?
- 9. 爲什麼我們應該在button_press_event.handler的末尾返回True?
- 10. 爲什麼我們需要「-'0'」來修改數組?
- 11. 爲什麼我們需要在JavaScript
- 12. 何時/爲什麼'\ 0'需要標記(char)數組的結尾?
- 13. 爲什麼Nil需要在使用cons運算符構建的列表末尾
- 14. 爲什麼我們需要在boost中綁定成員函數?
- 15. 爲什麼你需要一個URL末尾的斜線?
- 16. 爲什麼在c中定義常量的末尾使用'e0'?
- 17. 爲什麼我們需要JPA中的空構造函數。 ??
- 18. 爲什麼我們需要裝飾器中的包裝函數?
- 19. 爲什麼我們需要OOP中的構造函數?
- 20. 爲什麼需要這個return語句?
- 21. 爲什麼我們在使用return時使用pthread_exit()?
- 22. 爲什麼C++字符串需要\ 0?
- 23. 爲什麼我們需要一個私有構造函數?
- 24. 爲什麼我們需要在Elixir中使用「捕獲操作符」函數?
- 25. 爲什麼我們需要一個函數try塊?
- 26. 什麼時候/爲什麼要在回調函數中使用「return」
- 27. 爲什麼我們只需要爲Scalar函數使用Schema名稱
- 28. 我們爲什麼需要,使用貓鼬有什麼好處
- 29. 模型中有什麼?爲什麼我們需要使用它
- 30. 在iOS上,要找到結尾滑動位置,我們需要使用UIPanGestureRecognizer,那麼爲什麼不使用touchesEnded?
它取決於 - 它只是表示沒有錯誤的慣例 –
如果你想讓調用進程知道它執行的程序的狀態,你需要在'main'的末尾返回一個值。例如,Windows批處理文件可以根據程序返回的值使用'errorlevel'來採取行動。 –
'main'是*不需要'return'語句(從C99開始)的唯一函數。 – dreamlax