如果我想为变量分配一个新值并检查新值是否与旧值相同,我倾向于避免使用临时变量。我可以这样做:
if (oldval == (oldval = new_value()))
{
... do something
}
?
这种行为是明确定义还是评估优先级语言或编译器依赖?我可以尝试这个并查看结果,但它不能保证它也能在其他系统上运行。我在C ++中这样做,所以这是我最感兴趣的语言,但如果行为在其他语言中是一致的(或不一致的),我想知道。
谢谢!
答案 0 :(得分:9)
==
的操作数的评估顺序未定义(我假设==
没有超载)。无法保证oldval
是先评估还是oldval = new_value()
评估。在这种情况下,行为未定义。
避免编写访问变量值的表达式,并在表达式的其他地方修改该变量。
注意:只有运营商,
,&&
,||
和?:
保证操作数评估从左到右进行。所以,存在sequence point:
- 在评估
&&
(逻辑AND),||
(逻辑OR)(作为短路评估的一部分)和逗号运算符的左右操作数之间。- 在评估三元“问号”运算符的第一个操作数与第二个或第三个操作数之间。
答案 1 :(得分:6)
这将是未定义的行为,因为oldval
中对oldval = new_value()
的写入对于使用oldval
值的值计算未被排序(即评估==
的左侧。)