表达式优先级?此结果如何发生
Expression priority? How this result happens?
在 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 55 但在 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
表达式求值的顺序不能保证是在此处调用函数的顺序。 您正在修改序列点之间的v
。 7
被分配给v
,然后5
,然后调用第一个函数。 请注意,它不必7
然后按该顺序5
,它可以交换! 评估顺序未指定,可以是任何内容。
你有一连串的功能,v
变异两次。 你不能指望每个突变都会按照你在这里输入的顺序发生。
我们可以简化它。 假设我们有两个函数; x
和y
都返回int
。 如果我写:
int k = x() + y();
不能保证x()
会在y()
之前被调用。 因此,如果您正在更改两个函数共有的参数,那么突变可能会首先发生在对y()
的调用中,这就是您所看到的。
这里的问题是标准不能保证表达式的计算方式。
哦,好吧,它部分做到了这一点,但是如果您编译该代码,您会收到一个特定的警告,指出
warning: operation on ‘v’ may be undefined
我认为这个问题可以启发你这个问题:这段代码定义得很好吗?
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 为什么会发生堆损坏
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- C++中的赋值发生,尽管右侧出现异常
- 写入位置0x0000000C时发生访问冲突
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 函数何时会在c++中包含stack_Unwind_Resume调用
- C++取消引用指针.为什么会发生变化
- 为什么在读取文件大小时文件IO速度会发生变化
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 当变量的顺序发生变化时C++双倍乘法会产生不同的结果
- 如果我将未签名的int添加到负int且算术结果是正面的,会发生什么
- Valgrind 的调试结果没有向我显示发生错误的行数
- 表达式优先级?此结果如何发生
- 如果算术运算的结果未存储在内存中会发生什么情况