c語言中,如果main函式的末尾沒有return語句將會有什麼影響

時間 2021-05-11 12:06:26

1樓:日天山君

首先,如果是微控制器這種沒有作業系統的,直接void main(),沒有引數也不需要返回值。

然後才輪到在作業系統上執行的C語言程式,在int main最後寫乙個return,其目的是為了將執行結果狀態告訴作業系統(或父程序),是執行成功呢還是不成功。

然後可以根據執行結果狀態採取不同的方案,是結束呢還是重啟呢。當然了如果什麼操作都不進行的話返回什麼值也就不太重要了。

2樓:testPC-leonier

這要看編譯器、鏈結器和平台。

在一般類Unix和Windows系統下,乙個程序退出時本身也有個「返回值」,一般會直接將main函式的返回值傳給它。

乙個程序正常返回值應該是EXIT_SUCCESS,一般對應於0。如果不是這個值,約定俗成來說這就代表程式是非正常退出的。如果在makefile等會預設檢查程序返回值的指令碼系統中,有乙個工具返回了非0值,指令碼系統會直接認為指令碼執行出錯了。

在C語言裡面定義函式返回值為void,一般在彙編裡面就是最後不把返回值彈棧。但是程序又需要乙個返回值,這就要看編譯系統最後是如何為main設定預設返回值的了。

主流的編譯系統都會將其初始化為0,相當於程式結束時呼叫了exit(0)。

3樓:

你才大一。。。我給你說說嵌入式微控制器的做法,main一進去先是暫存器賦值或者庫函式初始化設定,之後就是while(1)大迴圈等待中斷或者不停的收發和顯示,然後花括號結尾!

4樓:美國碼農

看了那麼多回答

很多都是一本正經的胡說八道

別說準大一看不懂,估計很多碼農也看不懂

不知道這些人賣弄個啥

下面是回答

C語言中,如果是void main() 不需要return返回值如果是int main() 理論上是要return乙個整形的返回值但是 main函式和其他函式不一樣,不寫 return 不會有任何影響,編譯器預設補上return 0;

C++的main函式一定是int的不能用void了,同樣,不寫return也沒有問題,編譯器預設補上

劃重點:寫非main函式的時候,有返回型別的函式一定要返回乙個相應型別的返回值,否則就會報錯。

5樓:pansz

這個答案實際是回答的這個問題,但是很奇怪發布之後答案被移到了這個問題之下,可能是知乎介面bug,我就保留在這裡吧。:

敢問 C 語言的「void main」是怎麼一代代傳下來的?

其實,這也是個UB問題啊。

C語言的標準規定main函式必須返回int,如果返回void的話,這個行為屬於未定義行為(UB)。對於未定義行為,不同編譯器可以根據自己的愛好做出任何自己想要的事。

之所以這種習慣能夠被傳下來,當然是因為,那些人使用的編譯器,恰好對於void返回值的main做出了理智的處理,沒有發生任何過激行為,於是,自然這種習慣被流傳下來了。

不過我當年恰好遇上了乙個特立獨行的編譯器,你敢返回void,它就敢讓你main函式死迴圈無法退出。於是我就。。。被調教了。

補充,既然恰好看到了這個問題就一併回答了:

關於本問題,本來應該是有定義的,現在C語言標準定義允許main函式末尾不return。但有部分編譯器沒有正確實現(我遇到過)。所以實際在不同環境中你能獲取到的返回值不確定。

——這是乙個有明確定義的特性但在實踐中卻等同於UB的例子。

6樓:sk 馬鹿

我建議不要不加return,作為一名合格的程式設計師,一定要知道。

這個問題,我可以簡單易懂的讓你明白,為什麼有的要加return。有的不需要。

return是函式的返回值。

那什麼情況下需要呢?在定義函式時只要不是void(意味無返回值),其他的都需要return。

return什麼用呢? 當你呼叫函式後,需要函式處理後的值的時候,這時候你就可以直接

value=函式() --就可以把函式返回值賦給value, 然後使用這個返回值

而無返回值。比如初始化函式,他不需要獲取返回值,只是做下初始化

所以return不是函式的標配。。。。

7樓:happyaaakkk

return 0;是理論上應該加的,只不過現在的編譯器一般都會在你沒寫它的時候自動給你補上,看似不寫也行。

有些演算法競賽,不寫return 0;得零分。

還有,void main()是不規範寫法,望周知。

8樓:TBLGSn

1. 可能編譯器會出錯,具體要看你使用的編譯器,以及你 main 函式定義的返回型別。(如果是 void ,return 語句可省略)

2. "main函式的返回值就是執行其程式的這個程序的狀態碼,命令列程式常常通過判斷相應命令(程序)的狀態碼來判斷相應命令是結果是否正常」

9樓:ClayHa

學校學習c語言是必修課,但是樓主你無法確定你未來的路是否會一直沿著C走下去,現在有很多的計算機程式語言,為了以後能夠很快的去掌握別的語言建議加上這個 return ,否則可能函式沒有返回值的時候在呼叫了會報錯或者有警告或者無任何的動作,但是卻不報錯,那就找瞎眼

