未定義の動作とシーケンス ポイント (未定義の動作とシーケンス ポイントなど)に関するいくつかの非常に良い回答を読み、理解しました。
int i = 1;
a = i + i++; //this is undefined behaviour
C++ 標準によると、未定義のコードです。しかし、それが未定義の動作であることの背後にあるより深い理由は何ですか? 不特定の動作にするだけで十分ではないでしょうか? 通常の議論は、シーケンス ポイントが少ないことにより、C++ コンパイラはさまざまなアーキテクチャに対してより適切に最適化できるが、未指定のままにしておくと、それらの最適化も許可されないのではないかというものです。の
a = foo(bar(1), bar(2)); //this is unspecified behaviour
コンパイラも最適化でき、未定義の動作ではありません。最初の例では、a が 2 または 3 のいずれかであることは明らかであるため、セマンティクスは私には明らかです。なぜ特定されていないものと定義されていないものがあるのか、理由があることを願っています。