【问题标题】:c program returning different answersc程序返回不同的答案
【发布时间】:2011-03-14 23:36:30
【问题描述】:

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

对于欧拉 #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 是我的文件名。

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

【问题讨论】:

  • 你忘记了“不知何故搞砸了”的可能性:)

标签: c gcc compiler-construction


【解决方案1】:
int sum = 0;

如果它没有被初始化(在c)它包含随机垃圾值。因此随机输出

gcc -o euler2 euler2.c

g++ 是针对 c++ 的,但这与你的问题没有任何关系。

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

【讨论】:

    【解决方案2】:

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

    初始化sum,就像对堆栈中的其他变量所做的那样。

    【讨论】:

      【解决方案3】:

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

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


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


      最后,您正在对数据类型int 的范围做出假设。范围取决于您的平台;它可能小到 [-32768, +32767],或者在大多数现代 32 位系统上发现,它可能是 [-2147483648, +2147483647]。

      您可以通过指定您想要一个通常使最大值翻倍的unsigned int 来稍微缓解这种情况(通过禁止负值),但您可能应该查看stdint.h 中可用的固定宽度类型,如果您需要一个特定的范围。

      【讨论】:

        【解决方案4】:

        sum没有初始化,所以它的值不是0,而是一些垃圾。在初始化时加上 sum = 0。

        【讨论】:

          【解决方案5】:

          你没有初始化变量 'sum'

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

              默认情况下只有全局变量为0,如果你不初始化函数中的所有东西都会被赋值anything

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2023-03-22
                • 2015-05-18
                • 1970-01-01
                • 2021-10-24
                • 2015-06-30
                • 2022-12-17
                • 2016-08-26
                相关资源
                最近更新 更多