写入全局变量的顺序

时间:2013-06-17 06:23:47

标签: c++ constructor global-variables

在下面的程序中,我调用一个函数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";
}

4 个答案:

答案 0 :(得分:5)

这里有两点需要考虑:

对函数参数的评估顺序为未指定。所以:

    首先执行
  • foo()
  • 首先打印
  • i

它特定于您的编译器。看起来您的编译器从右到左评估参数,因此i的全局0被评估为0。请记住,对于其他编译器,此顺序可能不同,您不应该依赖于一个实现的行为。

至于为什么3?函数返回后调用ob的析构函数。因此,i在返回后设置为10,返回的是副本,该副本的值为3

答案 1 :(得分:1)

因为返回值在析构函数后被复制。 我先打印,然后调用foo,输出3 0。

如果您打印如下

cout << "i = " << i <<" " << foo()<< endl;

你会看到10 3作为输出。

答案 2 :(得分:0)

当你传递'i'作为参数时,它的值为零。 foo()会将析构函数中的值更改为10。

正如juanchopanza建议的那样,添加另一行std :: cout&lt;&lt;一世;你会看到你的期望,因为那时的价值是10。

答案 3 :(得分:0)

使用以下两个cout语句打印foo()i

    cout << "i of foo = " << foo();
    cout <<"\ni in main = " << i << endl;

输出

    i of foo = 3
    i in main = 10

之前您获得了3 0作为输出,因为编译器从左到右对重载的运算符<<进行了评估。