相等运算符优先级不起作用

Equality operator precedence not working

本文关键字:不起作用 优先级 运算符      更新时间:2023-10-16

在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)。因此,您的程序可以评估为truefalse,具体取决于首先评估运算符的哪一侧。如果存在争用条件(编译器也可以自由地并行评估它们(,则每次运行的结果将不同。