救命?为什么输出是这样的?

时间:2011-05-13 13:59:12

标签: c++ global-variables

#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”

6 个答案:

答案 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());

调用函数的顺序是发生这种情况的原因。