#include <iostream>
using namespace std;
bool a[5];
int main()
{
for (int i = 0; i < 5; i++)
{
cout<<a[i]<<" ";
}
return 0;
}
以上代码中输出为0 0 0 0 0
,但是下面代码输出却是不确定的.这是为什么?
#include <iostream>
using namespace std;
int main()
{
bool a[5];
for (int i = 0; i < 5; i++)
{
cout<<a[i]<<" ";
}
return 0;
}
输出176 74 183 230 255
黄舟2017-04-17 15:31:36
2 つのコードの A はデフォルトで初期化されます。違いは、グローバル変数 a はデフォルトの初期化の前に最初にゼロ初期化されるのに対し、ローカル変数 a は初期化されないことです。ローカル変数が 0 に初期化されないことを意味します)。同時に、このデフォルトで初期化されたローカル変数 a の値は不確かです。したがって、ここでのグローバル変数 a の値は 0 であり、ローカル変数 a の値は不確かです。
変数が実際に 0 に初期化されるかどうかは、変数の保存期間に関係します。静的変数は初期化前に 0 に初期化されますが、自動変数は初期化されません。
8.5 Initializers
...
5 型 T のオブジェクトまたは参照をゼロ初期化するには、次のことを意味します。
— T がスカラー型 (3.9) の場合、オブジェクトは次のように設定されます。整数定数式として取得され、T に変換された値 0 (ゼロ);
...
— T が配列型の場合、各要素はゼロで初期化されます;
6 デフォルト初期化するには型 T のオブジェクトは次のことを意味します:
— T が (おそらく cv 修飾された) クラス型 (9 節) の場合、T のデフォルト コンストラクターが呼び出されます (T にアクセス可能なデフォルト コンストラクターがない場合、初期化は不正形式になります) );
— T が配列型の場合、各要素はデフォルトで初期化されます。
— それ以外の場合、初期化は実行されません。
...
9 [ 注: 静的ストレージ期間のすべてのオブジェクト場合によっては、他の初期化が行われる前にプログラムの起動時にゼロ初期化されます。 —終了注記 ]
...
11 オブジェクトに初期化子が指定されていない場合、オブジェクトはデフォルト初期化; 初期化が実行されない場合、自動または動的ストレージ期間を持つオブジェクトは不定の値になります。 🎜>返事0
巴扎黑2017-04-17 15:31:36
一般に、グローバル変数と静的変数はデータセグメントに配置され、ローカル変数はスタックに配置されます。
データセグメントはコンパイル中に決定され、実行可能ファイルに割り当てられるため、必ず初期化されます。
スタックに関しては、実行時に割り当てられることがわかっています。関数を開始すると、レジスタがスタックにプッシュされるだけでなく、一時変数にもスタック領域が割り当てられるため、ローカル変数はスタック アドレスに対応します。スタックはメモリ上で大きく変化するため、初期値は不確かです。
もちろん、C++ 標準ではコンパイラが変数を配置する領域を指定していませんが、一般的にはこのように実装されています。