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

时间:2012-03-29 00:35:34

标签: 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));
}

2 个答案:

答案 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之间修改v7被分配到v,然后5,然后调用第一个函数。请注意,它不必是7,然后按顺序5,它可以被交换!评估顺序未指定,可能是任何内容。

你有一系列功能可以两次变异v。你不能指望每个突变都按你在这里输入的顺序发生。

我们可以简化它。假设我们有两个功能;两者都返回x yint。如果我写:

int k = x() + y();

无法保证在x()之前调用y()。所以,如果你要改变两个函数共有的参数,那么首先调用y()就会发生变异,这就是你所看到的。

答案 1 :(得分:2)

这里的问题是标准不保证如何评估表达式。

哦,它可以部分完成,但如果您编译该代码,则会收到一条特定的警告

warning: operation on ‘v’ may be undefined

我认为这个问题可以帮助你解决这个问题:Is this code well-defined?