在下面的程序中,我调用一个函数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";
}
答案 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
作为输出,因为编译器从左到右对重载的运算符<<
进行了评估。