4

问这个问题我感到非常愚蠢。但我自己无法弄清楚原因。

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。

4

1 回答 1

5

一些预定义的运算符,例如 +=,在应用于基本类型时要求操作数是左值 [§13.5/7]

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

您的陈述可以评估为:

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

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

于 2013-10-25T08:11:04.947 回答