天天看點

探尋main函數的标準寫法,以及擷取main函數的參數、傳回值main函數表示法main函數的标準寫法main函數為什麼要有傳回值和參數值擷取main函數的參數值擷取main函數的傳回值小結

▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼

main函數表示法

        很多同學在初學C或者C++時,都見過各種各樣的main函數表示法:

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

        看過這麼多寫法之後,不禁頓生疑惑,到底哪個才是main函數的标準寫法?

main函數的标準寫法

        先看C語言标準文檔裡對main函數的描述:

探尋main函數的标準寫法,以及擷取main函數的參數、傳回值main函數表示法main函數的标準寫法main函數為什麼要有傳回值和參數值擷取main函數的參數值擷取main函數的傳回值小結

        再看C++标準文檔裡對main函數的描述:

探尋main函數的标準寫法,以及擷取main函數的參數、傳回值main函數表示法main函數的标準寫法main函數為什麼要有傳回值和參數值擷取main函數的參數值擷取main函數的傳回值小結

        至此,哪些是标準寫法便一目了然。

        那麼寫成main()或者void main()到底行不行?答案是不一定行。在舊的編譯器上,這樣寫也能通過,但主要是為了相容C/C++标準未出來之前的曆史代碼。在較新的編譯器上,這樣寫都會得到一個警告資訊,或者,幹脆就是錯誤資訊,無法通過編譯。

        是以,為了代碼的規範性,通用性,請堅持按标準文檔裡推薦的寫法來寫。尤其是初學者,按标準來寫是一種很好的習慣,而程式設計重的好習慣甚至比程式設計本身還重要!

        那麼也有人疑惑main函數第二個參數到底是char *argv[]還是char **argv?答案是都行,argv首先是一個數組,其數組元素的類型是字元指針,每一個字元指針都指向一個特定的字元串,如下圖:

探尋main函數的标準寫法,以及擷取main函數的參數、傳回值main函數表示法main函數的标準寫法main函數為什麼要有傳回值和參數值擷取main函數的參數值擷取main函數的傳回值小結

        此外,也許還有人對main函數的參數名稱有疑問,既然main函數也是個函數,那麼它的參數名稱argc、argv可以替換成其它合法的辨別符嗎?這個答案也是肯定的,如果心血來潮,寫成int main(int a, char *b[])這種形式也是被允許的,但是仍然建議按argc、argv寫,避免不必要的疑惑。

main函數為什麼要有傳回值和參數值

        簡單地說,為了與系統環境通信。

        main函數是系統執行程式的入口,可以将main函數看做是供系統調用的。既然系統可以調用main函數,那麼系統就有為main函數傳遞指令(參數)的需求,同時,main函數也有為系統環境傳回信号的義務。這樣一來,參數充當入口,return充當出口,使得main函數的功能更加完善。

擷取main函數的參數值

        既然main函數可以有參數,那麼就一定可以擷取它的參數值,隻要為它傳入指定的實參,就可以在main函數中把它列印出來。

        先寫一段列印參數的代碼,命名為text.c,編譯,預設結果顯示argv[0]存儲函數名稱及其路徑,而argv[argc]為空指針:

探尋main函數的标準寫法,以及擷取main函數的參數、傳回值main函數表示法main函數的标準寫法main函數為什麼要有傳回值和參數值擷取main函數的參數值擷取main函數的傳回值小結

        打開cmd指令視窗,切換至程式所在目錄,為本程式傳入參數:

探尋main函數的标準寫法,以及擷取main函數的參數、傳回值main函數表示法main函數的标準寫法main函數為什麼要有傳回值和參數值擷取main函數的參數值擷取main函數的傳回值小結

        顯然,列印出的參數内容與我們的預期一緻。

擷取main函數的傳回值

        同理,main函數既然為系統傳回了信号,那麼系統也一定可以擷取到它。重寫編寫源檔案,這次我們把無關部分全部略去,隻剩傳回值。

        先編譯,然後打開cmd視窗切換至目前程式目錄下,輸入text.exe,回車後,再輸入echo %errorlevel%,然後就可以看到列印出的傳回值了:

探尋main函數的标準寫法,以及擷取main函數的參數、傳回值main函數表示法main函數的标準寫法main函數為什麼要有傳回值和參數值擷取main函數的參數值擷取main函數的傳回值小結

        除了這種方法,也可以用main函數調用main函數本身來列印它的傳回值,但是這樣做就相當于讓main函數進入了遞歸調用當中,必須設定恰當的終止條件,否則程式将陷入無限遞歸,進而崩潰。

探尋main函數的标準寫法,以及擷取main函數的參數、傳回值main函數表示法main函數的标準寫法main函數為什麼要有傳回值和參數值擷取main函數的參數值擷取main函數的傳回值小結

小結

        由此可以看出,main函數除了可以與系統通信外,與普通函數還是很一緻的,說到底,它也隻是個函數麼。

        程式設計中,一些文法是标準所強制要求的,另一些文法标準裡并未強制要求,而是建議,或者連建議都沒,隻是由編譯器的實作而定。這時候,就要盡量按标準裡強制的或者建議的文法去書寫程式,這樣做可以極大地保證程式的健壯性。

▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