2013-11-01 96 views
2

下面的代碼打印:在if-else語句返回值 - C++

5 

爲什麼它打印5?如果它返回5,爲什麼它不打印「詹姆斯」?我不明白下面的代碼。如果我刪除了其他字,它會打印-1。但是,它不應該返回一個默認值?

#include <iostream> 
#include <sstream> 
#include <string> 
using namespace std; 

int fonk() 
{ 
    int a = 5, b = 3; 
    int c = a*b; 
    if(c >10) 
    { 
     if(a<b && a >0) 
     { cout <<"James"; 
     return a; 
     } 

     else if(b<0) 
     { 
      return b; 
     } 

    } 
    else return -1; 

} 

int main() 
{ 
    int x = fonk(); 
    cout << x; 
} 
+0

該代碼不應該返回5.我會檢查,以確保你沒有被阻止重新編譯,以確保您實際開始執行權申請任何編譯器錯誤。 – Nabren

+0

什麼編譯器?對我來說,它絕對不會打印或返回5 ... –

+3

此代碼無法編譯,因爲並非所有路徑都返回值 –

回答

17

您正在碰到未定義的行爲。你的功能其實並不return什麼!看看每個條件:

  • c>10?是。
  • a<b && a >0?沒有。
  • b<0?沒有。

因此,您從未打過任何return s。這意味着你的程序中絕對會發生任何事情。在你的情況,似乎只是發生5存儲在程序預計return價值。

3

不,你有一點錯誤。你的最後一個屬於第一個if語句,所以永遠不會被調用。你的函數恰好返回5,因爲這恰好在編譯器通常放置返回值的地方。

你不能依賴那個,因爲它是未定義的行爲,按照C++標準第6.6.3節(如果我的谷歌技能爲我服務)。

5

所以fonk的前兩行delcare以下值:

int a = 5, b = 3, c = a *b; 

所以a是5,b是3和c爲15

if(c >10) 

15大於10

if(a<b && a >0) 

這是不正確的,所以James /返回一個分支沒有執行。

else if(b<0) 

b是3,它是> = 0,所以return b語句不被執行。

else 

此語句引用「c> 10」,c> 10爲真,所以此else子句不執行。

} 

您的函數在沒有返回任何東西的情況下結束,這會調用「未定義的行爲」。

解決方案:從else return -1;中刪除'else'或添加return -2;以查看您的代碼沒有遵循任何路徑的情況。

我看到你正在使用GCC - 添加'-Wall'選項從編譯器獲得最大診斷,它應該告訴你,你的函數有一個不返回值的代碼路徑。

2

這是offtopic這個網站,但讓經過的每一行

int a=5, b =3; 
int c = a*b; 

c是15,現在

if(c >10) // 15>10 - true 
{ 
    if((a<b) && (a>0)) // 5<3 - false, so we go further 
    { 
     cout <<"James"; 
     return a; 
    } 
    else if(b<0) // 3<0 - false, we go further 
    { 
     return b; 
    } 
    // here is error, should be another one return 
} 
else 
    return -1; // this will not be executed, as it is else for if (c>10) 

更新:爲什麼它返回5 - 通常返回的函數值放置到(e)ax寄存器(我假設你在x86平臺上),所以你的編譯器在比較過程中使用ax來存儲a的值

+0

它是如何脫離話題? – GManNickG

+0

@GManNickG問題「如果OP甚至沒有嘗試調試代碼,這個問題」必須表現出對所解決問題的最小理解「 - 這不是最基本的理解,我可以說沒有任何類型的分析/調試工作在這裏完成所有 –

0

如果你退出函數返回int沒有return一個值,結果是未定義的。不是默認值。

編譯器可以打印5,可以打印0,coukd打印4232732,或者它可以格式化你的硬盤。所有這些都是您程序的合法C++結果。

來處理這個問題的方法有兩個方面:對警告和警告變成爲錯誤,因爲是最肯定的不是所有的控制路徑返回一個值wsrning。

其次,不要讓不是所有的控制路徑返回一個值的函數。