C++ 表达优先?这个结果是如何发生的?
在cpp中,以下代码片段的结果是:5 但在java中,相同代码片段的结果是:3 5 7 我不知道为什么,有人能解释吗? 非常感谢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(
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();