c/c++中的未定义行为:i++ + ++i vs ++ i++ i++
Undefined behavior in c/c++: i++ + ++i vs ++i + i++
假设我们有如下代码:
int i = 1;
int j = i++ + ++i;
我知道这是一个未定义的行为,因为在分号之前,这是一个序列点,i
的值已经被改变了不止一次。这意味着即使operator plus的优先级是从左到右,编译器也可能有两种可能性:
案例1)
- 取
i++
的值——i
的值为1 - 取
++i
的值—i
的值为2 - 执行运算符加号并将结果3赋值给
j
,并执行i++
的副作用(这一步的顺序也未定义,但我们不关心,因为它不会改变结果)
案例2)
- 取
i++
的值——i
的值为1 - 取
++i
的值——i
的当前值为3 - 执行运算符加号并将结果4赋值给
j
i++
的副作用——i
的值是2如果这里没有问题,我有一个问题:
int j = ++i + i++;
上面的代码仍然是一个未定义的行为吗?
在我看来,只有一种可能:
-
++i
的副作用——i
的值是2 - 取
i++
的值——i
的值为2 - 执行运算符加号并将结果4赋值给
j
,并执行i++
的副作用(这一步的顺序也未定义,但我们不关心,因为它不会改变结果)
我说的对吗?
顺便说一句,我已经读了这个链接:
未定义行为和序列点
int j = ++i + i++;
仍然是未定义的行为,因为++i
和i++
可以在某些cpu的多个管道中同时处理,这将导致不可预测的结果。
不,你错了。每个表达式++i
和i++
都修改了i
,因此该语句修改了i
不止一次。这是未定义的行为。
请注意,标准的最新版本不再包括"序列点"的概念。
int i = 1;
int j = i++ + ++i;
计算将从右向左进行,即首先处理++i
,然后处理i++
。所以j
的值是4。
你会得到一个警告,"对'i'的操作可能是未定义的",但是这个表达式没有问题。
相关文章:
- 没有找到相关文章