2014-02-23 35 views
-3
#include<iostream> 

using namespace std; 

int increment(int i) 
{ 
    if(i<=10) 
    { 
     cout<<i; 
     i++; 
     increment(i); 

    } 
    //return 0; 
} 

int main() 
{ 
    cout<<increment(0); 
} 

當我還沒有回來什麼的時候也打印11,你爲什麼認爲是這樣?在我什麼都沒回來的時候還回來11

+5

未定義的行爲。 – 0x499602D2

+3

調高警戒級別。例如,對於gcc,使用'-Wall -Wextra'。 –

回答

4

您的increment函數聲明爲返回int但您沒有返回任何內容。你的編譯器應該絕對會產生一個警告。

如果您使用的是GCC,則應始終指定至少-Wall。我更喜歡-Wextra,-Werror將這些警告轉換爲錯誤,所以編譯實際上失敗。請參閱GCC Warning Options


什麼實際上發生了什麼?許多體系結構的ABI/calling convention指定一個特定的CPU寄存器來保存函數的返回值。 (在x86上,這是eax,在ARM上這是r0。)由於函數中沒有return語句,因此編譯器不會將該寄存器中的任何值作爲函數返回前的返回值。無論值恰好是,該寄存器就是調用函數將看到的返回值。

1

在大多數處理器的調用約定中,有一個寄存器用於返回適合本地寄存器字的值。調用約定還指定哪些寄存器是「調用者保存」(可以在不被函數保存的情況下更改)和「被調用者保存」(必須未使用或由函數保存和恢復)。返回寄存器自然是一個「調用者保存」類型的寄存器,因爲它將被函數修改以返回一個值。這意味着在一個函數的主體中,它很可能被選作一個臨時寄存器。在你的情況下,寄存器被用於i,並且由於沒有明確的返回來修改該寄存器,所以當函數返回給調用者時它仍然被設置爲11。

相關問題