用C++表达

shr*_*sva 2 c++

int main() {
  int a = 10;
  int b = a * a++;
  printf("%i %i", a, b);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

以上代码的输出是否未定义行为?

sha*_*oth 6

没有

int b = a * a++;
Run Code Online (Sandbox Code Playgroud)

行为是未定义的,因此结果可以是任何东西 - 这不是"依赖于实现"的含义.

你可能想知道为什么它在UB这里a只修改了一次.原因是标准的5/4段中还要求只能访问先前值以确定要存储的值.a只应读取以确定新值a,但这里a读取两次 - 一次计算第一个乘数,再次计算结果a++具有写入新值的副作用a.所以即使a在这里修改一次,它也是未定义的行为.