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