2017-02-26 18 views
-1

C++では、値が割り当てられていない変数を印刷するとどうなりますか?次の2つのコードは私に2つの異なる結果を与えます。また、最初のものは各コンパイルで異なる結果をもたらし、2番目のものは毎回0を出力します。どうして?初期化されていない値を読み込み値を割り当てないで変数を印刷する

int main() { 
    int x = 1; 
    int y; // No value has been assigned 
    if (x) { 
     cout << y; // without using endl 
     // prints different value each time 
    } 
} 

int main() { 
    int x = 1; 
    int y; // y is not initialized 
    if (x) { 
     cout << y << endl; // using endl 
     // prints 0 
    } 
} 
+1

宣言された変数には、ガベージ値である初期値があります。変数を初期化せずに変数を使用しようとすると、UBが発生します。 – Raindrop7

答えて

5

は(より具体的には、オブジェクトを初期化しないから生じる不確定値、オン左辺ツー右辺値変換を行う)未定義の動作を有します。言い換えれば、両方のプログラムがバグです。

+0

'unsigned char'型を考えてみましょう。 –

+1

現在の参照:[dcl.init] p12:「評価によって不確定な値が生成された場合、動作は未定義です」(例外はありますが) –

+0

さて、私は答えが間違っていて誤解を招くことがあり、暗黙のうちにそれを修正することを拒否しているので、今度はdownvotingに傾いています。しかし、多分私はあなたの応答にあまりにも多くを読んでいるでしょう。私は多分誤って、回避的な行動としてそれを読んでいます。これはどういう意味ですか? "単純な代入演算子(5.17)の右オペランドの評価によって、符号なしの狭い文字型の不定値が生成され、その第1オペランドが符号なしの狭値 文字型の左辺値である場合、不定値左のオペランドによって参照されるオブジェクトの値を置き換えます。 –

0

変数はコールスタックに保存されます。つまり、プログラムの起動時にメモリが割り当てられます。そして、プログラムはスタックから変数を読み込む場所だけを知っています。プログラムが読み取る範囲は、ルーチンを呼び出すだけで変更されますが、ゼロにはなりません。プログラムの開始時または以前に使用されたときにはリセットされません。コンパイラのいくつかの最適化では、実際のメインプロシージャを呼び出す前に何かをロードしたり初期化したりすることができます。

出力を持つクラスをコンストラクタで作成し、その変数をグローバルに初期化するだけです。それをデバッグし、コンストラクタにブレークポイントを置くと、コールスタック上のメインプロシージャは表示されません。

関連する問題