这是如何评估的?

时间:2013-10-25 08:05:47

标签: c++

我对这个问题感到非常愚蠢。但是我不能自己找出原因。

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。

1 个答案:

答案 0 :(得分:5)

  

某些预定义的运算符(例如+ =)需要一个操作数   应用于基本类型时的左值[§13.5/ 7]

buffer+=source返回对buffer的左值引用。 所以你没有编译错误。

你的陈述可以评估为:

buffer+=source;
buffer=20;
target=20;

但是在语句中修改buffer两次是 未定义的行为 ,而另一个编译器可以根据结果评估其他内容。 (在这种情况下也不确定!)