这种情况会导致什么结果?它是定义的还是依赖于编译器的?

Mat*_*rba 5 c++ operator-precedence conditional-statements

如果我想为变量分配一个新值并检查新值是否与旧值相同,我倾向于避免使用临时变量.我可以这样做:

if (oldval == (oldval = new_value()))
{
 ... do something
}
Run Code Online (Sandbox Code Playgroud)


这种行为是明确定义还是评估优先级语言或编译器依赖?我可以尝试这个并查看结果,但它不能保证它也能在其他系统上运行.我在C++中这样做,所以这是我最感兴趣的语言,但如果行为在其他语言中是一致的(或不一致的),我想知道.

谢谢!

hac*_*cks 9

操作数的评估顺序==没有定义(我假设==没有超载).无法保证是oldval先评价还是遗嘱评价oldval = new_value().在这种情况下,行为未定义.

避免编写访问变量值的表达式,并在表达式的其他位置修改该变量.


注意:只有运营商 ,,&&,||?:保证了操作评估发生由左到右.所以,存在序列点:

  • 在评估&&(逻辑AND)的左右操作数,||(逻辑OR)(作为短路评估的一部分)和逗号运算符之间.
  • 在评估三元"问号"运算符的第一个操作数和第二个或第三个操作数之间.

  • 我不认为UB是`operator ==`是用户定义的重载. (2认同)

Bri*_*ian 6

这将是未定义的行为,因为对于使用值(左侧的评估)的值计算oldval,对其发生的写入oldval = new_value()是未序的.oldval==

  • 嗯,如果涉及的类型有一个重载的'operator ==`,那么会不会有一个序列点? (2认同)
  • @juanchopanza是的,我想你是对的.在这种情况下,我们将得到`operator ==(oldval,oldval = new_value())`,它看起来很明确. (2认同)