全局变量在visual studio中无法正确打印

时间:2009-09-01 22:26:21

标签: c++ visual-studio

我正在玩一些递归,并尝试计算递归fib函数中的添加数量(下面的代码)。问题是,g_add永远不会被打印为零(0)。在调试器中它设置正确,但它不能正确打印。事实上,下面的代码有点修改,以便检查其他一切是否正常。在现实生活中,g_add最初设置为零,而不是下面的10,但看输出是打印...

volatile int g_add = 10;
int rfib(int n)
{
    if(n == 0)  return 0;
    else if(n == 1) return 1;
    else {
        ++g_add;
        return rfib(n-1) + rfib(n-2);
    }
}

int _tmain(int argc, _TCHAR* argv[])
{

    printf("Fib: %d\n", g_add);
    for(int n =0; n<6;n++,g_add = 0)
    {
        printf("Fib %d is: %d - additions: %d\n", n, rfib(n), g_add);
    }
}

输出:

Fib: 10
Fib 0 is: 0 - additions: 10
Fib 1 is: 1 - additions: 0 
Fib 2 is: 1 - additions: 0
Fib 3 is: 2 - additions: 0 (note, the debugger says it is 1)
Fib 4 is: 3 - additions: 0
Fib 5 is: 5 - additions: 0

为什么没有正确打印g_add?我能做些什么呢?我尝试使用和不使用volatile关键字。我认为这可能与VS环境有关,而不是C ++,因此,我标记了两者。

2 个答案:

答案 0 :(得分:6)

您假设参数的评估顺序。

请改用:

int fib = rfib(n);
printf("Fib %d is: %d - additions: %d\n", n, fib, g_add);

答案 1 :(得分:1)

标准中未规定对功能参数的评估顺序 允许这些编译器进行适当的优化。

请参阅: What are all the common undefined behaviours that a C++ programmer should know about?

在你的情况下。

  • 正在评估第四个参数(g_add)
  • 在第三个参数(rfib(n))之前