C語言 main 函數到底為啥這麼寫?

2020-12-08 電子工程專輯
凡是學過C語言的人,都知道要先寫main函數,然而很多時候我們看到的main函數卻各有差異,這究竟是為啥? 哪種是對的呢? 今天我們就來聊聊main函數。

直接的mian()並沒有返回值,沒有入參。這種寫法實際來說,部分編譯器會顯示警告,並且會返回默認值為int。不過在C89標準中其實是可以的,由於沒有聲明返回類型,所以才會返回默認值int。
初學者經常會使用的形式,但是並不知道來源在哪,在C89/C99/C11等文檔中都沒有提到這種形式的痕跡。這種寫法的返回值是void,沒有參數。值得注意的是,一旦聲明是void,在程序退出後,想要獲取其退出狀態也就不可以了。所以還是不建議返回值為void的。
比較常見的寫法,這種寫法的形參為void,表明它在調用的時候不能傳入任何參數,那麼它也就不能獲取命令行參數了。
和上面第3種看起來好像沒啥區別,但是還是有些許不同。就下面例子來說:

#include<stdio.h> void test(); int main() { test(4); return 0; } void test(int a) { printf("%d",a); }

程序仍然可以正常運行,test函數雖然聲明為無入參,但調用時卻是可以傳入任何參數或不傳參數的。
5、int main(int argc,char *argv[])
int argc入參為命令行參數個數,char *argv[]入參為命令行參數數組。這種寫法也比較常見的,主要用在需要從命令行獲取參數的功能。
6、int main(int argc,char *argv[],char *envp[])
包含三個參數的一種寫法,上面第5種的升級版,int argc是命令行參數個數,char *argv[]是命令參數數組,char *envp[]是環境變量數組。雖然只比第六種多了一個參數,但全局變量environ可以代替envp的作用,獲取或者設置環境變量可以使用getenv或putenv,因此也沒有必要使用該形式。這種寫法多源於編譯器的擴展。
查閱C89/C99/C11標準文檔,裡面明確固定了兩種寫法:

int main(void) {  } int main(int argc, char *argv[]) { }

所以說,其他的寫法並不符合標準,有些算是歷史遺留有些算是編譯器的擴展,還有些不知道從哪裡生出來的。
所以說了這麼多,為了代碼的通用可移植性,建議採用標準提供的形式,還是推薦使用標準文檔中規定的這兩種寫法。如果一個函數確定無需傳入任何參數,那麼用void限定是一個不錯的選擇。

雷軍 1994 年寫的代碼,經典老古董。

百度副總裁被抓!

60 個相見恨晚的神器工具

若覺得文章不錯,轉發分享,也是我們繼續更新的動力。
5T資源大放送!包括但不限於:C/C++,Linux,Python,Java,PHP,人工智慧,PCB、FPGA、DSP、labview、單片機、等等
在公眾號內回復「 更多資源 」,即可免費獲取,期待你的關注~
長按識別圖中二維碼關注

