问这个问题我感觉非常愚蠢.但我不能自己找出原因.
int main()
{
int target;
int buffer =10;
const int source = 15;
target = (buffer+=source) = 20;
cout << target+buffer;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
target = (buffer+=source) = 20;将成为target = (25) = 20.
但是如果我在源文件中给出相同的语句,则会产生l值错误.
target+buffer打印的价值如何40.
一些预定义的运算符,例如+ =,在应用于基本类型时需要操作数作为左值[§13.5/ 7]
buffer+=source返回左值引用buffer.所以你没有编译错误.
您的陈述可以评估为:
buffer+=source;
buffer=20;
target=20;
Run Code Online (Sandbox Code Playgroud)
但是buffer在语句中修改两次是未定义的行为,而另一个编译器可以根据结果评估其他内容.(在这种情况下也不确定!)