写入全局变量的顺序
Order of writing to a global variable from
在下面的程序中,我调用了一个函数foo()
,它设置了一个全局变量i
然后调用class A
的构造函数,其中i
也应该设置,但是到10
。但是我的程序输出是3 0
,你能解释一下吗?
#include <iostream>
int i;
class A
{
public:
~A()
{
i=10;
}
};
int foo()
{
i = 3;
A ob;
return i;
}
int main()
{
std::cout << "i = " << foo() << " " << i << "n";
}
这里有两点需要考虑:
函数的实参求值顺序为Unspecified。所以要么:
-
foo()
优先执行或 -
i
优先打印
特定于你的编译器。看起来你的编译器从右到左评估参数,因此全局i
是0
被评估为0
。请记住,这个顺序可能与其他编译器不同,您不应该依赖于一个实现的行为。
为什么是3
?ob
的析构函数在函数返回后被调用。因此,返回后,i
被设置为10
,返回的是一个副本,该副本的值为3
。
这是因为返回值在析构函数之后被复制。首先输出I,然后调用foo,因此输出3 0.
如果像下面这样打印
cout << "i = " << i <<" " << foo()<< endl;
您将看到10 3作为输出
在传递'i'作为参数的那一刻,它的值为零。foo()会将析构函数中的值改为10。
按照juanchopanza的建议,再加一行std::cout <<我;你会看到你所期望的,因为在那个点的值是10
使用以下两个cout语句打印foo()
和i
,
cout << "i of foo = " << foo();
cout <<"ni in main = " << i << endl;
输出将是
i of foo = 3
i in main = 10
之前你得到3 0
作为输出,因为重载的操作符<<
是由编译器从左到右求值的。
相关文章:
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 当vector是tje全局变量时,c++中vector的内存管理
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 内联函数中具有内部链接的全局变量
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 全局变量 多读取器 一个写入器多线程安全?
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 不同作用域中的静态变量和全局变量
- C++ 在编译时具有函数计算全局变量
- 修改程序的入口点时未调用全局变量的构造函数
- 使用 std::ios_base::Init 正确初始化全局变量
- 为什么我的全局变量似乎没有变化?
- 视觉C++:在 DLL 加载期间,全局变量初始化顺序是否具有确定性?
- C 11指定静态/全局变量的构造顺序
- 静态全局变量初始化顺序
- C++全局变量初始化顺序
- 全局变量的顺序会改变C /OpenGL的性能
- 确保全局变量的初始化顺序正确
- 全局变量的实例化顺序
- 写入全局变量的顺序