c программа возвращает разные ответы - PullRequest
0 голосов
/ 15 марта 2011

Я только что запустил 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 раз.

Единственное, о чем я могу думать, это запуск Linux ввиртуальный компьютер делает его сумасшедшим или каким-то образом портит gcc.

Правильно ли g++ euler2.c -o euler2 для компиляции c?Да, euler2.c - это имя моего файла.

РЕШЕНО: Спасибо за ответы.Определенно много полезной и чрезвычайно быстрой информации.И да, я должен был добавить возможность того, что "я, возможно, испортил" =)

Ответы [ 7 ]

4 голосов
/ 15 марта 2011

Потому что sum не инициализирован. Компилятор не будет инициализировать переменные в стеке равными нулю, как можно было бы ожидать. Вместо этого память выделяется для переменной, но значение переменной принимает любое содержимое, занимающее выделенную память (что фактически является случайным).

Инициализируйте sum, как вы делали для других переменных в стеке.

4 голосов
/ 15 марта 2011
int sum = 0;

Если он не инициализирован (в c), он содержит значение случайного мусора. отсюда случайный вывод

и

gcc -o euler2 euler2.c

g ++ для c ++, но это не имеет никакого отношения к вашей проблеме.

Возможно, вам будет интересно: http://gcc.gnu.org/onlinedocs/gcc/Invoking-G_002b_002b.html

2 голосов
/ 15 марта 2011

Ваша переменная sum неинициализирована, поэтому она не только начинается с произвольного значения, но и "использует" это значение на самом деле как неопределенное поведение, и в этот момент все может произойти.

Запись int sum = 0; (и привыкните к этому!)


Также, g++ - это оболочка компилятора C ++; вы хотите gcc.


Наконец, вы делаете предположения о диапазоне типа данных int.Это зависит от платформы, какой диапазон будет для вас;это может быть как [-32768, +32767] или, как установлено в большинстве современных 32-битных систем, это может быть [-2147483648, +2147483647].

Вы можете немного уменьшить это,указав, что вы хотите unsigned int, который обычно удваивает максимальное значение (путем запрета отрицательных значений), но вам, возможно, стоит взглянуть на типы фиксированной ширины, доступные в stdint.h , если вам нужен конкретныйдиапазон. * * тысяча двадцать-одна

1 голос
/ 15 марта 2011

сумма не инициализируется, поэтому ее значение не 0, а какой-то мусор. добавить сумму = 0 при инициализации.

0 голосов
/ 15 марта 2011

По умолчанию только глобальные переменные равны 0, всем в функции будет присвоено что угодно , если вы не инициализируете его.

0 голосов
/ 15 марта 2011

Вы не инициализируете свою переменную суммы, я подозреваю, что она содержит произвольное значение.

0 голосов
/ 15 марта 2011

вы не инициализируете переменную 'sum'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...