c/c++ 中的未定义行为:i++ + ++i vs ++i + i++

Yve*_*ves 1 c++ side-effects undefined-behavior sequence-points

想象一下,我们有以下代码:

int i = 1;
int j = i++ + ++i;
Run Code Online (Sandbox Code Playgroud)

我知道这是一个未定义的行为,因为在分号之前,它是一个序列点,的值i已经改变了不止一次。这意味着即使运算符 plus 的优先级是从左到右,编译器也可能有两种可能性:

情况1)

  1. 取值i++--- 的值为i1
  2. 取值++i--- 的值为i2
  3. 执行运算符加号并将结果分配为 ​​3j并执行副作用i++(此步骤的顺序也未定义,但我们不在乎,因为它不会改变结果)

情况 2)

  1. 取值i++--- 的值为i1
  2. i++---的副作用i是 2
  3. 取值++i---当前值为i3
  4. 做运算符加号并将结果分配给 4 j

如果这里没有问题,我有一个问题:

int j = ++i + i++;

上面的代码仍然是未定义的行为吗?

在我看来,只有一种可能:

  1. ++i---的副作用i是 2
  2. 取值i++--- 的值为i2
  3. 执行运算符加号并将结果分配为 ​​4j并执行副作用i++(此步骤的顺序也未定义,但我们不在乎,因为它不会改变结果)

我对吗?

顺便说一句,我已阅读此链接:
未定义的行为和序列点

R S*_*ahu 5

int j = ++i + i++;
Run Code Online (Sandbox Code Playgroud)

仍然是未定义的行为,因为++ii++可以在某些 CPU 的多个管道中同时处理,这将导致不可预测的结果。

  • @托马斯。没有什么比从左到右的优先顺序更好了。存在从左到右的结合性。 (2认同)