在cpp中,以下代码段的结果为:5 5 5 但在java中,相同代码片段的结果是:3 5 7 我不知道为什么,有人能解释一下吗? 非常感谢!
class H
{
public:
H &pr (int n, char * prompt)
{
cout<<prompt<<n<<" ";
return *this;
}
H &fn(int n)
{
return pr(n,"");
}
};
void test()
{
int v=3;
H h;
h.fn(v).fn(v=5).fn((v=7));
}
答案 0 :(得分:6)
在cpp中,以下代码片段的结果是:5 5 5但是在java中,相同代码片段的结果是:3 5 7我不知道为什么,
因为C ++不是Java:)
您正在改变最后两个函数调用中的变量v
。让我们看看反汇编(在这里调试以更清楚地看到事情,在发布时使用5
的静态值,但也可以7
同样容易。你会明白为什么):< / p>
h.fn(v).fn(v=5).fn((v=7));
00411565 mov dword ptr [v],7
0041156C mov dword ptr [v],5
00411573 mov eax,dword ptr [v]
00411576 push eax
表达式评估的顺序不保证是您在此处调用函数的顺序。您正在sequence points之间修改v
。 7
被分配到v
,然后5
,然后调用第一个函数。请注意,它不必是7
,然后按顺序5
,它可以被交换!评估顺序未指定,可能是任何内容。
你有一系列功能可以两次变异v
。你不能指望每个突变都按你在这里输入的顺序发生。
我们可以简化它。假设我们有两个功能;两者都返回x
y
和int
。如果我写:
int k = x() + y();
无法保证在x()
之前调用y()
。所以,如果你要改变两个函数共有的参数,那么首先调用y()
就会发生变异,这就是你所看到的。
答案 1 :(得分:2)
这里的问题是标准不保证如何评估表达式。
哦,它可以部分完成,但如果您编译该代码,则会收到一条特定的警告
warning: operation on ‘v’ may be undefined
我认为这个问题可以帮助你解决这个问题:Is this code well-defined?