Błędne działanie programu

Błędne działanie programu
E7
  • Rejestracja:4 miesiące
  • Ostatnio:4 miesiące
  • Postów:3
0

Witajcie, dlaczego panu na youtube ten program oblicza dobrą sumę gdy int sum; nie ma dopisanego zera, a u mnie podaję nieprawidłowy wynik?

Kopiuj
#include <stdio.h>

int main() {
  int number, sum;
  printf("Enter numbers to add (0 to stop): \n");
  scanf("%d", &number);

  while (number != 0) {
    sum = sum + number;
    scanf("%d", &number);
  }
  printf("Sum of numbers is: %d \n", sum);

  return 0;
}

Ja zmieniłem tak dodając int sum = 0; i teraz działa. Ale dlaczego u niego nie występuje błąd?

Kopiuj
#include <stdio.h>

int main() {
  int number, sum = 0;
  printf("Enter numbers to add (0 to stop): \n");
  scanf("%d", &number);

  while (number != 0) {
    sum += number;
    scanf("%d", &number);
  }
  printf("Sum of numbers is: %d \n", sum);

  return 0;
}

To mówi Skynet:
W języku C, zmienne lokalne (takie jak sum w Twoim programie) nie są automatycznie inicjalizowane do zera. Ich wartość początkowa jest nieokreślona, co oznacza, że może zawierać dowolną wartość, która była wcześniej w tym miejscu w pamięci. To może prowadzić do nieprzewidywalnych wyników, gdy próbujesz używać takiej zmiennej przed jej zainicjowaniem.

Jeśli w innym kompilatorze program działał bez inicjalizacji sum, to może być kilka powodów:

Nieprzewidywalne zachowanie: W innym kompilatorze wartość sum mogła być przypadkowo ustawiona na 0 lub inną wartość, co sprawiło, że program działał poprawnie. To jednak nie jest gwarantowane i nie powinno być traktowane jako poprawne zachowanie.

Optymalizacje kompilatora: Różne kompilatory mogą stosować różne optymalizacje, które mogą wpływać na sposób, w jaki zmienne są inicjalizowane lub używane. W niektórych przypadkach kompilator może zainicjować zmienną do zera, ale to nie jest standardowe zachowanie.

Środowisko uruchomieniowe: Różne środowiska uruchomieniowe mogą mieć różne stany pamięci, co może wpływać na to, jakie wartości są dostępne w nieprzypisanych zmiennych.

Zaleca się zawsze inicjowanie zmiennych przed ich użyciem, aby uniknąć nieprzewidywalnych wyników i zapewnić, że program działa zgodnie z oczekiwaniami w każdym kompilatorze i środowisku.

edytowany 2x, ostatnio: engine7
MarekR22
ten tytuł nie ma sensu, bo nie niesie żadnej informacji. W większości problemów opisanych na forach, coś nie działa.
DR
  • Rejestracja:około 12 lat
  • Ostatnio:około 10 godzin
  • Postów:1131
4

Albo u Pana yt sum jest nad main albo ma szczęście

MY
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 8 godzin
  • Postów:1083
3

Ewentualnie program działa w trybie debug, który ma włączone zerowanie zmiennych lokalnych. Jak już sam pytający napisał, wina leży po stronie niezainicjowanych zmiennych.

MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:4 minuty
4

Problem z internetem polega na tym, że publikować może każdy bez względu na zdolności.
Niestety jest grupa, która zaraz po nauczeniu się pisania "hello world" biegnie na YT/TikTok by podzielić się "wiedzą".
Najgorsze jest ich dwa rzędy wielkości więcej, niż ludzi kompetentnych publikujących w internecie, a początkujący nie jest w stanie odróżnić obu grup.
Na dodatek kompetentni szybko tracą zainteresowanie publikowaniem rzeczy o podstawach, bo jest dużo innych ciekawszych tematów.

Link ze zmienionym (ale nie naprawionym) kodem do eksperymentowania:
https://godbolt.org/z/38E1YTjYf


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.