表达式优先级?此结果如何发生

Expression priority? How this result happens?

本文关键字:何发生 结果 优先级 表达式      更新时间:2023-10-16

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

表达式求值的顺序不能保证是在此处调用函数的顺序。 您正在修改序列点之间的v7被分配给v,然后5,然后调用第一个函数。 请注意,它不必7然后按该顺序5,它可以交换! 评估顺序未指定,可以是任何内容。

你有一连串的功能,v变异两次。 你不能指望每个突变都会按照你在这里输入的顺序发生。

我们可以简化它。 假设我们有两个函数; xy都返回int。 如果我写:

int k = x() + y();

不能保证x()会在y()之前被调用。 因此,如果您正在更改两个函数共有的参数,那么突变可能会首先发生在对y()的调用中,这就是您所看到的。

这里的问题是标准不能保证表达式的计算方式。

哦,好吧,它部分做到了这一点,但是如果您编译该代码,您会收到一个特定的警告,指出

warning: operation on ‘v’ may be undefined

我认为这个问题可以启发你这个问题:这段代码定义得很好吗?