1

C および C++ のローカル変数は自動的に初期化されず、初期値が指定されていない場合、それらはガベージ値を持つことを知っています。また、グローバル変数と静的変数はデフォルトでゼロに初期化されることも知っています。初期化されていない変数を使用すると、C++ で未定義の動作が発生します。

しかし最近、C++ のさまざまな実装で単純な C++ プログラムを実行しようとしましたが、すべて出力として 0 が返されます。

#include <iostream>
int main()
{
    int u;
    std::cout<<u<<'\n';
}

出力:

コードブロック 13.12 IDE: 0

Orwell Dev C++ 5.8.3: 0

Ideone.com: 0 (これにアクセスしてください: http://ideone.com/zWrgwo )

最新のコンパイラがローカル変数を自動的に 0 に初期化するというのは本当ですか? またはそのようなタイプのプログラムはまだ未定義の動作を表していますか? C++ のすべての最新の実装で常に 0 が出力として表示されることが保証されていますか?

4

3 に答える 3

3

いいえ、そうではありません。変数をゼロに初期化すると、不要なパフォーマンス コストが発生します。非静的変数はゼロに初期化されません。

C++ で初期化されていない変数を使用した場合の動作は未定義です。

デバッグ構成で変数がゼロ初期化されることがあります。私はこれが特に有害であると考えており、それを行うコンパイラ オプションがオフになっていることを常に確認しています。

于 2015-06-02T13:06:51.227 に答える
3

特定の実装では、それら (「ローカル」変数) を何にも設定しないことも、ゼロを含む任意の値に設定することも自由です。結局のところ、標準はそれらをゼロ以外の値に設定することを義務付けていません:-)

標準では、明示的に設定されていない場合、それらの値は未定義であると述べているだけです。したがって、優れたプログラマーが頼りにするものではありません。これはC++11 8.5 Initializers [dcl.init] /11(私の強調)でカバーされています:

オブジェクトに初期化子が指定されていない場合、オブジェクトはデフォルトで初期化されます。初期化が実行されない場合、自動または動的ストレージ期間を持つオブジェクトの値は不確定です。

では、あなたの締めくくりの質問へis it guaranteed to see 0 as output on every modern implementation of C++ always?の答えとして、答えはノーです。単純明快です。

余談ですが、テストした 、CodeBlocksDevC++およびの 3 つの「別個の」環境ideoneはすべて、裏で同じコンパイラを使用していることに気付くかもしれません。その場合、網羅的なテストにはなりません。

于 2015-06-02T13:08:50.090 に答える