相等运算符优先级不起作用
Equality operator precedence not working
在C++中,相等运算符的关联性是从左到右的,如此处和此处所述,赋值操作的返回值是分配给给定变量的值。(如此处、此处、此处和此处所示(第 6.5.16 节,最后一个链接第 101-104 页(。
根据这些信息,这:
double d = 5;
if (d == (d = 6))
cout << "but d was 5...!!!" << endl;
else
cout << "5!=6 :)" << endl;
应该打印"5!=6 :)"
,因为表达式,(d == (d = 6))
等同于(5 == (6))
(这是假的(,但相反,"but d was 5..."
被打印。谁能解释为什么?
该标准的相关部分是这样的:
[intro.execution]/15 除非另有说明,否则对单个运算符的操作数和单个表达式的子表达式的计算是无序的。运算符操作数的值计算在运算符结果的值计算之前进行排序。如果标量对象的副作用相对于同一标量对象上的另一个副作用或使用同一标量对象的值进行的值计算是未排序的,并且它们不是潜在的并发 (1.10(,则行为是未定义的。
强调我的。您的程序表现出未定义的行为,因为d
(在比较的右侧(的修改未排序与d
的值计算(在相同的左侧(。关联性和优先级不会进入此。
您将关联性与评估顺序混淆了。
从左到右的关联性意味着
a == b == c
被解释为
(a == b) == c
这与像 a == b
这样的表达式中术语的评估顺序无关。编译器可以自由地计算a
,并以任何顺序b
。因此,在您的情况下,编译器可以先自由地计算d
或先(d = 6)
。因此,您的程序可以评估为true
或false
,具体取决于首先评估运算符的哪一侧。如果存在争用条件(编译器也可以自由地并行评估它们(,则每次运行的结果将不同。
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 相等运算符优先级不起作用
- C 评估表达操作员优先级不起作用
- 中缀到后缀 - 优先级不起作用
- 优先级队列成员函数不起作用
- 使用 BST 的优先级队列 -- 删除最大不起作用
- ActiveMQ 3.8.3 (CPP) 优先级备份的问题不起作用