请解释这种模棱两可的情况
Please explain this ambiguity?
可能重复:
使用std::cout 评估参数的顺序
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
static int series_num;
void setint(int num) {
series_num = num;
}
int ser() {
series_num = series_num + 23;
return series_num;
}
int main() {
setint(50);
cout << ser() << " " << ser();
getchar();
getchar();
return 0;
}
返回我96 73
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
static int series_num;
void setint(int num) {
series_num = num;
}
int ser() {
series_num = series_num + 23;
return series_num;
}
int main() {
setint(50);
cout << ser();
cout << ser() << endl;
getchar();
getchar();
return 0;
}
返回我73和96
cout << ser() << " " << ser();
这里有两个对ser()
的调用,它们之间没有任何序列点
因此,尚不明确将首先评估什么。
相反,在你的第二个例子中,行为是明确定义的和可预测的。
在第一种情况下,您使用一个序列对ser()进行两次调用,这些调用是从右到左进行的,因此您有9673。
在第一种情况下,
cout << ser() << " " << ser();
相当于:
operator<<(cout.operator<<(ser()),"").operator<<(ser());
是一个完整的表达。单个运算符的操作数和单个表达式的子表达式的求值是无序列的。因此,对ser()的两个调用的执行顺序是未定义的。
你唯一知道的是:
- 对ser()的第一次调用是在插入cout之前执行的
- 对ser()的第二次调用是在插入cout之前执行的
- 之前执行的对ser()的调用是未定义的(它们是未排序的)
因此,一个实现返回96 73并且不同的实现返回73 96是有效的。
此外,在执行过程中多次求值的表达式中对于一个程序,其子表达式的无序列和不确定序列的求值不需要在不同的求值中一致地执行。这允许如果表达式
cout << ser() << " " << ser();
在一个程序中运行两次,选择不同的顺序。
在第二个程序中。
cout << ser();
cout << ser() << endl;
是两个完整的表达式(在两个单独的语句中)。在这种情况下,第一个语句在第二个语句之前排序,因为与完整表达式相关联的每个值计算和副作用都在与要评估的下一个完整表达式相关的每个值运算和副作用之前排序。
因此,唯一可能的结果是7396。
相关文章:
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 函数中堆分配的效果与缺少堆分配的情况
- 在未初始化映射的情况下,将值插入到映射的映射中
- 是默认情况下分配给char数组常量的值
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在已经使用Git的情况下减少编译时间
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 如何在没有信号的情况下从C++执行QML插槽
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 为什么在某些情况下不写入此文件?
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 为什么这个音频包络不能通过开关的情况?
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 请解释这种模棱两可的情况