相關焦點

  • 你有沒有想過,C語言 main 函數到底為啥這麼寫?
    但凡是學過C語言的人,都知道要先寫main函數,然而很多時候我們看到的main函數卻各有差異,這究竟是為啥?哪種是對的呢?今天我們就來聊聊main函數。那麼main函數一共有多少個版本呢?0;}void test(int a){printf("%d",a);}程序仍然可以正常運行,test函數雖然聲明為無入參,但調用時卻是可以傳入任何參數或不傳參數的
  • C語言中的main()函數可以有好幾種類型,為何都能做入口函數呢?
    基本上,幾乎每一個初學者在剛接觸C語言時,都會被告知C語言程序的默認入口是 main() 函數,程序總是從入口函數處開始運行。為什麼在C語言程序中,可以有不同類型當然,在一些比較舊的教材或者C語言代碼中,讀者可能還見過 void 返回值類型,甚至沒有寫返回值類型的 main() 函數原型:void main();
  • C語言中的main函數參數,你了解嗎?
    小豆丁:今天我才發現,C語言中main函數還有參數,可是我不知道這個參數表示的是什麼含義,也不知道怎麼用。老張:就這點問題?小豆丁:嗯吶,我沒研究明白,好沮喪...老張:這個問題不難,別放棄哈,我教你!
  • 「記」詳解C語言之格式
    ,在它的主體設計完成後,Thompson和Ritchie用它完全重寫了UNIX,且隨著UNIX的發展,c語言也得到了不斷的完善。為了利於C語言的全面推廣,許多專家學者和硬體廠商聯合組成了C語言標準委員會,並在之後的1989年,誕生了第一個完備的C標準,簡稱「C89」,也就是「ANSI c」,截至2020年,最新的C語言標準為2017年發布的 「C17」。
  • C語言之const和volatile"究極"學習
    關於const的用法,現在大概前前後後應該寫了有兩篇文章,以前學習的時候,用法體會不是那麼深刻,為啥這麼說呢,因為在學習c++的時候,會發現const關鍵字有新的玩法,關於這個新的玩法,大家可以去看最近學習總結寫的c++文章專輯。
  • 深入理解C語言
    這裡,我再寫一篇關於深入理解C語言的文章,一方面是緬懷Dennis,另一方面是告訴大家應該如何學好一門語言。(順便註明一下,下面的一些例子來源於這個slides)。為什麼printf函數返回3呢?因為其輸出了』4′, 』2′,』\n』 三個字符。而在C99下,其會返回0,也就是成功地運行了這段程序。你可以使用gcc的 -std=c89或是-std=c99來編譯上面的程序看結果。另外,我們還要注意main(),在C標準下,如果一個函數不要參數,應該聲明成main(void),而main()其實相當於main(…),也就是說其可以有任意多的參數。
  • C語言程序設計試題及答案
    A) 程序行 B) 語句 C) 函數 D) 字符2、C語言規定,在一個源程序中main函數的位置( )。C) %   D)==5、一個完整的C程序包含一個或多個函數,對於main函數,下列不正確的是(   )。
  • C語言陷阱與技巧第8節,輸出適當的信息,有利於定位錯誤和異常代碼
    fun1() 函數和 fun2() 函數都會根據 cond() 函數的返回值做一些進一步的工作(上面的C語言代碼略過了「進一步工作」)。在 main() 函數中「堆積木」調用 fun1() 和 fun2() 函數時,使用了 if 語句判斷它們的返回值,並且根據返回值做了不同的處理。
  • 最全的C語言基礎知識都在這了
    我們用一個簡單的c程序例子,介紹c語言的基本構成、格式、以及良好的書寫風格,加深小夥伴們對C語言的認識。:main() { }這是c語言的基本結構,任何一個程序都必須包含這個結構。括號內可以不寫任何內容,那麼該程序將不執行任何結果。2、main()----在c語言中稱之為「主函數」,一個c程序有且僅有一個main函數,任何一個c程序總是從main函數開始執行,main函數後面的一對圓括號不能省略。3、被大括號{ }括起來的內容稱為main函數的函數體,這部分內容就是計算機要執行的內容。
  • C語言函數的調用 - 百度經驗
    在一個程序的編寫過程中,隨著代碼量的增加,如果把所有的語句都寫到 main 函數中,一方面程序會顯得的比較亂,另外一個方面,當同一個功能需要在不同地方執行時,我們就得再重複寫一遍相同的語句。此時,如果把一些零碎的功能單獨 寫成一個函數,在需要它們時只需進行一些簡單的函數調用,這樣既有助於程序結構的清晰條理,又可以避免大塊的代碼重複。
  • C語言編程:驗證哥德巴赫猜想
    a = b + c(其中a是大於等於6的整數,b和c是素數)這個問題就等價於:對於一個給定的大於等於4的偶數a,怎麼找到素數b和c呢?可以用循環的方法,把b的值從3循環到a-3,那麼對應的c的值就是a-3到3。然後我們分別對每一組的b和c值進行是否是素數的判斷。
  • C語言陷阱與技巧第2節,使用inline函數可以提升程序效率,但是讓...
    普通函數只需要編譯出一份,就可以被所有其他函數調用,而內聯函數沒有嚴格意義上的「調用」,它只是將自身的代碼展開到被調用處的,這麼做無疑會使整個C語言代碼變長,也就意味著佔用更多的內存空間,以及更多的指令緩存。顯然,如果濫用內聯函數,cpu 的指令緩存肯定是不夠用的,這會導致 cpu 緩存命中率降低,反而可能會降低整個C語言程序的效率。
  • C 語言這麼厲害,它自身是用什麼語言寫的?
    作者 | 劉欣這是來自我的星球的一個提問:「C語言本身用什麼語言寫的?」換個角度來問,其實是:C語言在運行之前,得編譯才行,那C語言的編譯器從哪裡來?用什麼語言來寫的?如果是用C語言本身來寫的,到底是先有蛋還是先有雞?
  • 剖析C語言中a=a+++a的無聊問題
    但是如果作為一道主觀探討題還是挺有趣的,理解深刻的人一定可以寫的很好。  看法二:  a=a+++++a的編譯和執行結果是隨機的,可能有些屌絲編譯器自認為自己很牛,可以處理這樣的語句,並把它編譯出來而不報任何警告。那麼我首先建議這樣的編譯器別用了,其次我要說這個東西的編譯結果並不重要,重要的是千萬不要在項目代碼中這樣寫。
  • 「C語言從入門到入土」必備C語言基礎筆記整理
    一、C語言1、什麼是C語言?C語言是人寫機器看的一種語言。C語言是高級語言中的低級語言。C語言貼近硬體。C語言的入門學習比較簡單。彙編語言——>B語言——>C語言2、C語言的特性首先C語言就是你的女朋友。無論你讓它幹什麼,它絕對不會自己找到方法。
  • C語言程序設計試題與答案B卷
    每小題1分,共20分)1、一個C語言程序是由( )。A)本程序的main函數開始,到main函數結束 B)本程序文件的第一個函數開始,到本程序文件的最後一個函數結束C)本程序的main函數開始,到本程序文件的最後一個函數結束D)本程序文件的第一個函數開始,到本程序main函數結束
  • R語言之plot繪圖函數的使用
    R有強大的繪圖功能,plot()函數是一種常用的繪圖函數,用其可以繪製散點圖、曲線圖等。plot函數的語法格式R語言中plot()函數的基本格式如下:plot(x,y,...)plot函數中,x和y分別表示所繪圖形的橫坐標和縱坐標;函數中的...為附加的參數。
  • C語言——用函數實現模塊化程序設計
    通過前幾章的學習,我們已經能夠編寫一些簡單的C程序,但想要功能多規模大,將所有的程序代碼都寫在一個主函中,就會使主函數變得複雜,難以理解,頭緒不清,使閱讀和維護程序變得困難。此外有時候程序中要多次實現某一功能(例如列印每一頁的頁頭),就需要多次重複編寫實現此功能的程序代碼,這使程序冗長、不精練。因此,人們自然會想到採用「組裝」的辦法來簡化程序設計的過程。
  • 自考「C語言程序設計」模擬試題十四
    2:1  6.一個C程序的執行是從(     )  A.main()函數開始,直到main()函數結束。   B.第一個函數開始,最後一個函數結束。  C.第一個語句開始,最後一個語句結束。  D.main()函數開始,直到最後一個函數。
  • C語言陷阱與技巧31節,都說void*指針是「萬能指針」,它萬能在哪
    在C語言程序開發中,一些比較成熟的庫函數常常會被使用。畢竟,如果手邊就有不錯的「輪子」可以用,沒有程式設計師願意再花費精力憑空造一個輪子出來。例如下面這段C語言代碼:#include <stdio.h>void myprint(void *p){char c = p[0];printf("c=%c\n", c);}int main()