• <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 閱讀(5146) 評論(0)  編輯 收藏 引用

            導航

            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            統計

            常用鏈接

            留言簿

            隨筆檔案

            搜索

            最新評論

            • 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

            閱讀排行榜

            評論排行榜

            国产免费久久精品99久久| 久久中文骚妇内射| 国产精品内射久久久久欢欢| 97精品国产97久久久久久免费| 久久久国产打桩机| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 久久久久无码中| 成人免费网站久久久| 久久久女人与动物群交毛片| 日韩十八禁一区二区久久| 国产精品嫩草影院久久| 少妇熟女久久综合网色欲| 亚洲午夜精品久久久久久浪潮| 久久99精品免费一区二区| 精品国产91久久久久久久a| 欧美大香线蕉线伊人久久| 欧美日韩成人精品久久久免费看| 99re这里只有精品热久久| 久久精品国产99国产精品亚洲| 夜夜亚洲天天久久| 国产成人综合久久综合| 亚洲伊人久久精品影院| 国产综合久久久久| 久久99精品国产99久久| 91麻豆精品国产91久久久久久| 久久精品国产亚洲AV香蕉| 无码任你躁久久久久久| 国产精品99久久久久久猫咪| 久久福利青草精品资源站| 亚洲精品国精品久久99热一| 久久夜色精品国产噜噜亚洲AV| 亚洲国产精品成人久久蜜臀| 国产福利电影一区二区三区,免费久久久久久久精 | 欧美熟妇另类久久久久久不卡 | 久久国产精品免费一区| 91久久精品视频| 久久精品国产亚洲av瑜伽| 国产高清国内精品福利99久久| 成人亚洲欧美久久久久 | 日韩精品无码久久一区二区三| 久久久WWW免费人成精品|