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

时间:2014-06-04 20:58:50

标签: c++ conditional-statements operator-precedence

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

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


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

谢谢!

2 个答案:

答案 0 :(得分:9)

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

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


注意:只有运营商,&&||?:保证操作数评估从左到右进行。所以,存在sequence point

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

答案 1 :(得分:6)

这将是未定义的行为,因为oldval中对oldval = new_value()的写入对于使用oldval值的值计算未被排序(评估==的左侧。)