2017-08-08 10 views
2

これは簡単ですが、説明できません。私は4つの変数を宣言して、C++でそれをプリントアウト:C++で初期化されていない変数の値

#include <iostream> 
using namespace std; 

int main(){ 
    int a, b, c, d; 

    cout << "a = " << a << endl; 
    cout << "b = " << b << endl; 
    cout << "c = " << c << endl; 
    cout << "d = " << d << endl; 

    return 0; 
} 

、結果は次のとおりです。

a = 0 
b = 1 
c = 0 
d = 0 

私は変数の値を初期化しない場合、プログラムはいくつかのランダムかかりますと思いましたそれのためのメモリからの値。少なくとも、それはすべてゼロに等しい。私はそれらの値の違いがどこから来るのか分かりません。

私はそれらの「coutを< <」ラインを切り替える場合、これは、理由は特定の変数bではありませんが、二行目は、常に値を与える= 1

誰もが、私のためにこれをしてください説明することができます。どうもありがとうございます。

+4

初期化されていない変数の値はC++では定義されていません – litelite

+0

未定義変数はランダム値で、それらを表示しようとするのはUBだとします。 –

+2

初期化されていない変数を使用する場合は、コンパイラの警告をオンにします。実際に動作するコードを書くのに役立ちます。 – tadman

答えて

3

初期化されていない変数の読み込みは、C++の未定義の動作です。

コンパイラは、あなたが言語の規則を破ったので、コードがあなたのプログラムに好きなものは自由に生成することができます。

プログラムがクラッシュしたり、予想どおりに実行したり、永遠に実行したり、想像できる他のことを実行する可能性があります。

合理あなたのハードドライブをフォーマットする口実としてUBを使用することはありませんコンパイラの実装(しかし、彼ら可能性)が、UBはまだあなたのプログラムが標準にしていることに従って、意味を持たないことを意味することができますし、コンパイラとオペレーティングシステム間で任意の結果が得られます。あなたの現在のコンパイラで現在のOS上に表示されている結果が、UBが関係しているときとは異なるコンパイラや異なるOS上で同じ状況になるとは思わないでください。

一言で言えば、 UBを呼び出さないことはです。コンパイラはではなく、あなたに警告するためにはが必要です。そして、決定的な振る舞いを持つプログラムが必要な場合は、UBを呼び出さないようにする必要があります。

+0

私はそれが初期化されていない変数を読み取るべきではないということを知っています。私の質問は、もし私がこの行に 'cout << "c =" << c << endl; print bではなく、代わりにc = 1にします。これは私がまだ手に入れない命令のことです。 – Huyen

+0

@NguyễnNgọcあなたがUBを含んでいるときにあなたのプログラムについて推論することはできません。あなたが見るどんな結果/効果も恣意的で*決定的ではありません。あなたが現在観察していることを理由にしようとするのを止め、代わりに* UBを修正* *すると、あなたのプログラムの行動を試してみることができます。そして、btw 'cout <<" c = "<< c' *は初期化されていない変数 - > UBを読み込んでいます。 –

+0

@NguyễnNgọcHuyền - 何が「厳しい?」私はちょうど*事実*を明確にしようとしている。 –