这种情况的结果会是什么?它是定义的还是与编译器相关的
What will be the result of this condition? Is it defined or compiler-dependant?
如果我想给一个变量赋一个新值,并检查新值是否与旧值相同,我倾向于避免使用临时变量。我可以这样做吗?
if (oldval == (oldval = new_value()))
{
... do something
}
?
这种行为是定义良好的还是计算优先级依赖于语言或编译器?我可以尝试一下,看看结果,但不能保证它也能在其他系统上工作。我是用c++做的,所以这是我最感兴趣的语言,但是如果行为在其他语言中是一致的(或不一致的),我想知道。
谢谢!
==
的操作数的求值顺序没有定义(我假设==
没有重载)。不能保证oldval
先评估,还是oldval = new_value()
先评估。在这种情况下,行为未定义。
避免编写这样的表达式:既访问变量的值,又在表达式的其他地方修改该变量。
注意:只有,
、&&
、||
和?:
运算符保证操作数求值从左向右进行。因此,存在序列点:
- 在
&&
(逻辑与)、||
(逻辑或)(作为短路求值的一部分)和逗号运算符的左、右操作数求值之间。- 在三元"问号"操作符的第一个操作数与第二个或第三个操作数的求值之间。
这将是未定义的行为,因为在oldval = new_value()
中发生的对oldval
的写入相对于使用oldval
的值(即)的值计算是无序的。 ==
左侧的求值
相关文章:
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- C++ G++ 编译器 - 错误:隐式声明的定义
- __CHAR_BIT__宏是否为 MSVC 编译器预定义?
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 编译器无法识别在类声明之外定义的方法
- C++自定义分配器大小参数作为模板参数会引发编译器错误
- G++ 编译器未为未定义的方法生成错误/警告
- 如果方法在类中定义,则阻止编译器删除方法
- 存储在 C++ 编译器中的标识符的定义(不是声明)在哪里?
- 编译器如何知道C++constexpr计算不会触发未定义的行为
- 如何在cmake工具链文件中设置编译功能,以便已知的自定义编译器使用target_compile_features
- C++ 添加编译器警告,以错误使用自定义打印/日志功能
- Cmake:如何构建自定义编译器二进制文件,然后将其用于某些目标?
- 如何使用自定义编译器和自定义标志构建Qt
- 强制setup.py使用我的自定义编译器
- 如何为Visual Studio编译器指定自定义编译器标志
- 如何添加node-gyp不直接支持的自定义编译器标志?
- c++结构重定义编译器错误
- 如何部分禁用cmake C/C++自定义编译器检查
- 编译器不允许定义编译器生成的构造函数