4

In the program below I call a function foo() which sets a global variable i and then calls the constructor of class A, where i should also be set, but to 10. However the output of my program is 3 0, can you please explain?

#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

4 回答 4

5

这里有两点需要考虑:

函数参数的评估顺序是Unspecified。所以要么:

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

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

至于为什么3ob函数返回后调用析构函数。所以在返回之后i设置10,返回的是一个副本,并且该副本有一个 value 3

于 2013-06-17T06:37:43.463 回答
1

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

如果你像下面这样打印

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

您将看到 10 3 作为输出。

于 2013-06-17T06:25:38.490 回答
0

在您将“i”作为参数传递的那一刻,它的值为零。foo() 将在此之后将析构函数中的值更改为 10。

正如 juanchopanza 建议的那样,添加另一行 std::cout << i; 你会看到你所期望的,因为此时值是 10。

于 2013-06-17T06:42:32.437 回答
0

使用如下两个 cout 语句打印foo()and ,i

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

输出将是

    i of foo = 3
    i in main = 10

早些时候,您得到了输出,因为编译器正在从左到右评估3 0重载运算符。<<

于 2013-06-17T06:46:32.747 回答