C++ 表达优先?这个结果是如何发生的?

C++ 表达优先?这个结果是如何发生的?,c++,C++,在cpp中,以下代码片段的结果是: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(

在cpp中,以下代码片段的结果是: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));
}
H类
{
公众:
H&pr(整数n,字符*提示)
{

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

哦,好吧,它只做了一部分,但是如果你编译代码,你会得到一个特定的警告

warning: operation on ‘v’ may be undefined
我认为这个问题可以给你一些启发:

在cpp中,以下代码片段的结果是:5,但在java中,相同代码片段的结果是:3 5 7我不知道为什么

因为C++不是java:< /P> 在最后两个函数调用中,您正在对变量

v
进行变异。让我们看看disassembly(在这里进行调试以更清楚地了解情况,在发行版中使用了
5
的静态值,但它也可以是
7
。您将看到原因):

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

你有一个函数链,它会变异两次。你不能指望每个变异都会按照你在这里键入的顺序发生

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

int k = x() + y();

无法保证将在调用
y()
之前调用
x()
。因此,如果要对两个函数共用的参数进行变异,则变异可能首先发生在对
y()
的调用中,这就是您看到的情况。

简短的回答是“C++不是Java”顺便说一句,我喜欢让我进行一些反汇编的问题。:)+1让它更明确一点:根据标准,该程序具有未定义的行为,这意味着该程序基本上可以生成以下任何输出:356;355;377;555;557;577(可能还有我跳过的其他输出)
int k = x() + y();