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

            一個沒有返回值的函數(shù)

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

            編譯工具: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版本下結(jié)果如下:
            1 2 2
            Release版本下結(jié)果
            0 0 0

            下面分析一下為什么為發(fā)生這種情況:

            從code:: blocks里面看到的 函數(shù)f的匯編代碼
            00401318    push   %ebp
            00401319    mov    %esp,%ebp  //正確的似乎是 mov %ebp %esp
            0040131B    leave
            0040131C    ret
            如果函數(shù)f()如下定義
            int f()
            {
                
            return 100;
            }
            則匯編代碼是
            00401318    push   %ebp
            00401319    mov    %esp,%ebp
            0040131B    mov    $
            0x64,%eax
            00401320    leave
            00401321    ret
            接下來我們看一下整個main函數(shù)的匯編代碼
            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


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


            在Release版本下,函數(shù)f()被優(yōu)化,printf直接打印數(shù)字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)  編輯 收藏 引用

            導航

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

            統(tǒng)計

            常用鏈接

            留言簿

            隨筆檔案

            搜索

            最新評論

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

            閱讀排行榜

            評論排行榜

            欧洲性大片xxxxx久久久| 久久人人超碰精品CAOPOREN| 无码国内精品久久人妻| 国内精品久久久久伊人av| 久久99国产乱子伦精品免费| 国产午夜精品久久久久九九电影| 久久久久亚洲av毛片大| 色88久久久久高潮综合影院| 久久久91精品国产一区二区三区 | 久久久久久国产精品免费无码| 欧美va久久久噜噜噜久久| 久久噜噜电影你懂的| 亚洲一区精品伊人久久伊人| 99久久无色码中文字幕| 亚洲欧美一级久久精品| 91精品免费久久久久久久久| 7777精品伊人久久久大香线蕉 | 久久亚洲欧美国产精品| 久久综合亚洲色HEZYO国产| 国内精品久久久久久99| 久久笫一福利免费导航| 久久久精品久久久久特色影视| 无码人妻久久久一区二区三区| 久久久久国产一级毛片高清板| 狠狠色噜噜狠狠狠狠狠色综合久久| 国产精品久久久久久久人人看| 国产三级观看久久| 狠狠色丁香久久综合五月| 欧洲精品久久久av无码电影| 日本亚洲色大成网站WWW久久| 99久久精品免费观看国产| 久久久精品人妻一区二区三区蜜桃| 久久天天躁狠狠躁夜夜躁2014| 久久性精品| 久久精品综合网| 亚洲成av人片不卡无码久久| 久久久久久极精品久久久| 久久亚洲精品无码播放| 欧美日韩中文字幕久久久不卡 | 国内精品九九久久久精品| 国产V亚洲V天堂无码久久久|