程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 探尋main函數的“標准”寫法,以及獲取main函數的參數、返回值,探尋main

探尋main函數的“標准”寫法,以及獲取main函數的參數、返回值,探尋main

編輯:關於C語言

探尋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函數的描述:

       再看C++標准文檔裡對main函數的描述:

       附:標准文檔下載跳轉鏈接——C語言標准

                                                ——C++標准

       

       至此,可以看到,在C語言中,標准寫法是int main(void)和int main(int argc, char *argv[]),在C++中,標准寫法是int main()和int main(int argc, char *argv[])

       那麼寫成main()或者void main()到底行不行?答案是不一定行。在舊的編譯器上,這樣寫也能通過,但主要是為了兼容C/C++標准未出來之前的歷史代碼。在較新的編譯器上,這樣寫都會得到一個警告信息,或者,干脆就是錯誤信息,無法通過編譯。所以,為了代碼的規范性,通用性,請堅持按標准文檔裡推薦的寫法來寫。尤其是初學者,按標准來寫是一種很好的習慣,而編程中的好習慣甚至比編程本身還重要!

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

       此外,也許還有人對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]為空指針:

       打開cmd命令窗口,切換至程序所在目錄,為本程序傳入參數:

       顯然,打印出的參數內容與我們的預期一致。

 

獲取main函數的返回值

       同理,main函數既然為系統返回了信號,那麼系統也一定可以獲取到它。重寫編寫源文件,這次我們把無關部分全部略去,只剩返回值。

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

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

 

小結

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

       編程中,一些語法是標准所強制要求的,另一些語法標准裡並未強制要求,而是建議,或者連建議都沒,只是由編譯器的實現而定。這時候,就要盡量按標准裡強制的或者建議的語法去書寫程序,這樣做可以極大地保證程序的健壯性。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved