2017-09-04 20 views
-1

以下のスニペットは、ヘッダーファイルと実際のmain()関数です。 "687194768":私はそれが出力としてこれを示し続けた.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; 
} 

のWindows 10

でのVisual Studio 2017を使用しています。

私も変数の初期化を試みましたが、うまくいかないようです。

+5

' int型の価格=金額*率:この場合、それはあなたのコンパイラがそのガード値として0xCCCCCCCCを使用していますように見えます代わりに関数が必要です。 – Jarod42

+2

ちょっとしたスタイルのアドバイス:ヘッダーは ''ヘッダーのものを使わないので、 '#include 'は必要ありません。そして 'using namespace std;'は偽物であり、使用すべきではありません。 –

答えて

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が初期化されていないがために、その初期値を取得するためにのみ初期化時に計算されていますしかし、結果は未定義です。 関数ではありません。あなたが最も可能性の高い機能を望んでいた

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の定義には、amountまたはrateが使用されています。これは未定義の振る舞いであり、コンパイラは多かれ少なかれこれを喜ばせることができます。

多くのコンパイラは、デバッガで見ているときに値が初期化されていないときに、かなりわかりやすくするために、ある種の認識可能なガード値(一般的な選択は0xDEADBEEF)で変数を初期化します。あなたはおそらく、 `のみ初期化時に行われたときに、他のメンバーの変更、それは更新されません。

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