この投稿への回答によって動機付けられました。なぜこれが NaN なのか
次のコードがあります。
int main()
{
const int weeks = 10;
const int salespersons = 9;
const int days = 30;
double weekly_sales[weeks][salespersons][days];
double total_weekly_sales[weeks];
double total_overall_weekly_sales[salespersons];
int a;
cout << "a = " << a <<endl;
cout << total_weekly_sales[0] <<endl;
for(int w=0; w < weeks;w++)
{
for(int d =0; d < days; d++)
{
for(int s=0; s < salespersons; s++)
{
total_weekly_sales[w]+=weekly_sales[w][s][d];
total_overall_weekly_sales[s]+= weekly_sales[w][s][d];
}
}
}
cout << total_weekly_sales[0] <<endl;
}
次のように出力されます。
a = 0
0
0
gcc 4.5.3 では、コンパイル オプション-Wall
.
ここでコードもコンパイルしました: http://liveworkspace.org/code/94SOj $2. 上記と同じ出力。
また、VS2010 でコードをコンパイルしました。VS2010 では、次のような警告が表示されました。
warning C4700: uninitialized local variable 'a' used
warning C4700: uninitialized local variable 'total_weekly_sales' used
私が走ったとき:
Run-Time Check Failure #3 - The variable 'a' is being used without being initialized.
ローカル変数を初期化せずに使用するのは悪い習慣であることを知っています。問題になることも理解しています。
私の質問は:
C++ 標準: 初期化されていないローカル変数を使用すると未定義の動作になると言っている場所はありますか? 異なるコンパイラで異なる動作をするのはなぜですか? これは、すべてのコンパイラが適切なアクションを実装する必要があることを標準が実際に強制していないことを意味しますusing uninitialized local variable
か? それでは、コンパイラ出力から未定義の動作であるとどのように判断できますか?
ありがとう。