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

            一個沒有返回值的函數

            如果在返回值為int的函數里,漏掉return,會發生什么情況?

            編譯工具:Code::Blocks 10.05,代碼如下所示


            #include 
            <cstdio>

            int f() 
            {
            }
            int main ()
            {

                printf(
            "%d ",f());
                printf(
            "%d ",f());
                printf(
            "%d ",f());

                
            return 0;
            }
            編譯時,提示
            In function 'int f()':|
            warning: no return statement in function returning non-void|
            但是能編譯

            Debug版本下結果如下:
            1 2 2
            Release版本下結果
            0 0 0

            下面分析一下為什么為發生這種情況:

            從code:: blocks里面看到的 函數f的匯編代碼
            00401318    push   %ebp
            00401319    mov    %esp,%ebp  //正確的似乎是 mov %ebp %esp
            0040131B    leave
            0040131C    ret
            如果函數f()如下定義
            int f()
            {
                
            return 100;
            }
            則匯編代碼是
            00401318    push   %ebp
            00401319    mov    %esp,%ebp
            0040131B    mov    $
            0x64,%eax
            00401320    leave
            00401321    ret
            接下來我們看一下整個main函數的匯編代碼
            00401322    push   %ebp
            00401323    mov    %esp,%ebp
            00401325    and    $0xfffffff0,%esp
            00401328    sub    $0x10,%esp
            0040132B    call   
            0x401770 <__main>
            00401330    call   0x401318 <f()>
            00401335    mov    %eax,0x4(%esp)
            00401339    movl   $0x403024,(%esp)
            00401340    call   0x4019ac <printf>
            00401345    call   0x401318 <f()>
            0040134A    mov    
            %eax,0x4(%esp)//將返回值傳遞給%esp+0x04
            0040134E    movl   $0x403024,(%esp)
            00401355    call   0x4019ac <printf>
            0040135A    call   
            0x401318 <f()>
            0040135F    mov    
            %eax,0x4(%esp)
            00401363    movl   $0x403024,(%esp)
            0040136A    call   
            0x4019ac <printf>
            0040136F    mov    $
            0x0,%eax
            00401374    leave
            00401375    ret


            從中我們可以看出,函數f()是將返回值通過EAX寄存器中,傳遞給調用它的代碼。
            如過我們漏掉了return intVal語句,在Debug模式下可能會導致,調用f()的代碼得到的是上次的其他函數被調用的返回值。
            在進入main之后EAX通常會被初始化為0x01.所以第一個f() 返回值為1.
            printf 打印了“1 ”兩個字符之后,返回值為2,所以第二個f()返回值為2。
            printf 打印了“2 ”兩個字符之后,返回值為2,所以第三個f()返回值為2。


            在Release版本下,函數f()被優化,printf直接打印數字0。
             
              401320:    push   %ebp
              
            401321:    mov    %esp,%ebp
              
            401323:    and    $0xfffffff0,%esp
              
            401326:    sub    $0x10,%esp
              
            401329:    call   0x401760
              40132e:    movl   $
            0x0,0x4(%esp)
              
            401335:    
              
            401336:    movl   $0x403024,(%esp)
              40133d:    call   
            0x40199c
              
            401342:    movl   $0x0,0x4(%esp)
              
            401349:    
              40134a:    movl   $
            0x403024,(%esp)
              
            401351:    call   0x40199c
              
            401356:    movl   $0x0,0x4(%esp)
              40135d:    
              40135e:    movl   $
            0x403024,(%esp)
              
            401365:    call   0x40199c
              40136a:    xor    
            %eax,%eax
              40136c:    leave  
              40136d:    ret      

            posted on 2010-07-18 01:06 role0523 閱讀(5148) 評論(0)  編輯 收藏 引用

            導航

            <2010年7月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            統計

            常用鏈接

            留言簿

            隨筆檔案

            搜索

            最新評論

            • 1.?re: i++與++i
            • @role0523
              基本上是沒有去區別的,有時候++i能被優化掉,但很多時候編譯器能發現他們是一樣的,所以沒有區別。
            • --chaogu
            • 2.?re: i++與++i
            • @chaogu
              忘記在誰的blog上看到在比較i++和++i哪個操作更高效,于是就看看他們匯編指令的條數。其實大多數時候都是一樣的。
            • --role0523
            • 3.?re: 數組越界的陷阱
            • @陳梓瀚(vczh)
              嵌入式項目中 vector還是比較慎用的
            • --role0523
            • 4.?re: 數組越界的陷阱
            • 不如用vector代替你的if
            • --陳梓瀚(vczh)
            • 5.?re: i++與++i
            • 用匯編表達了一個很早就被默認了的定理,好還是不好呢?
            • --chaogu

            閱讀排行榜

            評論排行榜

            日本福利片国产午夜久久| 精品国产VA久久久久久久冰 | 国产 亚洲 欧美 另类 久久| 久久久久中文字幕| 久久久久亚洲AV综合波多野结衣| 日批日出水久久亚洲精品tv| 久久精品亚洲AV久久久无码| 国产亚洲美女精品久久久久狼| 久久福利片| 2020久久精品国产免费| 久久精品国产精品亚洲艾草网美妙| 久久精品国产亚洲AV影院| 国产精品久久久99| 日韩精品久久久久久久电影蜜臀 | 久久精品亚洲AV久久久无码| 亚洲国产精品久久久久婷婷软件| 麻豆久久久9性大片| 99久久精品九九亚洲精品| 久久大香香蕉国产| 亚洲精品国产综合久久一线| 久久国产精品99久久久久久老狼| 伊人久久亚洲综合影院| 久久精品国产精品亚洲人人 | avtt天堂网久久精品| 久久久噜噜噜久久中文字幕色伊伊 | 亚洲国产精品无码久久SM| 午夜精品久久影院蜜桃| 欧美亚洲国产精品久久蜜芽| 国产亚洲精品久久久久秋霞| 欧美日韩中文字幕久久久不卡 | 久久久久国产| 国产成人久久精品麻豆一区| 国产精品久久久久AV福利动漫| 亚洲AV日韩精品久久久久久久| 伊人久久精品影院| 一级a性色生活片久久无| 久久嫩草影院免费看夜色| 精品无码久久久久久久动漫| 国产免费久久精品丫丫| 国内精品久久久久久久影视麻豆 | 中文精品99久久国产 |