#include <iostream>
int j;
int main(void) {
int i;
std::cout<<i<<std::endl;
std::cout<<j<<std::endl;
return 0;
}
iは異なる値にすることも、常に 0 にすることもできますか? イニシャルでいいですか?私にとっては予想外の結果ですか?
#include <iostream>
int j;
int main(void) {
int i;
std::cout<<i<<std::endl;
std::cout<<j<<std::endl;
return 0;
}
iは異なる値にすることも、常に 0 にすることもできますか? イニシャルでいいですか?私にとっては予想外の結果ですか?
不確定な値を持つオブジェクトで左辺値から右辺値への変換が必要なため、プログラムの動作は未定義です (C++11 標準の段落 4.1/1 を参照)。
簡単に言えば、i
初期化していないため、明確に定義された値がなく、その(非)値を読み取ろうとすることは未定義の動作です。
C++11 標準のパラグラフ 8.5/7 によると:
タイプのオブジェクトをデフォルトで初期化するとは、次のことを
T
意味します。—
T
(おそらく cv 修飾された) クラス型 (第 9 節) の場合、T のデフォルト コンストラクタが呼び出されます (T
アクセス可能なデフォルト コンストラクタがない場合、初期化は不正な形式です)。—
T
が配列型の場合、各要素はデフォルトで初期化されます。—それ以外の場合、初期化は実行されません。
また、パラグラフ 8.5/12 によると:
オブジェクトに初期化子が指定されていない場合、オブジェクトは default-initializedです。初期化が実行されない場合、自動または動的ストレージ期間を持つオブジェクトの値は不確定です。[...]
i の定義済み (デフォルト) 値はありません。デフォルトでは、一部の環境ではゼロに設定されている場合があります(Visual Studioデバッガーは数バージョン前にそれを行っていました-今でもそうしているかどうかはわかりません)。
i の値は未定義です。実際には、割り当てられたアドレスのスタック メモリにあるものから値が取得される可能性があります。