私は読んだ、誰かがこれらの未定義の振る舞い(i = i ++ + ++ i、i = i ++など)を説明し、2時間以上無駄にした後に「comp.lang.cFAQ」のシーケンスポイントを理解しようとし ましたか? gccコンパイラで次の結果を説明しようとしています。
expression(i=1;j=2) i j k
k = i++ + j++; 2 3 3
k = i++ + ++j; 2 3 4
k = ++i + j++; 2 3 4
k = ++i + ++j; 2 3 5
k = i++ + i++; 3 2
k = i++ + ++i; 3 4
k = ++i + i++; 3 4
k = ++i + ++i; 3 6
i = i++ + j++; 4 3
i = i++ + ++j; 5 3
i = ++i + j++; 4 3
i = ++i + ++j; 5 3
i = i++ + i++; 4
i = i++ + ++i; 5
i = ++i + i++; 5
i = ++i + ++i; 6
質問:
上図に示されているすべての式(4つのグループ)に未定義の動作があるかどうかを知りたいですか?それらの一部だけが未定義の動作をしている場合、どれが実行し、どれが実行しないのですか?
定義された動作式については、 コンパイラがそれらをどのように評価するかを示してください(説明はしません) 。念のために言っておきますが、このプリインクリメントとポストインクリメントを正しく取得したかどうか。
バックグラウンド:
今日、私はキャンパスのインタビューに参加しました。そこではi++ + ++i
、与えられた値のの結果を説明するように求められましたi
。その表現をgccでコンパイルした後、インタビューで答えた答えが間違っていることに気づきました。私は将来そのような間違いをしないことに決めたので、インクリメント前とインクリメント後の演算子の可能なすべての組み合わせをコンパイルし、それらをgccでコンパイルしてから、結果を説明しようとしました。私は2時間以上苦労しました。これらの表現の評価の単一の振る舞いを見つけることができませんでした。それで、私はあきらめて、stackoverflowに目を向けました。アーカイブを少し読んだ後sequence point
、未定義の動作のようなものがあることがわかりました。