• <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>
            posts - 16,  comments - 34,  trackbacks - 0

            一、依據(jù)

            C++標(biāo)準(zhǔn)規(guī)定:main函數(shù)可以省略返回語句,等效于返回0。

            5. A return statement in main has the effect of leaving the main function (destroying any objects with automatic storage duration) and calling exit with the return value as the argument.
            If control reaches the end of main without encountering a return statement, the effect is that of executing
            return 0;

                            ——ISO C++03 3.6.1 Main function p44/72
                            ——ISO C++98 3.6.1 Main function p43/69

            注意:
            1. main函數(shù)的返回類型是int, 不是void或者其他類型。
            2. 該規(guī)則僅僅對(duì)main函數(shù)適用。
            3. 對(duì)其他函數(shù),如果省略返回值, 將得到一個(gè)警告
            4. 應(yīng)該避免3的情況。




            二、 示例

                    二、1. 一個(gè)合法的最小化的完整C++程序如下:
            int main() {}

                    二、2. 省略的確切含義

            同時(shí),標(biāo)準(zhǔn)中的用語是很考究的:
            “當(dāng)控制到達(dá)main結(jié)束處時(shí)沒有遇到return語句,效果與返回0相同”。

            即是說,標(biāo)準(zhǔn)規(guī)定的是“對(duì)省略return的分支,認(rèn)為返回0”。
            同時(shí),標(biāo)準(zhǔn)也允許其他分支含有返回語句。
            如下:
            int main(int argc,char* []) {
                
            switch (argc)
                {
                
            case 1:
                    
            // error, should passing argument
                    return -1;
                    
            // parse arguments
                default:
                
            case 3// parser argv[2]
                case 2// parser argv[1]
                    ;
                }
                
            // do some work
                
            // control reaches here
            }

            沒有輸入命令行參數(shù)時(shí), 返回一個(gè)錯(cuò)誤。
            其他情況,當(dāng)控制達(dá)到main的結(jié)尾處時(shí),效果同return 0;

                    二、3. 對(duì)于其他函數(shù),沒有這種“優(yōu)待”
            如:
            int not_main(int argc) {
                
            if (argc<=1)
                    
            return -1;
            }
            int main(int argc,char* []) {
                
            return not_main(argc);
            }

            not_main無疑將得到一個(gè)警告。
            程序在沒有輸入命令行參數(shù)時(shí)的返回值將無法預(yù)知



            三、驗(yàn)證

                    三、1. ERRORLEVEL

            windows下,可以通過 %ERRORLEVEL% 查詢上一次程序返回值。

            結(jié)果與判斷相吻合:
            1. minimalist有確定的返回值0
            2. omit_return_in_main有確定的返回值-1或0
            3. 對(duì)omit_return_in_other
            3.1 有命令行參數(shù)時(shí),返回值確定為0。
            3.2 無命令行參數(shù)時(shí),返回值無法預(yù)知


                    三、2 匯編代碼

            更嚴(yán)謹(jǐn)?shù)尿?yàn)證方法是查看匯編代碼。

            可以看到,在minimalist與omit_return_in_main的main函數(shù)中都有將eax置0的代碼。
            在omit_return_in_other中的not_main函數(shù)中,沒有這樣的代碼。




            四、 例外

            VC6在這點(diǎn)上與標(biāo)準(zhǔn)不符。

                    四、1. 對(duì)omit_return_in_main,它給出的警告:

            warning C4715: 'main' : not all control paths return a value

            說明它在這點(diǎn)上與標(biāo)準(zhǔn)不符。
            顯然,在有命令行參數(shù)的時(shí)候,程序結(jié)果無法預(yù)知


                    四、2. 對(duì)minimalist,它給出的警告很搞笑:

            warning C4508: 'main' : function should return a value; 'void' return type assumed

            暴露出它另一個(gè)與標(biāo)準(zhǔn)不符的地方——main返回void。
            顯然,任何情況下,程序結(jié)果都無法預(yù)知

                    四、3. 對(duì)omit_return_in_other,是程序員的錯(cuò)誤。




            五、 實(shí)踐

            不知道為什么C++標(biāo)準(zhǔn)在這里開一個(gè)“后門”。
            ——C++在許多地方都是很嚴(yán)謹(jǐn)的。

            在實(shí)際應(yīng)用中,盡量不要采用這一特性, 因?yàn)椋?br>1. 舊編譯器不支持
            2. C不支持——如果希望main能同時(shí)按C語言編譯的話

            對(duì)于演示用的C++代碼,與主題無關(guān)的代碼行能省則省,則可以使用這一特性。
            比如:C++標(biāo)準(zhǔn)中的示例代碼幾乎都采用了這一特性。
            由此可得出,C++標(biāo)準(zhǔn)在這里開后門的原因是——讓C++標(biāo)準(zhǔn)更薄^_^



            相關(guān)鏈接:

            ——示例代碼
            http://immature.googlecode.com/svn/trunk/iMmature/sample/omit_return_in_main



            Creative Commons License
            作品采用知識(shí)共享署名-非商業(yè)性使用-相同方式共享 2.5 中國大陸許可協(xié)議進(jìn)行許可。

            轉(zhuǎn)載請(qǐng)注明 :
            文章作者 - OwnWaterloo
            發(fā)表時(shí)間 - 2009年04月26日
            原文鏈接 - http://m.shnenglu.com/ownwaterloo/archive/2009/04/26/omit_return_in_main.html

            posted on 2009-04-26 14:37 OwnWaterloo 閱讀(3485) 評(píng)論(1)  編輯 收藏 引用

            FeedBack:
            # re: main函數(shù)中省略返回語句[未登錄]
            2013-04-14 23:22 | null

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


            <2025年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            常用鏈接

            留言簿(8)

            隨筆檔案(16)

            鏈接

            搜索

            •  

            積分與排名

            • 積分 - 198661
            • 排名 - 134

            最新隨筆

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            国产精品女同久久久久电影院| 久久综合九色综合欧美狠狠| 亚洲午夜久久久| 久久综合久久美利坚合众国 | AV狠狠色丁香婷婷综合久久| 国内精品久久久久久不卡影院| 国产亚洲精久久久久久无码77777| 久久无码av三级| 精品国产乱码久久久久久人妻| 一级做a爰片久久毛片16| 一本色道久久综合狠狠躁| 久久se精品一区二区影院 | 久久996热精品xxxx| 久久无码人妻一区二区三区午夜| 久久www免费人成看国产片| 97久久国产亚洲精品超碰热 | 99久久免费只有精品国产| 人妻丰满AV无码久久不卡| 婷婷久久五月天| 精品无码久久久久久久动漫| 久久se精品一区精品二区| 久久精品人人做人人爽电影蜜月| 狠狠色丁香久久婷婷综合蜜芽五月| 成人精品一区二区久久| 国内精品久久九九国产精品| 久久久久人妻精品一区二区三区 | 一本久久精品一区二区| 久久国产精品免费一区| 国产99久久久国产精免费| 色综合久久最新中文字幕| 久久99精品国产99久久6男男| 激情伊人五月天久久综合| 久久天天躁狠狠躁夜夜96流白浆| 99久久精品免费看国产一区二区三区| 久久综合伊人77777麻豆| 久久久久香蕉视频| 一本一道久久a久久精品综合| 久久综合九色综合久99| 伊人色综合九久久天天蜜桃| 久久久久亚洲国产| 午夜人妻久久久久久久久|