変数の初期化をスキップして、不確定な値を持つ変数を使用しています (未定義の動作を呼び出しますb
) 。プログラムは任意の値を生成でき、それは正しいものになります。
C 標準では、このケースもカバーしています (非規範的な例)。
ISO/IEC 9899:2011 §6.8.4.2switch
ステートメント:
7 例 人工的なプログラム断片
switch (expr)
{
int i = 4;
f(i);
case 0:
i = 17;
/* falls through into default code */
default:
printf("%d\n", i);
}
識別子がi
自動保存期間 (ブロック内) で存在するが、初期化されていないオブジェクト。したがって、制御式にゼロ以外の値がある場合、printf 関数の呼び出しは不定値にアクセスします。同様に、関数の呼び出しにf
到達できません。
「不定値」コメントに注意してください。
不確定な値へのアクセスが未定義の動作につながるかどうかについては、議論の余地があります。状況によっては (トラップ表現)、未定義の動作につながる可能性があります。「おそらく未定義の動作」を「未定義の動作」と見なすべきかどうかを判断するには、しばらく時間がかかります。初期化されていない変数にアクセスすることは悪い考えであり、コードに出力される値については何も言えません。