次のコードはUBを呼び出しますか?
int main(){
volatile int i = 0;
volatile int* p = &i;
int j = ++i * *p;
}
次のコードはUBを呼び出しますか?
int main(){
volatile int i = 0;
volatile int* p = &i;
int j = ++i * *p;
}
はい-++iまたは*p(i)のいずれかを最初に評価できます。
はい、2番目のルールに違反しようとしているため、これは未定義動作です。
規格は次のように述べています
1)前のシーケンスポイントと次のシーケンスポイントの間で、オブジェクトは、式の評価によって、格納されている値を最大1回変更する必要があります。
2)さらに、前の値は、保存される値を決定するためにのみアクセスされるものとします。
注:演算子のオペランドの評価順序*は指定され*pておらず、に過ぎませんi。