次のC++標準ISO/IEC 14882:2003(E)の引用(セクション5、パラグラフ4)を検討してください。
特に記載のない限り、個々の演算子のオペランドと個々の式の部分式の評価の順序、および副作用が発生する順序は指定されていません。53)前のシーケンスポイントと次のシーケンスポイントの間で、スカラーオブジェクトは、式の評価によって、格納されている値を最大で1回変更する必要があります。さらに、前の値は、保存される値を決定するためにのみアクセスされるものとします。この段落の要件は、完全な式の部分式の許容される順序ごとに満たされるものとします。それ以外の場合、動作は定義されていません。[例:
i = v[i++]; // the behavior is unspecified i = 7, i++, i++; // i becomes 9 i = ++i + 1; // the behavior is unspecified i = i + 1; // the value of i is incremented
-例を終了]
i = ++i + 1
の未定義の値を与えることに驚いたi
。次のような場合に備えていないコンパイラの実装を知っている人はい2
ますか?
int i = 0;
i = ++i + 1;
std::cout << i << std::endl;
operator=
問題は、 2つの引数があるということです。最初のものは常にi
参照です。この場合、評価の順序は重要ではありません。C++標準のタブー以外は問題ありません。
引数の順序が評価にとって重要であるような場合は考慮しないでください。たとえば、++i + i
は明らかに未定義です。私の場合だけ考えてください
i = ++i + 1
。
なぜC++標準はそのような式を禁止しているのですか?