C中的表达评估

shr*_*sva 2 c expression-evaluation undefined-behavior

为什么打印下面的C代码? 12 12 12

int main(int argc, char const *argv[]) {
  int a = 2, *f1, *f2;
  f1 = f2 = &a;
  *f2 += *f2 += a += 2.5;
  printf("%i %i %i\n", a, *f1, *f2);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

Arm*_*yan 11

*f2 += *f2 += a += 2.5;
Run Code Online (Sandbox Code Playgroud)

此行具有未定义行为,因为您在同一表达式中多次更改*f2(ie a)的值而没有插入序列点.UB意味着程序可以打印的"Hello World",它可能会崩溃,它可以打印12 12 12或者12 12 1029也可以开始吃你的大脑.不要依赖未定义的行为.

引用C++标准(我知道问题标记为C,但我没有C标准,我知道同样的规则在C中保存)

除非另有说明,否则单个运算符的操作数和单个表达式的子表达式的评估顺序以及副作用发生的顺序是未指定的.5)在前一个和下一个序列点之间,标量对象应该修改其存储值最多一次通过表达式的评价.此外,只能访问先前值以确定要存储的值.对于完整表达式的子表达式的每个允许排序,应满足本段的要求; 否则行为未定义.