以下代码是否会调用UB?
int main(){
volatile int i = 0;
volatile int* p = &i;
int j = ++i * *p;
}
答案 0 :(得分:9)
是 - 可以先评估++ i或* p(即i)。
答案 1 :(得分:6)
是未定义的行为,因为您试图违反第二条规则..
标准规定
1)在前一个和下一个序列点之间,一个对象的存储值最多只能通过表达式的计算修改一次。
2)此外,只能访问先前值以确定要存储的值。
注意:*
运算符的操作数评估顺序为未指定,*p
只是i
。