你有沒有想過,C語言 main 函數到底為啥這麼寫?

2020-12-04 21IC中國電子網

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

那麼main函數一共有多少個版本呢?

1、main()

直接的mian()並沒有返回值,沒有入參。這種寫法實際來說,部分編譯器會顯示警告,並且會返回默認值為int。不過在C89標準中其實是可以的,由於沒有聲明返回類型,所以才會返回默認值int。

2、void main()

初學者經常會使用的形式,但是並不知道來源在哪,在C89/C99/C11等文檔中都沒有提到這種形式的痕跡。這種寫法的返回值是void,沒有參數。值得注意的是,一旦聲明是void,在程序退出後,想要獲取其退出狀態也就不可以了。所以還是不建議返回值為void的。

3、int main(void)

比較常見的寫法,這種寫法的形參為void,表明它在調用的時候不能傳入任何參數,那麼它也就不能獲取命令行參數了。

4、int main ()

和上面第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限定是一個不錯的選擇。

所以說,你明白要怎麼寫main函數了嗎?

相關焦點

  • C語言 main 函數到底為啥這麼寫?
    但 凡是學過C語言的人,都知道要先寫main函數,然而很多時候我們看到的main函數卻各有差異,這究竟是為啥? 哪種是對的呢? 今天我們就來聊聊main函數。 直接的mian()並沒有返回值,沒有入參。這種寫法實際來說,部分編譯器會顯示警告,並且會返回默認值為int。不過在C89標準中其實是可以的,由於沒有聲明返回類型,所以才會返回默認值int。
  • C語言中的main函數參數,你了解嗎?
    小豆丁:今天我才發現,C語言中main函數還有參數,可是我不知道這個參數表示的是什麼含義,也不知道怎麼用。老張:就這點問題?小豆丁:嗯吶,我沒研究明白,好沮喪...老張:這個問題不難,別放棄哈,我教你!
  • C語言中的main()函數可以有好幾種類型,為何都能做入口函數呢?
    為什麼在C語言程序中,可以有不同類型當然,在一些比較舊的教材或者C語言代碼中,讀者可能還見過 void 返回值類型,甚至沒有寫返回值類型的 main() 函數原型:void main();而C語言沒有重載語法,為什麼在C語言程序中,可以有不同類型的 main() 函數呢?為什麼在C語言程序中,可以有不同類型的 main() 函數呢?C語言程序支持多種類型 main() 函數,其實和支持可變參數函數是類似的。
  • 深入理解C語言
    為什麼printf函數返回3呢?因為其輸出了』4′, 』2′,』\n』 三個字符。而在C99下,其會返回0,也就是成功地運行了這段程序。你可以使用gcc的 -std=c89或是-std=c99來編譯上面的程序看結果。另外,我們還要注意main(),在C標準下,如果一個函數不要參數,應該聲明成main(void),而main()其實相當於main(…),也就是說其可以有任意多的參數。
  • 「記」詳解C語言之格式
    文@侍郎不是狼啦#C語言初學#在開始說明本文主題之前,我想有必要科普下C語言的歷史:C語言誕生於美國的貝爾實驗室,由D.M.Ritchie以B語言為基礎發展而來<stdio.h>int main(void){return 0;}我們知道在以上那種格式中的大括號(也叫做花括號)「{}」內寫進我們的代碼可以讓我們的程序正確運行,可是很多人可能不知道為什麼要這麼寫?
  • C語言之const和volatile"究極"學習
    關於const的用法,現在大概前前後後應該寫了有兩篇文章,以前學習的時候,用法體會不是那麼深刻,為啥這麼說呢,因為在學習c++的時候,會發現const關鍵字有新的玩法,關於這個新的玩法,大家可以去看最近學習總結寫的c++文章專輯。
  • C語言陷阱與技巧第8節,輸出適當的信息,有利於定位錯誤和異常代碼
    之所以要這麼做,是因為若直接編寫C語言代碼一次性解決複雜任務,往往會讓整個代碼「揉作一團」,不僅開發時容易引入 bug,而且後期維護起來也比較痛苦。想像一下,若將任務拆分成若干個子模塊,以後發現問題時,可能只需要修改某個子模塊就可以了。但是若沒有這麼做,查找和解決問題就必須對全部代碼下手了。
  • 你知道C語言中函數調用和嵌套嗎?函數必學模塊,你不得不知!
    當然了,也不是說就一定要把函數的功能模塊都分開來寫,但是如果你寫成了下面這個樣子: 二、函數的調用方式 函數是C語言的基本組成元素,如果你要想實現函數的功能,那麼你就必須學會正確調用函數。
  • C語言程序設計試題及答案
    A) 程序行 B) 語句 C) 函數 D) 字符2、C語言規定,在一個源程序中main函數的位置( )。C) %   D)==5、一個完整的C程序包含一個或多個函數,對於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語言基礎知識都在這了
    我們用一個簡單的c程序例子,介紹c語言的基本構成、格式、以及良好的書寫風格,加深小夥伴們對C語言的認識。:main() { }這是c語言的基本結構,任何一個程序都必須包含這個結構。括號內可以不寫任何內容,那麼該程序將不執行任何結果。2、main()----在c語言中稱之為「主函數」,一個c程序有且僅有一個main函數,任何一個c程序總是從main函數開始執行,main函數後面的一對圓括號不能省略。3、被大括號{ }括起來的內容稱為main函數的函數體,這部分內容就是計算機要執行的內容。
  • 剖析C語言中a=a+++a的無聊問題
    哈哈,當然了,我還是要對我的師兄弟們負責的,所以我下面的「胡說」中會儘量有理有據。  看法一:  a=a+++++a這個東西可以用來討論,甚至是討論它的無所事處,作為增長知識和發現自身理解問題的漏洞是可以的。但是絕對不能拿來作為考試題目,特別是選擇題或填空題等客觀題目。但是如果作為一道主觀探討題還是挺有趣的,理解深刻的人一定可以寫的很好。
  • C 語言這麼厲害,它自身是用什麼語言寫的?
    作者 | 劉欣這是來自我的星球的一個提問:「C語言本身用什麼語言寫的?」換個角度來問,其實是:C語言在運行之前,得編譯才行,那C語言的編譯器從哪裡來?用什麼語言來寫的?如果是用C語言本身來寫的,到底是先有蛋還是先有雞?
  • C語言陷阱與技巧第2節,使用inline函數可以提升程序效率,但是讓...
    打開 Linux 內核原始碼,會發現內核在定義C語言函數時,有很多都帶有 「inline」關鍵字,請看下圖,那麼這個關鍵字有什麼作用呢?inline 關鍵字的作用在C語言程序開發中,inline 一般用於定義函數,inline 函數也被稱作「內聯函數」,C99 和 GNU C 均支持內聯函數。那麼在C語言中,內聯函數和普通函數有什麼不同呢?
  • 「C語言從入門到入土」必備C語言基礎筆記整理
    一、C語言1、什麼是C語言?C語言是人寫機器看的一種語言。C語言是高級語言中的低級語言。C語言貼近硬體。C語言的入門學習比較簡單。彙編語言——>B語言——>C語言2、C語言的特性首先C語言就是你的女朋友。無論你讓它幹什麼,它絕對不會自己找到方法。
  • R語言之plot繪圖函數的使用
    R有強大的繪圖功能,plot()函數是一種常用的繪圖函數,用其可以繪製散點圖、曲線圖等。plot函數的語法格式R語言中plot()函數的基本格式如下:plot(x,y,...)plot函數中,x和y分別表示所繪圖形的橫坐標和縱坐標;函數中的...為附加的參數。
  • C語言怎麼樣?今天聊聊C語言的發展史!
    C語言發展史的點點滴滴。 任何一種新事物的出現都不是來自於偶然,而是時代所驅使的必然結果。 如果你問我:C語言有多偉大。那麼,我可能會想一下,說:多偉大我不知道,但是我知道很偉大。
  • 定義只有一個數組成員的C語言結構體有什麼用?
    在C語言程序開發中,有經驗的程式設計師有時會定義只有一個數組成員的結構體,雖然語法簡單,但是卻常常讓初學者感到迷惑:這麼做有什麼好處嗎?struct ABC {unsigned long array[MAX];} abc;
  • R語言中使用pie函數繪製餅圖
    也就是說我們想直觀的看某一樣本值在所有樣本總值中所佔的比例時,可以使用餅圖來表示。R語言中餅圖繪製函數在R語言中繪製餅圖的函數為pie,其使用格式如下:pie(x, labels = names(x), edges = 200, radius = 0.8,clockwise = FALSE, init.angle = if(clockwise) 90 else 0,density = NULL, angle = 45, col = NULL