以下代码会导致未定义行为(UB)吗?
int main(){
volatile int i = 0;
volatile int* p = &i;
int j = ++i * *p;
}
int main(){
volatile int i = 0;
volatile int* p = &i;
int j = ++i * *p;
}
是的,这是未定义行为,因为您试图违反第二个规则。
标准规定:
1)在前一个和下一个序列点之间,对象通过表达式的评估最多只能修改其存储值一次。
2)此外,应仅访问先前的值以确定要存储的值。
注意:乘法运算符的操作数的计算顺序是未指定的,而*p
实际上就是i
。