2013-10-25 50 views
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.

+1

通过调试程序进行调试可以帮助您。 – benjymous

+3

你不是[试图用C编译器编译](http://stackoverflow.com/a/106540​​19/335858),是吗? – dasblinkenlight

+3

我很确定这是由于排序而导致的未定义行为。 – Bathsheba

回答

5

某些预定义运算符,如+ =,当施加到基本类型[§13.5/ 7]

需要一个操作数是一个 左值

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

您的发言可以被作为评估:

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

但在一份声明中修改buffer两次是未定义行为和其他编译器能得到别的东西作为结果。 (不确定在这种情况下!)

+0

@jrok:谢谢,我一开始没有注意到。编辑。 – deepmax

+1

不要太感谢我,我真的不知道了。 :) *“在所有情况下,赋值都是在计算右边和左边的操作数之后,赋值表达式的值计算之前进行排序的。*我很确定它在C++ 03中是未定义的,但是这个引用来自C++ 11. – jrok

+0

@jrok:所以你可以在SO中提出一个很好的问题,你有我的+1 :-) – deepmax