for (;;);
Cの未定義動作のような無限ループはありますか?(C ++用ですが、Cについてはわかりません。)
2 に答える
いいえ、for (;;)
ステートメントの動作は C で明確に定義されています。
N1570は、公式の 2011 ISO C 標準と本質的に同一であり、セクション 6.8.5 パラグラフ 6 で次のように述べています。
制御式が定数式ではなく、入出力操作を実行せず、揮発性オブジェクトにアクセスせず、その本体、制御式、または ( for ステートメントの場合)で同期またはアトミック操作を実行しない反復ステートメントその式-3は、実装によって終了すると想定される場合があります。
2 つの脚注付き:
省略された制御式は、定数式であるゼロ以外の定数に置き換えられます。
これは、終了が証明できない場合でも、空のループの削除などのコンパイラ変換を許可することを目的としています。
for (;;)
最初の脚注は、 が定数制御式を持っているかのように扱われることを明確にしています。
ルールのポイントは、コンパイラがループの終了を証明できない場合に最適化を許可することです。ただし、制御式が定数の場合、コンパイラはループが終了するか終了しないかを自明に証明できるため、追加の許可は必要ありません。
C++ に関連するこの質問の論理的根拠は C には関係ありません。セクション 5.1.2.3p6 は最適化の限界を述べており、そのうちの 1 つが次のとおりです。
プログラムの終了時に、ファイルに書き込まれるすべてのデータは、抽象セマンティクスに従ってプログラムを実行した結果と同じでなければなりません。
ここで問題は、「抽象セマンティクスに従って実行すると、どのようなデータが生成されるのか?」ということになります。シグナルがループを中断すると仮定すると、プログラムは十分に終了する可能性があります。ただし、抽象セマンティクスは、そのシグナルが発生する前に出力を生成しませんでした。どちらかといえば、コンパイラは最適化する可能性がありputs("Hello");
ます。