• <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>

            關(guān)于main()函數(shù)(轉(zhuǎn))

            首先聲明,非本人原創(chuàng),轉(zhuǎn)自http://tieba.baidu.com/f?kz=259374701,寫(xiě)的非常好,謝謝原作者了。main()函數(shù)稱之為主函數(shù),一個(gè)C程序總是從main()函數(shù)開(kāi)始執(zhí)行的。

            一、main()函數(shù)的形式
            在最新的 C99 標(biāo)準(zhǔn)中,只有以下兩種定義方式是正確的:

            int main( void )--無(wú)參數(shù)形式
            {
            ...
            return 0;
            }

            int main( int argc, char *argv[] )--帶參數(shù)形式
            {
            ...
            return 0;
            }

            int指明了main()函數(shù)的返回類型,函數(shù)名后面的圓括號(hào)一般包含傳遞給函數(shù)的信息。void表示沒(méi)有給函數(shù)傳遞參數(shù)。關(guān)于帶參數(shù)的形式,我們等會(huì)討論。

            瀏覽老版本的C代碼,將會(huì)發(fā)現(xiàn)程序常常以

            main()

            這種形式開(kāi)始。C90標(biāo)準(zhǔn)允許這種形式,但是C99標(biāo)準(zhǔn)不允許。因此即使你當(dāng)前的編譯器允許,也不要這么寫(xiě)。

            你還可能看到過(guò)另一種形式:

            void main()

            有些編譯器允許這種形式,但是還沒(méi)有任何標(biāo)準(zhǔn)考慮接受它。C++ 之父 Bjarne Stroustrup 在他的主頁(yè)上的 FAQ 中明確地表示:void main( ) 的定義從來(lái)就不存在于 C++ 或者 C 。所以,編譯器不必接受這種形式,并且很多編譯器也不允許這么寫(xiě)。

            堅(jiān)持使用標(biāo)準(zhǔn)的意義在于:當(dāng)你把程序從一個(gè)編譯器移到另一個(gè)編譯器時(shí),照樣能正常運(yùn)行。


            二、main()函數(shù)的返回值

            從前面我們知道m(xù)ain()函數(shù)的返回值類型是int型的,而程序最后的 return 0; 正與之遙相呼應(yīng),0就是main()函數(shù)的返回值。那么這個(gè)0返回到那里呢?返回給操作系統(tǒng),表示程序正常退出。因?yàn)閞eturn語(yǔ)句通常寫(xiě)在程序的最后,不管返回什么值,只要到達(dá)這一步,說(shuō)明程序已經(jīng)運(yùn)行完畢。而return的作用不僅在于返回一個(gè)值,還在于結(jié)束函數(shù)。
            現(xiàn)在我們來(lái)做一個(gè)小試驗(yàn)(注意:本人的系統(tǒng)是Windows XP, 編譯環(huán)境是TC)來(lái)觀察main()函數(shù)的返回值。編寫(xiě)如下代碼并編譯運(yùn)行:

            //a.c
            #include "stdio.h"
            int main(void)
            {
            printf("I love you.");

            return 0;
            }

            將這個(gè)文件保存為a.c,編譯運(yùn)行后會(huì)生成一個(gè)a.exe文件?,F(xiàn)在打開(kāi)命令提示符,在命令行里運(yùn)行剛才編譯好的可執(zhí)行文件,然后輸入 echo %ERRORLEVEL% ,回車,就可以看到程序返回 一個(gè)0 。如果把 return 0; 改為 return 99; ,那么很顯然,再次執(zhí)行上述步驟以后你可以看到程序返回99。要是你這樣寫(xiě) return 99.99; 那還是返回99,因?yàn)?9.99被傳給操作系統(tǒng)之前,被強(qiáng)制類型轉(zhuǎn)換成整數(shù)類型了。
            現(xiàn)在,我們把a(bǔ).c改回原來(lái)的代碼,然后再編寫(xiě)另一個(gè)程序b.c:

            //b.c
            #include "stdio.h"
            int main(void)
            {
            printf("\nI'm too.");

            return 0;
            }

            編譯運(yùn)行后打開(kāi)命令提示符,在命令行里輸入a&&b 回車,這樣你就可以看到《人鬼情未了》里面經(jīng)典的愛(ài)情對(duì)白:

            I love you.
            I'm too.

            && 的含義是:如果 && 前面的程序正常退出,則繼續(xù)執(zhí)行 && 后面的程序,否則不執(zhí)行。所以,要是把a(bǔ).c里面的 return 0; 刪除或者改為 return 99; ,那么你只能看到 I love you. 。也就是說(shuō),程序b.c就不執(zhí)行了?,F(xiàn)在,大家該明白 return 0; 的作用了吧。


            三、main()函數(shù)的參數(shù)

            C編譯器允許main()函數(shù)沒(méi)有參數(shù),或者有兩個(gè)參數(shù)(有些實(shí)現(xiàn)允許更多的參數(shù),但這只是對(duì)標(biāo)準(zhǔn)的擴(kuò)展)。這兩個(gè)參數(shù),一個(gè)是int類型,一個(gè)是字符串類型。第一個(gè)參數(shù)是命令行中的字符串?dāng)?shù)。按照慣例(但不是必須的),這個(gè)int參數(shù)被稱為argc(argument count)。大家或許現(xiàn)在才明白這個(gè)形參為什么要取這么個(gè)奇怪的名字吧,呵呵!至于英文的意思,自己查字典吧。第二個(gè)參數(shù)是一個(gè)指向字符串的指針數(shù)組。命令行中的每個(gè)字符串被存儲(chǔ)到內(nèi)存中,并且分配一個(gè)指針指向它。按照慣例,這個(gè)指針數(shù)組被稱為argv(argument value)。系統(tǒng)使用空格把各個(gè)字符串格開(kāi)。一般情況下,把程序本身的名字賦值給argv[0],接著,把最后的第一個(gè)字符串賦給argv[1],等等。
             現(xiàn)在我們來(lái)看一個(gè)例子:

            //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;
            }
            編譯運(yùn)行,在命令行輸入c I love you 回車,下面是從命令行運(yùn)行該程序的結(jié)果:

            The command line has 3 arguments:
            1:I
            2:love
            3:you

            從本例可以看出,程序從命令行中接受到4個(gè)字符串(包括程序名),并將它們存放在字符串?dāng)?shù)組中,其對(duì)應(yīng)關(guān)系:
            argv[0] ------> c(程序名)
            argv[1] ------> I
            argv[2] ------> love
            argv[3] ------> you
            至于argc的值,也即是參數(shù)的個(gè)數(shù),程序在運(yùn)行時(shí)會(huì)自動(dòng)統(tǒng)計(jì),不必我們操心。
            這個(gè)例子中,每個(gè)字符串都時(shí)一個(gè)單詞(字母),那既然是字符串,要把一句話當(dāng)作參數(shù)賦給程序該怎么辦?你可以在命令行里這樣輸入 c "I love you." "I'm too."。程序運(yùn)行結(jié)果:

            The command line has 2 arguments:
            1:I love you.
            2:I'm too.

            其對(duì)應(yīng)關(guān)系:
            argv[0] ------> c(程序名)
            argv[1] ------> I love you.
            argv[2] ------> I'm too.

            要注意的是,你在命令行的輸入都將作為字符串形式存儲(chǔ)于內(nèi)存中。也就是說(shuō),如果你輸入一個(gè)數(shù)字,那么要輸出這個(gè)數(shù)字,你應(yīng)該用%s格式而非%d或者其他。
            再來(lái)看一個(gè)例子:
            //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;
            }
            編譯運(yùn)行,打開(kāi)命令行并輸入d love.txt 回車。這樣,打開(kāi)d.c文件所在的目錄,你會(huì)發(fā)現(xiàn)多了一個(gè)名為 love.txt 的文件,打開(kāi)后里面的內(nèi)容正是世界上說(shuō)的最多的那句話。
            當(dāng)然,你可能會(huì)說(shuō)我不需要使用命令行參數(shù)就可以做到這些。是的,你當(dāng)然可以。使用命令行參數(shù)的理由或許就是練習(xí)命令行用法,以備以后需要編寫(xiě)基于命令行的程序。還有一個(gè)好處是,不需要C環(huán)境就可以運(yùn)行已經(jīng)編譯好的程序。比如,你把上面那個(gè)程序編譯后生成的d.exe發(fā)給你的女朋友,再告訴她怎么運(yùn)行,這樣,你的女朋友可以用另一種方式體會(huì)到你對(duì)她的濃情蜜意。

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


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            <2011年5月>
            24252627282930
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿

            隨筆分類

            隨筆檔案

            文章檔案

            C++/C

            搜索

            積分與排名

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            一本色道久久99一综合| 日韩电影久久久被窝网| 亚洲欧美日韩久久精品第一区 | 久久精品国产亚洲AV忘忧草18| 久久久久波多野结衣高潮| 亚洲国产精品久久久天堂| 久久ZYZ资源站无码中文动漫 | 久久综合精品国产二区无码| 久久av无码专区亚洲av桃花岛| 国产成人AV综合久久| 亚洲午夜久久久| 天天久久狠狠色综合| 无码国内精品久久综合88| 久久99精品久久久久久| 久久亚洲国产精品成人AV秋霞| 国产精品一区二区久久精品| 久久久亚洲裙底偷窥综合| 女人香蕉久久**毛片精品| 亚洲中文久久精品无码| 久久久久黑人强伦姧人妻| 国产精品久久久久久| 精品久久久无码人妻中文字幕| 国产一区二区精品久久凹凸| 久久精品中文字幕无码绿巨人 | 久久精品成人| 国产精品久久久久国产A级| 亚洲七七久久精品中文国产 | 久久婷婷人人澡人人| 国产精品久久久久久久久| 99久久这里只精品国产免费| 久久精品成人免费国产片小草| 久久国产一区二区| 国产精品久久久久9999| www性久久久com| 97久久久精品综合88久久| av午夜福利一片免费看久久| 精品久久久久久亚洲精品 | 91精品国产91久久综合| 久久精品国产亚洲AV无码偷窥| 日本欧美久久久久免费播放网| 久久久无码精品亚洲日韩京东传媒|