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

Krö*_*röw 0 c++ associativity

在C++中,相等运算符的关联性是从左到右,如此此处所述,赋值操作的返回值是分配给给定变量的值.(如图所示这里,这里,这里,并在这里,(部分6.5.16,在最后一个环节101-104页).)

根据这些信息,这个:

double d = 5;

if (d == (d = 6))
    cout << "but d was 5...!!!" << endl;
else
    cout << "5!=6 :)" << endl;
Run Code Online (Sandbox Code Playgroud)

应该打印,"5!=6 :)"因为表达式,(d == (d = 6))相当于(5 == (6))(这是假的),而是"but d was 5..."打印.有谁能解释为什么?

Igo*_*nik 6

标准的相关部分是这样的:

[intro.execution]/15除非另有说明,否则对单个运算符的操作数和单个表达式的子表达式的评估都是无效的.在运算符的结果的值计算之前,对运算符的操作数的值计算进行排序.如果对标量对象的副作用相对于同一标量对象的另一个副作用或使用相同标量对象的值进行的值计算未被排序,并且它们不可能是并发的(1.10),则行为未定义.

强调我的.您的程序显示未定义的行为,因为d(在比较的右侧)修改了(在其左侧)的值计算d.相关性和优先权不会进入此.