这种情况的结果会是什么?它是定义的还是与编译器相关的

What will be the result of this condition? Is it defined or compiler-dependant?

本文关键字:定义 编译器 情况 结果 是什么      更新时间:2023-10-16

如果我想给一个变量赋一个新值,并检查新值是否与旧值相同,我倾向于避免使用临时变量。我可以这样做吗?

if (oldval == (oldval = new_value()))
{
 ... do something
}

?
这种行为是定义良好的还是计算优先级依赖于语言或编译器?我可以尝试一下,看看结果,但不能保证它也能在其他系统上工作。我是用c++做的,所以这是我最感兴趣的语言,但是如果行为在其他语言中是一致的(或不一致的),我想知道。

谢谢!

==的操作数的求值顺序没有定义(我假设==没有重载)。不能保证oldval先评估,还是oldval = new_value()先评估。在这种情况下,行为未定义

避免编写这样的表达式:既访问变量的值,又在表达式的其他地方修改该变量。


注意:只有,&&||?:运算符保证操作数求值从左向右进行。因此,存在序列点:

  • &&(逻辑与)、||(逻辑或)(作为短路求值的一部分)和逗号运算符的左、右操作数求值之间。
  • 在三元"问号"操作符的第一个操作数与第二个或第三个操作数的求值之间。

这将是未定义的行为,因为在oldval = new_value()中发生的对oldval的写入相对于使用oldval的值()的值计算是无序的。 ==左侧的求值