写入全局变量的顺序

Order of writing to a global variable from

本文关键字:顺序 全局变量      更新时间:2023-10-16

在下面的程序中,我调用了一个函数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优先打印

特定于你的编译器。看起来你的编译器从右到左评估参数,因此全局i0被评估为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作为输出,因为重载的操作符<<是由编译器从左到右求值的。