Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这是如何评估的?_C++ - Fatal编程技术网

C++ 这是如何评估的?

C++ 这是如何评估的?,c++,C++,我觉得问这个问题很愚蠢。但我自己也无法找出原因 int main() { int target; int buffer =10; const int source = 15; target = (buffer+=source) = 20; cout << target+buffer; return 0; } intmain() { int目标; int缓冲区=10; const int source=15; 目标=(缓冲区+=源)=2

我觉得问这个问题很愚蠢。但我自己也无法找出原因

int main()
{
    int target;
    int buffer =10;
    const int source = 15;
    target = (buffer+=source) = 20;
    cout << target+buffer;
    return 0;
}
intmain()
{
int目标;
int缓冲区=10;
const int source=15;
目标=(缓冲区+=源)=20;
库特
某些预定义运算符(如+=)要求操作数为
适用于基本类型时的左值[§13.5/7]

buffer+=source
返回对
buffer
的左值引用,因此您没有编译错误。

您的陈述可以评估为:

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

但是在一个语句中修改
缓冲区
两次是未定义的行为,另一个编译器可能会对结果进行其他计算。(在这种情况下也不确定!)

使用调试器进行调试会对您有所帮助。您不是,是吗?我很确定这是由于排序而未定义的行为。@Bathsheba的括号不足以确保正确的排序?@Dariusz不,括号只确保关联性。@jrok:谢谢,我一开始没有注意到。已编辑。不要太快感谢我,我会的“我实际上不再确定了。”“在所有情况下,赋值都是在左右操作数的值计算之后,赋值表达式的值计算之前排序的。我很确定它在C++03中是未定义的,但这段引语来自C++11。@jrok:所以你可以在So中提出一个关于这一点的好问题,你有我的+1:-)