我在C++下面的代碼:
C++返回值
int fff (int a , int b)
{
if (a>b)
return 0;
else a+b ;
}
雖然沒寫「迴歸」後,別的不作出錯誤!在主< BR /> 時寫():
cout<<fff(1,2);
它印1? 那是怎麼發生的
可以解釋一下嗎?
我在C++下面的代碼:
C++返回值
int fff (int a , int b)
{
if (a>b)
return 0;
else a+b ;
}
雖然沒寫「迴歸」後,別的不作出錯誤!在主< BR /> 時寫():
cout<<fff(1,2);
它印1? 那是怎麼發生的
可以解釋一下嗎?
這就是所謂的未定義的行爲。任何事情都可能發生。
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
,您應該避免掉頭。
如果你這樣做,你可能會得到一個隨機值,否則你可能會崩潰。
「隨機」返回vaule被調用後的CPU寄存器的值決定,因爲寄存器是1通話後,所以價值1
如果你改變你的代碼,該函數將返回不同的價值。
如果出現這樣的錯誤,一個好的編譯器(例如gcc)會發出警告,並且如果遇到任何警告,命令行開關將返回非零錯誤狀態。這是未定義的行爲:您看到的結果是編譯器通常期望函數返回int以使用的位置發生的任何值:例如,累加器寄存器或堆棧上的某個點。您的代碼不會將a + b複製到該位置,因此將會看到最後放置的位置。儘管如此,你甚至不能保證得到結果 - 如果函數沒有返回語句,某些編譯器/體系結構可能會使機器崩潰:例如 - pop()假設在堆棧中的值該返回已經推送了一個 - 堆棧的未來使用(包括讀取函數返回地址)可以從高於或低於預期值的存儲器地址獲得結果。
$ 6.6.3/2-「流動斷 函數的末尾相當於沒有值返回 ;這導致 未定義的行爲在 返回值的函數」
編譯器可能會或可能不會診斷出這樣的情況。
這裏
其他A + B;
被視爲沒有任何副作用的表達式。
我不相信你! – Alex 2010-08-25 05:16:00
不幸的是,並不是所有的控制路徑返回值都不是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
你可能得到了一個警告類似於'不是所有的控制路徑都返回一個值'或者類似的東西... – liaK 2010-08-25 05:17:52