前者は未定義の動作です。list[i]
への関数呼び出しの前または後に (割り当ての左辺値を提供するために) が評価されるかどうかは指定されていませんobjects.at
。
したがって、式のさまざまな部分の正当な順序付けがあり、シーケンス ポイントを介さずにi
アクセス ( list[i]
) され、個別に変更 ( ) されます。i++
これはまさに、C++ 標準における未定義の動作の条件です。そのような正当な順序が存在するかどうかです。IIRC の C 標準では、表現が少し異なりますが、効果は同じです。
疑問がある場合は、インクリメント演算子を使用する式を記述しないでください。また、式の他の場所でも同じ値を使用します。コンマ演算子 ( は問題ありませんi++, i++
) と条件演算子 (i ? i++ : i--
は問題ありません) を使用して実行できます。これらにはシーケンス ポイントが含まれているためですが、その価値はほとんどありません。同様に、そしてそのようなもの||
は完全に信じられないわけではありません。それ以外の使用法であり、十分に長い間それを見つめていれば、通常、物事を台無しにする評価の順序を考え出すことができます。&&
p != end_p && *(p++) = something;
それは、複雑なfor
式とfor
空の本体を持つループの理解の容易さは別としてです。