在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));
}
Run Code Online (Sandbox Code Playgroud)
在cpp中,以下代码片段的结果是:5 5 5但是在java中,相同代码片段的结果是:3 5 7我不知道为什么,
因为C++不是Java :)
您正在改变v最后两个函数调用中的变量.让我们看看反汇编(在这里调试以更清楚地看到事情,在发布中使用静态值5,但它也可以7很容易.你会明白为什么):
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
Run Code Online (Sandbox Code Playgroud)
表达式评估的顺序不保证是您在此处调用函数的顺序.您正在序列点v之间进行修改. 然后,被分配给第一个函数被调用.请注意,它不必是然后按顺序,它可以被交换!评估的顺序是未指定的,它可以是任何东西.7v575
你有一系列功能变异v两次.您不能指望每个突变都按照您在此处键入的顺序发生.
我们可以简化它.假设我们有两个功能; x而y这两个返回int.如果我写:
int k = x() + y();
Run Code Online (Sandbox Code Playgroud)
x()以前无法保证会被调用y().因此,如果您正在改变两个函数共有的参数,那么突变可能会在第一个调用中发生y(),这就是您所看到的.