2010-08-25 148 views
2

我在C++下面的代碼:
C++返回值

int fff (int a , int b) 
{ 
    if (a>b) 
     return 0; 
    else a+b ; 
} 

雖然沒寫「迴歸」後,別的不作出錯誤!在主< BR /> 時寫():

cout<<fff(1,2); 

它印1? 那是怎麼發生的
可以解釋一下嗎?

+0

我不相信你! – Alex 2010-08-25 05:16:00

+2

不幸的是,並不是所有的控制路徑返回值都不是C++中的錯誤。看到這個解釋http://stackoverflow.com/questions/1735038/why-not-all-control-paths-return-a-value-is-warning-and-not-an-error – Naveen 2010-08-25 05:16:44

+0

你可能得到了一個警告類似於'不是所有的控制路徑都返回一個值'或者類似的東西... – liaK 2010-08-25 05:17:52

回答

5

這就是所謂的未定義的行爲。任何事情都可能發生。

C++不要求你總是在函數的最後返回一個值,因爲它可以編寫代碼,永遠不會有:

int fff (int a , int b) 
{ 
    if (a>b) 
     return 0; 
    else return a+b; 

    // still no return at end of function 
    // syntactically, just as bad as original example 
    // semantically, nothing bad can happen 
} 

然而,編譯器不能確定,如果你從來沒有到該功能的結束,並且它可以做的最多就是發出警告。沒有return,您應該避免掉頭。

如果你這樣做,你可能會得到一個隨機值,否則你可能會崩潰。

0

「隨機」返回vaule被調用後的CPU寄存器的值決定,因爲寄存器是1通話後,所以價值1

如果你改變你的代碼,該函數將返回不同的價值。

0

如果出現這樣的錯誤,一個好的編譯器(例如gcc)會發出警告,並且如果遇到任何警告,命令行開關將返回非零錯誤狀態。這是未定義的行爲:您看到的結果是編譯器通常期望函數返回int以使用的位置發生的任何值:例如,累加器寄存器或堆棧上的某個點。您的代碼不會將a + b複製到該位置,因此將會看到最後放置的位置。儘管如此,你甚至不能保證得到結果 - 如果函數沒有返回語句,某些編譯器/體系結構可能會使機器崩潰:例如 - pop()假設在堆棧中的值該返回已經推送了一個 - 堆棧的未來使用(包括讀取函數返回地址)可以從高於或低於預期值的存儲器地址獲得結果。

2

$ 6.6.3/2-「流動斷 函數的末尾相當於沒有值返回 ;這導致 未定義的行爲在 返回值的函數」

編譯器可能會或可能不會診斷出這樣的情況。

這裏

其他A + B;

被視爲沒有任何副作用的表達式。