Indeks pętli for przybiera absurdalną wartość przy dekrementacji

Indeks pętli for przybiera absurdalną wartość przy dekrementacji
residue
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0

Dobry wieczór - na początek chciałbym się przywitać ze wszystkimi forumowiczami. Nie znalazłem działu powitalnego, więc zrobię to tutaj, w moim pierwszym temacie. Mam nadzieję, że nie tylko będę tu mógł zasięgnąć pomocy w identyfikacji błędów lecz także sam będę mógł pomóc osobom mniej doświadczonym (rzecz jasna - dopiero gdy sam będę posiadał odpowiednie doświadczenie :)). Przechodząc do właściwego tematu:

user image

Jakim cudem indeks pętli osiąga taką wartość?

Pozdrawiam i z góry dziękuję za pochylenie się nad moim problemem.

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
1

Następuje underflow i licznik się przekręca.
Tzn. gdy i przyjmie wartość 0, pętla nadal będzie się wykonywać (z racji warunku i >= 0), i właśnie to --i dla i=0 powoduje przekręcenie do 255.

residue
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0

Przy zmianie dekrementacji na i-- błąd się nie zmienia, to samo po przeniesieniu jej do nawiasu for(). Czy powinienem zmienić warunek? Jeśli tak, to na jaki?

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
1

Musiałbyś zmienić warunek na i > 0, albo wyjść ze średniowiecza i nie iterować zmienną z typem liczbowym bez znaku (unsigned).

residue
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 18
0

Dziękuję Ci za dosadną i konkretną odpowiedź. Rzeczywiście, umknęło mi dodatkowe niepotrzebne wykonanie pętli przez sknocony warunek. :)

vpiotr
  • Rejestracja: dni
  • Ostatnio: dni
1

Krótko: warunek pętli zawsze będzie spełniony, niezależnie od tego co się dzieje w środku (dlatego będzie się zawsze pętlić). Powód - byte (nieznakowany typ zawsze jest >= 0).

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.