• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            關于main()函數(轉)

            首先聲明,非本人原創,轉自http://tieba.baidu.com/f?kz=259374701,寫的非常好,謝謝原作者了。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發給你的女朋友,再告訴她怎么運行,這樣,你的女朋友可以用另一種方式體會到你對她的濃情蜜意。

            posted on 2011-05-31 23:42 古月 閱讀(245) 評論(0)  編輯 收藏 引用

            <2011年6月>
            2930311234
            567891011
            12131415161718
            19202122232425
            262728293012
            3456789

            導航

            統計

            常用鏈接

            留言簿

            隨筆分類

            隨筆檔案

            文章檔案

            C++/C

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            欧美日韩久久中文字幕| 久久久久女教师免费一区| 久久伊人精品一区二区三区| 国内精品久久久久影院老司| 2020久久精品亚洲热综合一本| 久久久久人妻一区二区三区| 久久精品国产第一区二区三区| 久久本道伊人久久| 亚洲国产精品无码久久一区二区 | 久久本道久久综合伊人| 日日狠狠久久偷偷色综合96蜜桃 | 一本久久a久久精品vr综合| 日本福利片国产午夜久久| 久久久久久久91精品免费观看| 久久精品99久久香蕉国产色戒| 久久精品国产99久久丝袜| 久久国产精品成人片免费| 热久久最新网站获取| 一本色道久久88加勒比—综合| 亚洲综合伊人久久综合| 久久久艹| 久久性生大片免费观看性| 国产精品久久久天天影视香蕉| 欧美噜噜久久久XXX| 亚洲第一极品精品无码久久| 热久久国产欧美一区二区精品| 热99re久久国超精品首页| 欧美一区二区三区久久综合| 久久久久精品国产亚洲AV无码| 欧美性大战久久久久久| 久久91这里精品国产2020| 国产99久久九九精品无码| 久久九九有精品国产23百花影院| 日韩精品久久久肉伦网站| 麻豆成人久久精品二区三区免费| 久久婷婷国产剧情内射白浆| 国产精品成人久久久| 久久久人妻精品无码一区| 久久99国产精品久久99小说 | 国产精品99久久久久久猫咪| 国产精品久久亚洲不卡动漫|