#include <iostream>
using namespace std;
int a = 8;
int g()
{
a++;
return a - 1;
}
int f()
{
a++;
return a;
}
int main()
{
cout << g() << " " << f() << " " << g() + f() << endl;
system("PAUSE");
return 0;
}
输出为“11 11 18”
答案 0 :(得分:9)
在C ++中未指定函数的评估顺序。在代码中:
cout << g() << " " << f() << " " << g() + f() << endl;
编译器可以发出代码来调用f(),f(),g(),g()然后添加结果。或者它可以做其他事情。
这与cout,BTW一起使用并不具体 - 如果你编写这样的代码:
x = a() + b() * c();
无法保证调用a,b和c的顺序。这是全局变量为坏事的众多原因之一 - 您通常无法预测将如何调用更改它们的函数。
答案 1 :(得分:4)
它与评估顺序有关。在这种情况下,首先计算g()+ f(),从而得到8 + 10 = 18.在此之后a == 10和f()被评估,得到11并将a设置为11等
答案 2 :(得分:4)
对于此特定结果,首先评估g() + f()
,这将导致a
最终增加到10
,结果为18
。无论该总和的g()
或f()
位是否先完成,都是这种情况。首先g()
执行8+10
,否则9+9
。
然后评估f()
,将a
设置为11
并返回11
。
然后评估g()
,将a
设置为12
并返回11
。
换句话说,它是首先调用 cout
的最右边位并继续向左移动。
现在你会在上面的ramblings中注意到“for this specific result”这句话。这是否是标准规定的,我不确定(意思是我现在不能打扰它),但我非常怀疑它,基于经验。
因此,虽然它实际上以正确的顺序输出项目,但副作用可能因大量事物而异。这就是为什么全局变量(或更确切地说,对它们的副作用)很少是一个好主意的一个原因,你应该重新考虑使用它们: - )
答案 3 :(得分:3)
除非表达式中有sequence point,否则无法保证执行顺序。如果你想知道这里的订单,你必须把它分成单独的陈述。
cout << g() << " ";
cout << f() << " ";
int temp = g();
temp += f();
cout << temp << endl;
答案 4 :(得分:2)
a是一个全局变量,因此被所有人访问。
另外,运营商&lt;&lt;正在从右到左访问,所以:
g()+ f()= 8 + 10 = 18(a之后为10)
f()= 11,a为11
g()= 11且a为12
答案 5 :(得分:0)
cout << g() << " " << f() << " " << g() + f() << endl;
与
相同cout.operator<<(operator<<(operator<<(operator<<(operator<<(operator<<(endl), g() + f()), " "), f()), " "), g());
调用函数的顺序是发生这种情况的原因。