C99 §6.5式
(1) 式は、値の計算を指定するか、オブジェクトまたは関数を指定するか、副作用を生成するか、またはそれらの組み合わせを実行する一連の演算子とオペランドです。
(2) 前のシーケンス ポイントと次のシーケンス ポイントの間で、オブジェクトの格納値は、式の評価によって最大 1 回変更されます。72)さらに、以前の値は、保存する値を決定するためにのみ読み取られるものとします。73)
脚注付き
72) 浮動小数点状態フラグはオブジェクトではなく、式内で複数回設定できます。
73) この段落は、次のような未定義のステートメント式をレンダリングします。
i = ++i + 1; a[i++] = i;許可しながら
i = i + 1; a[i] = i;
ここで、C11 §6.5 は次のように変更されました ((1) のテキストには補遺があります):
(1) […] 演算子のオペランドの値の計算は、演算子の結果の値の計算の前に並べられます。
(2) スカラー オブジェクトに対する副作用が、同じスカラー オブジェクトに対する別の副作用または同じスカラー オブジェクトの値を使用した値の計算と比較して順序付けされていない場合、動作は未定義です。式の部分式に複数の順序付けが許可されている場合、いずれかの順序付けでそのような順序付けされていない副作用が発生した場合の動作は未定義です。84)
ここで、C11 の脚注 84 は C99 の脚注 73 と同じです。
私は少し混乱しています… C11 (2) を「[…] (同じスカラー オブジェクトに対する異なる副作用) または (同じスカラー オブジェクトの値を使用した値の計算) […]」のように読みます。許可さえしませんfoo = ++i(副作用があり、変更されたオブジェクトに応じて値を使用します)。ただし、私はネイティブ スピーカーではないので、この文をどのように「解析」する必要があるか教えていただければ幸いです。C99 は理解できますが、C11 の文言はよくわかりません。
とにかく、実際の質問: これは C99 から C11 への変更ですか、それともこれらの文言は同等ですか? もしそうなら、なぜ変更されたのですか?そうでない場合、誰かが C99 では UB であるが C11 では UB ではない、またはその逆の式の例を挙げてもらえますか?