表达优先?这个结果怎么样?

new*_*wda 5 c++

在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)

Ed *_* S. 6

在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两次.您不能指望每个突变都按照您在此处键入的顺序发生.

我们可以简化它.假设我们有两个功能; xy这两个返回int.如果我写:

int k = x() + y();
Run Code Online (Sandbox Code Playgroud)

x()以前无法保证会被调用y().因此,如果您正在改变两个函数共有的参数,那么突变可能会在第一个调用中发生y(),这就是您所看到的.