我刚开始使用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是我文件的名称。
已解答:感谢您的回复。绝对是很多有用的,非常快速的信息。是的,我应该增加“我可能搞砸了”的可能性=)
答案 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,如果不初始化,函数中的所有内容都将被分配任何。