我正在玩一些递归,并尝试计算递归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 ++,因此,我标记了两者。
答案 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?
在你的情况下。