C中的递归仅在打印不相关的内容时有效

1 c recursion printf fibonacci

我刚刚开始学习C,我决定研究一些欧拉问题来练习.无法运行的程序是为了解决Problem2,它要求计算低于4,000,000的所有偶数Fibonacci数的总和.

这个程序的真正奇怪之处在于它实际上是有效的,但是只有在递归过程中我打印一些东西时:每当我尝试printf("bazooka");在递归函数中注释掉这一行时,我得到的结果看似完全随机,并且在大正数和大负数之间变化连续执行相同程序时的数字(例如-882154758和770491113).另一方面,如果我打印一些东西,无论如何,在递归函数中,我得到正确的输出.

我发现这种行为非常奇怪和有趣,而且我真的想知道发生了什么:真正令我感到困惑的是,即使程序根本没有改变,输出的数字也会改变.另外,我不明白为什么在递归期间打印应该对正在执行的整数计算产生任何影响.

这是我的主要功能:

int first = 1; int second = 2; int total = 0;
total = Fibo(first,second, total);
printf("\nthis is my result for Euler 2: ");
printf("%d",total);
Run Code Online (Sandbox Code Playgroud)

这是我的递归函数:

  int Fibo(int first, int second, int total) {
  printf("bazooka");
  if (second < 4000000) {
    int add;
    second = first+second;
    first = second-first;
    if (first%2 == 0) {
      add = first;
    }
      total = add+Fibo(first,second,total);
  }
  return total;
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我解决这个问题吗?我非常感谢你的帮助.

use*_*342 6

add如果first是奇数,则不会初始化.确保在两种情况下初始化变量,并且bug将消失.

现在,为了解释观察到的行为:使用未初始化的变量可以显示为随机"值",或者它可能导致程序以其他随机方式出现故障.(类C语言中的技术术语是未定义的行为.)在您的情况下,该值可能是以前使用的函数堆栈帧的内存位置遗留下来的垃圾,或者之前的值登记册.调用printf似乎可以解决问题,因为它的实现恰好使用并清除了内存的相关部分.不用说,这不是你可以依赖的东西.

请注意,编译器会使用适当的警告设置(例如-WallGCC或Clang)来诊断此类错误.