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

Undefined behavior in c/c++: i++ + ++i vs ++i + i++

本文关键字:i++ ++i vs c++ 未定义      更新时间:2023-10-16

假设我们有如下代码:

int i = 1;
int j = i++ + ++i;

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

案例1)

  1. i++的值——i的值为1
  2. ++i的值—i的值为2
  3. 执行运算符加号并将结果3赋值给j,并执行i++的副作用(这一步的顺序也未定义,但我们不关心,因为它不会改变结果)

案例2)

  1. i++的值——i的值为1
  2. i++的副作用——i的值是2
  3. ++i的值——i的当前值为3
  4. 执行运算符加号并将结果4赋值给j

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

int j = ++i + i++;

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

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

  1. ++i的副作用——i的值是2
  2. i++的值——i的值为2
  3. 执行运算符加号并将结果4赋值给j,并执行i++的副作用(这一步的顺序也未定义,但我们不关心,因为它不会改变结果)

我说的对吗?

顺便说一句,我已经读了这个链接:
未定义行为和序列点

int j = ++i + i++;

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

不,你错了。每个表达式++ii++都修改了i,因此该语句修改了i不止一次。这是未定义的行为。

请注意,标准的最新版本不再包括"序列点"的概念。

int i = 1;
int j = i++ + ++i;

计算将从右向左进行,即首先处理++i,然后处理i++。所以j的值是4。

你会得到一个警告,"对'i'的操作可能是未定义的",但是这个表达式没有问题。

相关文章:
  • 没有找到相关文章