8

以下代码是否调用 UB ?

int main(){
  volatile int i = 0;
  volatile int* p = &i;
  int j = ++i * *p;
}
4

2 回答 2

9

是的 - 可以首先评估 ++i 或 *p(即 i)。

于 2010-01-15T13:43:41.983 回答
6

是的,这是未定义的行为,因为您试图违反第二条规则..

该标准指出

1) 在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的评估修改一次。

2)此外,只能访问先验值以确定要存储的值

注意*: operator的操作数的求值顺序是未指定的,*p只不过是i.

于 2010-01-15T13:48:01.180 回答