gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:16:34 25 4
gpt4 key购买 nike

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

最佳答案

In cpp, the result of the following code snippet is: 5 5 5 But in java, the result of the same code snippet is: 3 5 7 I do not know why,

因为 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

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

你有一个函数链,它会改变 v 两次。您不能指望每个突变都会按照您在此处键入的顺序发生。

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

int k = x() + y();

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

关于c++ - 表达优先?这个结果是如何发生的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9917643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com