クラスについては、未定義の動作をgoto
で示す必要がありました。私は、以下のプログラムを思い付いた:私は、コンパイラ(gcc
バージョン4.9.2)は、未定義の動作であることi
へのアクセスについて私に警告することを期待する定義されていない動作が一貫していません
#include <stdio.h>
int main()
{
goto x;
for(int i = 0; i < 10; i++)
x: printf("%d\n", i);
return 0;
}
ではなくさえして、警告はありません。
gcc -std=c99 -Wall -Wextra -pedantic -O0 test.c
プログラムを実行すると、i
は明らかにゼロに初期化されます。何が起こっているのかを理解するために、私は第二の可変j
でコードを拡張:
#include <stdio.h>
int main()
{
goto x;
for(int i = 0, j = 1; i < 10; i++)
x: printf("%d %d\n", i, j);
return 0;
}
今コンパイラが、私はそれが初期化されずにj
にアクセスしていますことを私に警告します。私はそれを理解しますが、なぜi
も初期化されていませんか?
これは、定義されていない動作のものです。*未定義です*本当に何かが起こる可能性があります。 :)しかし、これは実行時に定義されている動作についてよりもコンパイラに関するものです。 –
@JoachimPileborg:はい、しかし、なぜコンパイラはUBを 'j'で認識しますが、' i'では認識しませんか?それらは宣言され、まったく同じ方法でアクセスされます。 –
私は '-O1'、' -O2'、 '-O3'を使ったとき両方のプログラムで' i'の警告を受け取りますが、 '-O0'を使うときや' -Ox'を使わないときは警告しません。 –