10樓:

回答這個問題其實只要理解乙個東西就行了:

那就是帶有返回值的函式請務必提供返回值,這個是基本約定也是程式設計習慣,如果大家都遵守,你不遵守,各種奇葩和頭疼的後果就遲早會來,不管是 main 也好,其他函式也好

所以,準大一這個時候一定要從現在開始養成習慣,遵守語言的基本約定。

`main` 的標準宣告是什麼?

int main(int argc, char *argv)

很多同學寫例子,也有這麼寫的?

void main(void)

這種可以用 `-Wall` 檢查出來:

$ echo 'void main(void) {}' | gcc -Wall -x c - -

:1:6: warning: return type of 『main』 is not 『int』 [-Wmain]

如果用 `int` 預設檢查不出來 return value ,預設是相容 c11 的 gnu11:

$ echo 'int main(void) {}' | gcc -Wall -x c - -

$ echo 'int main(void) {}' | gcc -Wall -std=gnu11 -x c - -

試了下,c99 之後都是沒有提示問題。但是 c90 以及之前都提示需要加返回值:

$ echo 'int main(void) {}' | gcc -Wall -std=c90 -x c - -

: In function 『main』:

:1:1: warning: control reaches end of non-void function [-Wreturn-type]

考慮到相容性,建議務必養成寫上的習慣。由於 main 稍微特殊些,c99 預設處理了,但是對於其他函式還是要自己加,不做處理的話,是有很大風險的。

對於 c99 以及之後的版本,對普通函式還是會做檢查。 如果有的寫,有的不寫,不一致的話久而久之習慣就很難養成了。

$ echo 'int test(void) {}; int main(void) ' | gcc -Wall -std=c99 -x c - -

: In function 『test』:

:1:1: warning: control reaches end of non-void function [-Wreturn-type]

由於人總會出錯,所以,在編譯的 cflags 裡頭,建議強制加上 `-Wall -Werror`,在遇到這類錯誤是強制退出,而不僅僅是警告。當然,對於已經存在的專案,prove-in-use 的情況下,建議保留之前的預設配置選項,除非要確實投入很多精力去重構。

$ echo 'int main(void) {}' | gcc -Wall -Werror -std=c90 -x c - -

: In function 『main』:

:1:1: error: control reaches end of non-void function [-Werror=return-type]

cc1: all warnings being treated as errors

需要注意的是,預設情況下,沒有錯誤,就是 return 0,而不是 return 1。

完整的模板:

上面多次提到了後果和風險,為什麼?因為檢查函式和程式返回值是乙個最最基礎的操作。如果不按常理返回正確的返回值,後果是,後續對該值的檢查所做出的所有動作都可能不可預知。

這個值是怎麼體現的呢?

$ echo -e 'int main(void)' | gcc -Wall -Werror -std=c99 -O0 -x c - -

$ ./a.out

$ echo $?

0$ echo -e 'int main(void)' | gcc -Wall -Werror -std=c99 -O0 -x c - -

$ ./a.out

$ echo $?

100比如說,在 `Shell` 程式設計中通常會在程式執行完,立即檢查返回值,然後決定接下去做什麼操作?

if [ $? -eq 0 ]; then echo 'Success'; else echo 'Failure'; fi

關於 Shell 的布林操作,可以參考:《Shell 程式設計範例之布林運算》

11樓:

沒有main函式的末尾沒有return語句就返回0,實際上就是C99規範的規定:

規範沒有啥道理可講,編譯器不遵守是不行的。

12樓:chenc

按慣例,main應該定義成int返回,最後的返回會成為這個執行程式返回給排程的返回碼。就是linux下的$?,就是暈到死下面的%errorlevel%。

如果不遵守這樣的約定,最後的返回碼就可能失控,當然,這個是不是很嚴重各人有各人的看法。

不同的c語言實現對這一點要求不同。建議你寫上返回乙個int,這樣相容性應該是最好的。

C語言裡,main 函式中 return x和 exit x 到底有什麼區別

AutherM exit 是乙個 system call,表示要結束這個process,不管是parent 還是child return 是乙個函式的返回,不一定結束這個process,如果出現在被main呼叫的函式中,那就是返回到呼叫函式接下來的一條語句繼續執行 如果return 在main中,則...

為什麼C語言要有 int 作為 main 函式的返回值,而不是 void?

main函式的返回值會被shell捕獲,並存到乙個環境變數中。在一些main loop結構的嵌入式系統中,main的返回值沒太有意義,因為嵌入式系統的軟體不會結束 上電後一直執行 或者在一些練習性質的程式中,我們也不太關注main函式的返回值。linux系統有個設計理念 乙個程式只做一件事情,並把它...

C語言中呼叫函式change data 和data change data 有什麼區別?

眼鏡獒 change data 或者data change data 哪有data change data 這種又傳位址又返回修改過後的值的?傳了位址就可以直接修改值,為什麼要有個多餘的返回值?有了返回值就可以在外面接收,為什麼又要傳乙個多餘的位址? 差乙個賦值操作。assume data is 1...