2017-09-04 93 views
-1

以下片段是頭文件和實際的main()函數。我使用Visual Studio 2017的Windows 10爲什麼我的程序給出奇怪的結果?

.H

#ifndef SALES_DATA_H 
#define SALES_DATA_H 
#include <iostream> 
using namespace std; 
struct Sales_data 
{ 
    int amount; 
    int rate; 
    int price = amount * rate; 
}; 
#endif 

的.cpp

#include <iostream> 
#include "Sales_data.h" 
using namespace std; 
int main() 
{ 
    Sales_data item1; 
    cout << "Enter rate and amount" << endl; 
    cin >> item1.rate >> item1.amount; 
    cout << item1.price << endl; 
    cin.get(); 
    cin.get(); 
    return 0; 
} 

它一直顯示這是輸出: 「687194768」。

我也嘗試初始化變量,但它似乎並沒有工作。

+5

'INT價格=數量*率;'在初始化而已,它不更新,當其他成員的變化,你可能做想要一個功能。 – Jarod42

+2

只有一點風格建議:該標頭不使用''標頭中的任何內容,因此不需要'#inc'。而'使用名稱空間標準'是一種可憎的,不應該被使用。 –

回答

3

你可能想要的是:

struct Sales_data 
{ 
    int amount = 0; 
    int rate = 0; 

    int price() const { return amount * rate; } 
}; 

然後在這裏

std::in >> item1.rate >> item1.amount; 
std::cout << item1.price() << std::endl; 
+0

謝謝,但它爲什麼顯示「687194768」? –

+2

UB,因爲您讀取了2個未初始化的值(您相乘)。 – Jarod42

2

價格被在初始化時只計算得到其初始值,但是因爲amountrate尚未初始化但結果是undefined這不是的一個函數。

struct Sales_data 
{ 
    int amount; 
    int rate; 
    int price = amount * rate; 
}; 

你最有可能想要的功能,例如:

struct Sales_data 
{ 
    int amount; 
    int rate; 
    int calcPrice() 
    { 
     return = amount * rate; 
    } 
}; 


std::cout << item1.calcPrice() << std::endl; 

或者你將不得不重構初始化amountrate利用這種語法,例如中與一個構造函數。

struct Sales_data 
{ 
    int amount; 
    int rate; 
    int price = amount * rate; 
    Sales_data(int amount, int rate) : amount(amount), rate(rate) {} 
}; 


Sales_data x(10, 5); 
//x.price == 50 
0

代碼打印,這是因爲你在計算與未初始化的變量是價格的原因......

在結構中定義一個函數,並把它作爲輸入被賦予

void calculatePrice() { 
    price = amount * rate; 
} 

cin >> item1.rate >> item1.amount; 
item1.calculatePrice(); 
cout << item1.price << endl; 
0

正如其他人所評論的,您的Sales_data的定義在它們初始化之前使用amountrate。這是未定義的行爲,並且您的編譯器或多或少都可以自由地執行它所需的任何操作。

許多編譯器會用某種可識別的保護值(一種流行的選擇是0xDEADBEEF)來初始化變量,以便在調試器查看值時未初始化某個值時使其非常明顯。在這種情況下,它看起來像你的編譯器使用0xCCCCCCCC爲警戒值:

(lldb) p (int) 0xcccccccc * (int) 0xcccccccc (int) $2 = 687194768