• <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)  編輯 收藏 引用

            導航

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

            統計

            常用鏈接

            留言簿

            隨筆檔案

            搜索

            最新評論

            • 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

            閱讀排行榜

            評論排行榜

            精品久久久久久无码专区不卡 | 热re99久久精品国产99热| 久久亚洲日韩看片无码| 香蕉久久夜色精品国产尤物| 久久久久国产精品嫩草影院| A级毛片无码久久精品免费| 精品久久久久久久久久中文字幕| 亚洲欧洲精品成人久久曰影片 | 国产精品久久久久9999| 品成人欧美大片久久国产欧美...| 综合网日日天干夜夜久久| 香蕉aa三级久久毛片| 国产精品毛片久久久久久久| 久久精品国产第一区二区| 国产精品成人99久久久久91gav| 一本色道久久综合狠狠躁| 亚洲级αV无码毛片久久精品| 久久93精品国产91久久综合| 久久久久久久综合日本| 久久免费高清视频| 久久只有这里有精品4| 久久久久久精品免费看SSS| 亚洲午夜久久久久久噜噜噜| 久久久无码一区二区三区| 亚洲国产成人久久综合一| 亚洲精品无码久久不卡| 精品久久久无码人妻中文字幕| 亚洲精品乱码久久久久久蜜桃图片 | 国产精品九九九久久九九| 国内精品久久久久国产盗摄| 久久亚洲国产最新网站| 色欲av伊人久久大香线蕉影院 | 浪潮AV色综合久久天堂| 国产成人久久久精品二区三区 | 色欲久久久天天天综合网精品| 91精品日韩人妻无码久久不卡| 久久综合视频网站| 精品熟女少妇aⅴ免费久久| 97久久久久人妻精品专区| 狠狠久久亚洲欧美专区| 中文字幕久久精品|