C語言之main()函數
來源:互聯網
上載者:User
C的設計原則是把函數作為程式的構成模組。main()函數稱之為主函數,一個C程式總是從main()函數開始執行的。
一、main()函數的形式
在最新的 C99 標準中,只有以下兩種定義方式是正確的:
int main( void )--無參數形式
{
...
return 0;
}
int main( int argc, char *argv[] )--帶參數形式
{
...
return 0;
}
int指明了main()函數的傳回型別,函數名後面的圓括弧一般包含傳遞給函數的資訊。void表示沒有給函數傳遞參數。關於帶參數的形式,我們等會討論。
瀏覽老版本的C代碼,將會發現程式常常以
main()
這種形式開始。C90標準允許這種形式,但是C99標準不允許。因此即使你當前的編譯器允許,也不要這麼寫。
你還可能看到過另一種形式:
void main()
有些編譯器允許這種形式,但是還沒有任何標準考慮接受它。C++ 之父 Bjarne Stroustrup 在他的首頁上的 FAQ 中明確地表示:void main( ) 的定義從來就不存在於 C++ 或者 C 。所以,編譯器不必接受這種形式,並且很多編譯器也不允許這麼寫。
堅持使用標準的意義在於:當你把程式從一個編譯器移到另一個編譯器時,照樣能正常運行。
二、main()函數的傳回值
從前面我們知道main()函數的傳回值類型是int型的,而程式最後的 return 0; 正與之遙相呼應,0就是main()函數的傳回值。那麼這個0返回到那裡呢?返回給作業系統,表示程式正常退出。因為return語句通常寫在程式的最後,不管返回什麼值,只要到達這一步,說明程式已經運行完畢。而return的作用不僅在於返回一個值,還在於結束函數。
現在我們來做一個小實驗(注意:本人的系統是Windows XP, 編譯環境是TC)來觀察main()函數的傳回值。編寫如下代碼並編譯運行:
//a.c
#include "stdio.h"
int main(void)
{
printf("I love you.");
return 0;
}
將這個檔案儲存為a.c,編譯運行後會產生一個a.exe檔案。現在開啟命令提示字元,在命令列裡運行剛才編譯好的可執行檔,然後輸入 echo %ERRORLEVEL% ,斷行符號,就可以看到程式返回 一個0 。如果把 return 0; 改為 return 99; ,那麼很顯然,再次執行上述步驟以後你可以看到程式返回99。要是你這樣寫 return 99.99; 那還是返回99,因為99.99被傳給作業系統之前,被強制類型轉換成整數類型了。
現在,我們把a.c改回原來的代碼,然後再編寫另一個程式b.c:
//b.c
#include "stdio.h"
int main(void)
{
printf("/nI'm too.");
return 0;
}
編譯運行後開啟命令提示字元,在命令列裡輸入a&&b 斷行符號,這樣你就可以看到《人鬼情未了》裡面經典的愛情對白:
I love you.
I'm too.
&& 的含義是:如果 && 前面的程式正常退出,則繼續執行 && 後面的程式,否則不執行。所以,要是把a.c裡面的 return 0; 刪除或者改為 return 99; ,那麼你只能看到 I love you. 。也就是說,程式b.c就不執行了。現在,大家該明白 return 0; 的作用了吧。
三、main()函數的參數
C編譯器允許main()函數沒有參數,或者有兩個參數(有些實現允許更多的參數,但這隻是對標準的擴充)。這兩個參數,一個是int類型,一個是字串類型。第一個參數是命令列中的字串數。按照慣例(但不是必須的),這個int參數被稱為argc(argument count)。大家或許現在才明白這個形參為什麼要取這麼個奇怪的名字吧,呵呵!至於英文的意思,自己查字典吧。第二個參數是一個指向字串的指標數組。命令列中的每個字串被儲存到記憶體中,並且分配一個指標指向它。按照慣例,這個指標數組被稱為argv(argument value)。系統使用空格把各個字串格開。一般情況下,把程式本身的名字賦值給argv[0],接著,把最後的第一個字串賦給argv[1],等等。
現在我們來看一個例子:
//c.c
#include "stdio.h"
int main(int argc, char *argv[])
{
int count;
printf("The command line has %d arguments: /n",argc-1);
for(count=1;count<argc;count++)
printf("%d: %s/n",count,argv[count]);
return 0;
}
編譯運行,在命令列輸入c I love you 斷行符號,下面是從命令列運行該程式的結果:
The command line has 3 arguments:
1:I
2: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或者其他。
再來看一個例子:
//d.c
#include "stdio.h"
int main(int argc, char *argv[])
{
FILE *fp;
fp=fopen(argv[1],"w");
fputs("I love you.",fp);
fclose(fp);
return 0;
}
編譯運行,開啟命令列並輸入d love.txt 斷行符號。這樣,開啟d.c檔案所在的目錄,你會發現多了一個名為 love.txt 的檔案,開啟后里面的內容正是世界上說的最多的那句話。
當然,你可能會說我不需要使用命令列參數就可以做到這些。是的,你當然可以。使用命令列參數的理由或許就是練習命令列用法,以備以後需要編寫基於命令列的程式。還有一個好處是,不需要C環境就可以運行已經編譯好的程式。比如,你把上面那個程式編譯後產生的d.exe發給你的女朋友,再告訴她怎麼運行,這樣,你的女朋友可以用另一種方式體會到你對她的濃情蜜意。