C语言Main函数到底有几种,你真的懂吗?
乍一看標題,感覺小編小題大做,但凡學過C語言的聚聚,都知道C程序入口就是main函數,且一套程序里面有且僅有一個。但是很多時候我們看到的main函數卻并不是千篇一律,格式竟然會有差別,這究竟是為啥?到底哪一種是對的呢?那么我們這兒來聊一聊這些所謂的main函數。
main()
? 簡潔明了,直接孤零零的mian()并沒有聲明返回值,也沒有傳入形式參數。講真如果真這么寫,大部分編譯器會顯示警告,并且會返回值編譯器默認會認為是int類型。因為在C89標準中寫了,這樣寫是可以的,由于聲明的時候沒有聲明返回的參數類型,所以編譯器自動默認返回int類型。
void main()
? 這種形式是初學者經常會使用的形式,因為好多培訓機構就是這么教的,但是大多數聚聚并不知道為什么這么寫,或者說是誰規定這么寫的,來源在哪兒。這里小編告訴大家,在C89/C99/C11等標準文檔中都沒有提到這種形式。這種形式的寫法聲明的返回值是void類型,沒有形式參數。很明顯,函數如果聲明返回類型是void類型,那么在程序退出后,我們是不可以獲取其退出的狀態的。所以小編這么寫,即聲明main函數的返回值類型為void類型。
int main(void)
? 這種形式的寫法也是聚聚們比較常見的寫法。這種寫法的形式參數類型為void型,意思程序在調用這個函數的時候不需要也不能傳入任何形式的參數,這就意味著,這個函數它本身就不能獲得命令行傳入的參數了。
int main ()
? 不仔細看還以為小編寫錯了,和上面第3種看起來好像沒啥區別,但是細看還是有不同的地方,形式參數沒有寫viod,直接空在那邊。小編給大家寫一段代碼,當作為例子給大家講一講,下面的程序是可以正常運行,learn函數雖然聲明為無形式參數傳入,但是我們調用它時,卻可以傳入任何形式的形參或者直接不傳任何參數。
#include void??learn(); int?main()? {? ? ?learn(4);return?0;? } void?learn(int?a) {????printf("%d",a); }int main(int argc,char *argv[])
? int argc作為形參傳入命令行參數個數,char *argv[]作為形參傳入命令行參數數組。這種形式的寫法是比較正規的,也是C標準中推薦的寫法,如果需要從命令行獲取參數,那么必須這么寫。
int main(int argc,char *argv[],char *envp[])
??這種形式的寫法包含3個形式參數,當然可以看作是上面第5種寫法的升級版,int argc形式參數是傳入命令行參數個數,char *argv[]形式參數是傳入命令參數數組,char *envp[]形式參數是傳入環境變量數組。這種寫法只比第5種多了一個參數,但我們可以通過全局變量environ代替envp的作用,可以使用getenv或putenv變量來獲取或者設置環境變量,因此在沒有特別說明或者是需求的情況下,沒有必要寫成這種形式。
總結,拜讀了大神們的帖子及文章,通過查閱C89/C99/C11標準文檔再次確認,里面明確給出了2種標準的寫法:
int?main(void)?{?/*?...?*/?} int?main(int?argc,?char?*argv[])?{?/*?...?*/?}小編寫了這么多,就是想告訴大家,想要提高代碼的通用性及可移植性,小編建議大家采用以上2種形式來敲我們的main函數。如果確定一個函數不需要傳入任何形式參數,那么按照第3中的寫法,是一種不錯的選擇。
聲明:
本文于網絡整理,版權歸原作者所有,如來源信息有誤或侵犯權益,請聯系我們刪除或授權事宜。
總結
以上是生活随笔為你收集整理的C语言Main函数到底有几种,你真的懂吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 妖股跌停洗盘特征?
- 下一篇: 建行净值理财产品怎样计算收益?