• <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 閱讀(5156) 評論(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

            閱讀排行榜

            評論排行榜

            香港aa三级久久三级老师2021国产三级精品三级在 | 欧美伊人久久大香线蕉综合 | 久久这里的只有是精品23| 亚洲日本久久久午夜精品| 女人高潮久久久叫人喷水| 伊人久久大香线蕉亚洲| 国产综合精品久久亚洲| 久久乐国产综合亚洲精品| 亚洲国产精品无码久久久蜜芽| 伊人久久免费视频| 久久久久久精品免费免费自慰| 精品久久777| 无码国内精品久久人妻| 久久99国产精品久久久| 青青草国产97免久久费观看| 国产精品99久久免费观看| 久久久久久午夜精品| 久久精品欧美日韩精品| 久久男人Av资源网站无码软件 | 久久人人爽人人爽人人片AV东京热| 久久AV高清无码| 性做久久久久久久久久久| av午夜福利一片免费看久久| 亚洲精品国产综合久久一线| 久久精品夜色噜噜亚洲A∨| 久久亚洲欧美日本精品| 精品999久久久久久中文字幕| 狠狠色丁香久久婷婷综合图片| 99久久精品九九亚洲精品| 国内精品人妻无码久久久影院| 国产精品乱码久久久久久软件| 很黄很污的网站久久mimi色 | 精品久久久久久国产免费了| 99久久精品国产一区二区三区 | 精品久久综合1区2区3区激情| 日产精品99久久久久久| 久久久亚洲欧洲日产国码二区 | 久久综合日本熟妇| 99久久综合国产精品二区| 九九久久精品无码专区| 久久99精品久久久久久野外|