c的設計原則是把函式作為程式的構成模組。main()函式稱之為主函式,乙個c程式總是從main()函式開始執行的。
在最新的 c99 標準中,只有以下兩種定義方式是正確的:
int main( void ) /* 無引數形式 */
int main( int argc, char *argv ) /* 帶引數形式 */
int指明了main()函式的返回型別,函式名後面的圓括號一般包含傳遞給函式的資訊。void表示沒有給函式傳遞引數。關於帶引數的形式,我們等會討論。
瀏覽老版本的c**,將會發現程式常常以。
main()
這種形式開始。c90標準允許這種形式,但是c99標準不允許。因此即使你當前的編譯器允許,也不要這麼寫。
你還可能看到過另一種形式。
void main()
有些編譯器允許這種形式,但是還沒有任何標準考慮接受它。c++ 之父 bjarne stroustrup 在他的主頁上的 faq 中明確地表示:void main( ) 的定義從來就不存在於 c++ 或者 c 。所以,編譯器不必接受這種形式,並且很多編譯器也不允許這麼寫。
堅持使用標準的意義在於:當你把程式從乙個編譯器移到另乙個編譯器時,照樣能正常執行。
從前面我們知道main()函式的返回值型別是int型的,而程式最後的 return 0; 正與之遙相呼應,0就是main()函式的返回值。那麼這個0返回到那裡呢?返回給作業系統,表示程式正常退出。因為return語句通常寫在程式的最後,不管返回什麼值,只要到達這一步,說明程式已經執行完畢。而return的作用不僅在於返回乙個值,還在於結束函式。
現在我們來做乙個小試驗(注意:本人的系統是windows xp, 編譯環境是tc)來觀察main()函式的返回值。編寫如下**並編譯執行:
#include "stdio.h"
int main(void)
將這個檔案儲存為a.c,編譯執行後會生成乙個a.exe檔案。現在開啟命令提示符,在命令列裡執行剛才編譯好的可執行檔案,然後輸入 echo %errorlevel% ,回車,就可以看到程式返回 乙個0 。如果把 return 0; 改為 return 99; ,那麼很顯然,再次執行上述步驟以後你可以看到程式返回99。要是你這樣寫 return 99.99; 那還是返回99,因為99.99被傳給作業系統之前,被強制型別轉換成整數型別了。
現在,我們把a.c改回原來的**,然後再編寫另乙個程式b.c:
#include "stdio.h"
int main(void)
編譯執行後開啟命令提示符,在命令列裡輸入a&&b 回車,這樣你就可以看到《人鬼情未了》裡面經典的愛情對白:
i love you.
i』m too.
&& 的含義是:如果 && 前面的程式正常退出,則繼續執行 && 後面的程式,否則不執行。所以,要是把a.c裡面的 return 0; 刪除或者改為 return 99; ,那麼你只能看到 i love you. 。也就是說,程式b.c就不執行了。現在,大家該明白 return 0; 的作用了吧。
c編譯器允許main()函式沒有引數,或者有兩個引數(有些實現允許更多的引數,但這只是對標準的擴充套件)。這兩個引數,乙個是int型別,乙個是字串型別。第乙個引數是命令列中的字串數。按照慣例(但不是必須的),這個int引數被稱為argc(argument count)。大家或許現在才明白這個形參為什麼要取這麼個奇怪的名字吧,呵呵!至於英文的意思,自己查字典吧。第二個引數是乙個指向字串的指標陣列。命令列中的每個字串被儲存到記憶體中,並且分配乙個指標指向它。按照慣例,這個指標陣列被稱為argv(argument value)。系統使用空格把各個字串格開。一般情況下,把程式本身的名字賦值給argv[0],接著,把最後的第乙個字串賦給argv[1],等等。
現在我們來看乙個例子:
#include "stdio.h"
int main(int argc, char *argv)
編譯執行,在命令列輸入c i love you 回車,下面是從命令列執行該程式的結果:
the command line has 3 arguments:
1:i2:love
3:you
從本例可以看出,程式從命令列中接受到4個字串(包括程式名),並將它們存放在字串陣列中,其對應關係:
argv[0] ------> c(程式名)
argv[1] ------> i
argv[2] ------> love
argv[3] ------> you
至於argc的值,也即是引數的個數,程式在執行時會自動統計,不必我們操心。
這個例子中,每個字串都時乙個單詞(字母),那既然是字串,要把一句話當作引數賦給程式該怎麼辦?你可以在命令列裡這樣輸入 c "i love you." "i』m too."。程式執行結果:
the command line has 2 arguments:
1:i love you.
2:i』m too.
其對應關係:
argv[0] ------> c(程式名)
argv[1] ------> i love you.
argv[2] ------> i』m too.
要注意的是,你在命令列的輸入都將作為字串形式儲存於記憶體中。也就是說,如果你輸入乙個數字,那麼要輸出這個數字,你應該用%s格式而非%d或者其他。
再來看乙個例子:
#include "stdio.h"
int main(int argc, char *argv)
編譯執行,開啟命令列並輸入d love.txt 回車。這樣,開啟d.c檔案所在的目錄,你會發現多了乙個名為 love.txt 的檔案,開啟後裡面的內容正是世界上說的最多的那句話。
當然,你可能會說我不需要使用命令列引數就可以做到這些。是的,你當然可以。使用命令列引數的理由或許就是練習命令列用法,以備以後需要編寫基於命令列的程式。還有乙個好處是,不需要c環境就可以執行已經編譯好的程式。比如,你把上面那個程式編譯後生成的d.exe發給你的女朋友,再告訴她怎麼執行,這樣,你的女朋友可以用另一種方式體會到你對她的濃情蜜意。
C語言main 函式詳解
c的設計原則是把函式作為程式的構成模組。main 函式稱之為主函式,乙個c程式總是從main 函式開始執行的。在最新的 c99 標準中,只有以下兩種定義方式是正確的 int main void 無引數形式 int main int argc,char argv 帶引數形式 int指明了main 函式...
C語言main 函式詳解
c的設計原則是把函式作為程式的構成模組。main 函式稱之為主函式,乙個c程式總是從main 函式開始執行的。一 main 函式的形式 在最新的 c99 標準中,只有以下兩種定義方式是正確的 int main void 無引數形式 int main int argc,char argv 帶引數形式 ...
C語言main函式
c語言中main函式是可以帶引數的,平時寫倒是沒怎麼用這個引數,學習了一下這個引數。c語言規定了main函式只能有兩個引數,並且其型別也規定了,習慣上把他們寫成 main int argc char argv 第乙個引數是整形,第二個引數是指向字串的指標陣列,為什麼這麼定義?有什麼用?c語言還規定了...