c程序返回不同的答案

时间:2011-03-14 23:36:31

标签: c gcc compiler-construction

我刚开始使用C并想尝试一个欧拉问题。

对于Euler#2

#include <stdio.h>
int main(){
  int sum;
  int prev = 0;
  int curr = 1;
  int next;

  do{
   if(curr % 2 == 0 ){
     sum = sum + curr;
   }
   next = curr + prev;
   prev = curr;
   curr = next;

  } while (curr <= 4000000);
  printf("%d\n", sum);
  return 0;
}

当我编译这个程序并运行它时,我得到一个完全不同的数字。我现在不在乎我没有得到正确答案,因为我得到的数字有时会变化1,000,000。

我能想到的唯一两件事就是在vm中运行linux会让它变得疯狂,或者某种程度上gcc搞砸了。

g++ euler2.c -o euler2是否正确编译c?是的,euler2.c是我文件的名称。

已解答:感谢您的回复。绝对是很多有用的,非常快速的信息。是的,我应该增加“我可能搞砸了”的可能性=)

7 个答案:

答案 0 :(得分:4)

int sum = 0;

如果未初始化(在c中),则它包含随机垃圾值。因此随机输出

gcc -o euler2 euler2.c

g ++适用于c ++,但这与您的问题没有任何关系。

您可能会觉得这很有趣:http://gcc.gnu.org/onlinedocs/gcc/Invoking-G_002b_002b.html

答案 1 :(得分:4)

因为sum未初始化。正如人们所预料的那样,编译器不会将堆栈上的变量初始化为零。相反,为变量分配了内存,但变量的值取决于占用分配内存的任何内容(实际上是随机的)。

像对堆栈中的其他变量一样初始化sum

答案 2 :(得分:2)

您的变量sum未初始化,因此它不仅以任意值开始,而且“使用”该值实际上是未定义行为,此时可能发生任何事情。

int sum = 0;(并习惯这样做!)


此外,g++是C ++编译器包装器; you want gcc


最后,您要假设数据类型int的范围。它的平台取决于你的范围;它可以像[-32768,+ 32767]一样小,或者在大多数现代32位系统中都可以找到[-2147483648,+ 2147483647]。

您可以通过指定希望unsigned int通常使最大值翻倍(通过禁用负值)来略微缓解此问题,但您可能应该查看{{3}中可用的固定宽度类型},如果你需要一个特定的范围。

答案 3 :(得分:1)

sum未初始化,因此它的值不是0,而是一些垃圾。在初始化时添加sum = 0。

答案 4 :(得分:0)

您没有初始化变量'sum'

答案 5 :(得分:0)

你没有初始化你的sum变量,我怀疑它因此包含一个任意值。

答案 6 :(得分:0)

默认情况下,只有全局变量为0,如果不初始化,函数中的所有内容都将被分配任何