2011-01-27 85 views
10

返回值當我運行此程序:c + +沒有return語句

#include <iostream> 

int sqr(int&); 

int main() 
{ 
    int a=5; 
    std::cout<<"Square of (5) is: "<< sqr(a) <<std::endl; 
    std::cout<<"After pass, (a) is: "<< a <<std::endl; 
    return 0; 
} 

int sqr(int &x) 
{ 
    x= x*x; 
} 

我得到了以下的輸出:

Square of (5) is: 2280716 
After pass, (a) is: 25 

什麼是2280716?而且,如何獲得返回到sqr(a)的值,而函數int sqr(int &x)中沒有return語句?

感謝。

+6

跆拳道?你爲什麼要寫這樣的代碼?很明顯,sqr是一個數學函數,使用參數作爲輸入是沒有意義的。 – 2011-01-27 11:40:46

+0

@Ilya Kogan。只是測試如何通過引用工作 – Simplicity 2011-01-27 11:47:08

回答

28

嚴格來說,這會導致未定義的行爲。在實踐中,由於sqr返回類型爲int,即使沒有return語句存在,它也會始終返回一些內容。那東西可以是任何值int

添加return語句並在編譯器中打開警告(例如,g++ -Wall)。

int sqr(int &x) 
{ 
    return x = x*x; 
} 
+5

+ 1的`-Wall`。 (現在,如果你添加`-Werror` ...不行,我不能兩次,該死的。:-)) – 2011-01-27 12:02:46

7

這是一些垃圾,將取決於少數因素。如果它有一個return語句,那麼這個值可能就是存儲在內存中的值,如果該函數將結果存儲在內存中。該內存不被打開,然後由調用者讀取。

不要想太多 - 只需添加return聲明即可。

3

您試圖打印SQR的返回值(INT & X),這是在這種情況下,垃圾的價值。但不能返回正確的X * X。 嘗試從SQE

返回有效X * X

int sqr(int &x) { x= x*x; return x;}

4

你的功能sqr()沒有return語句。該函數具有未定義的有關返回值的行爲。你的第一個輸出顯示了這個返回值。

雖然編譯器應該顯示一個診斷。

試試這個:

int sqr(int x) 
{ 
    return x*x; 
} 
1

如果一個函數沒有聲明void那麼你MUST有一個return語句告訴返回給調用的時候應該是什麼價值。如果你不這樣做,只是函數結束而沒有返回值,調用這個函數的結果是"Undefined Behavior"這意味着你的程序可以做任何事情(包括崩潰或刪除硬盤上的所有內容)。

通常情況下,如果這個值只是一個簡單的int,你會得到時髦的數字,但在更復雜的情況下可能是一個大麻煩的來源。只是不要那樣做。

編譯器通常會通知您,如果指示正確(即啓用最大警告級別),您將忘記返回聲明。只有在函數沒有實際返回的情況下(即拋出異常或永遠循環),您可以省略返回值。

1

你需要之間做出一個選擇:通過參考/值

1)的傳遞和返回一個int。

2)通過引用傳遞並返回void。

這個選擇取決於你的功能的目的。

如果你想要一個函數給你的數字的平方使用第一個。如果你想要一個帶有變量的函數,並用它的方塊代替它,使用第二個。

因此,要麼:

int sqr(int& x) 
{ 
    return x*x; 
} 

OR

void sqr(int& x) 
{ 
    x= x*x; 
}