数日前、ここで表現が
i = ++ i + 1
UB(未定義動作)を呼び出すかどうか。
最後に、「i」の値が2つのシーケンスポイント間で複数回変更されているため、UBを呼び出すという結論に達しました。
私は同じスレッドでJohannesSchaubとの話し合いに参加しました。彼によると
i =(i、i ++、i)+1 ------(1)/*UBも呼び出します*/
前の部分式の副作用は、iとi++の間およびi++とiの間のコンマ演算子'、'によってクリアされるため、(1)はUBを呼び出さないと言いました。
それから彼は次の説明をしました:
「はい、i ++の後のシーケンスポイントは、その前にすべての副作用を完了しますが、割り当ての副作用がi ++の副作用と重なるのを止めるものは何もありません。根本的な問題は、割り当ての副作用が、または割り当ての両方のオペランドの評価の前に、したがってシーケンスポイントはこれを保護することに関して何もできません:シーケンスポイントは半順序を誘発します:i ++の前後にシーケンスポイントがあるからといって、すべての副作用がシーケンスされるわけではありません私に関して。
また、単にシーケンスポイントは意味がないことに注意してください。評価の順序は、コードの形式によって決定されません。これは、セマンティックルールによって決定されます。この場合、そのオペランドまたはそれらのオペランドの部分式の両方を評価することに関して、割り当ての副作用がいつ発生するかを示す意味規則はありません。
「太字」で書かれた声明は私を混乱させた。私の知る限りでは:
「シーケンスポイントと呼ばれる実行シーケンスの特定の指定されたポイントで、前の評価のすべての副作用が完了し、後続の評価の副作用が発生していないものとします。」
コンマ演算子も実行順序を指定するので、最後のiに到達したときにi ++の副作用はキャンセルされました。評価の順序が指定されていなければ、He(Johannes)は正しかったでしょう(ただし、コンマ演算子の場合は適切に指定されています) )。
だから私は(1)UBを呼び出すかどうかを知りたいだけですか?誰かが別の有効な説明をすることができますか?
ありがとう!