{
cout « "Pętla" « endl; nNowePróbki = 0;
Po
int nNowePróbki; int nRozmBuf;
nNowePróbki = -1; nRozmBuf =10;
cout « "Start" << endl;
while (nNowePróbki >= nRozmBuf)
cout « "Pętla" « endl; nNowePróbki = 0;
Liczby ze znakiem i bez znaku mająinne zakresy, ale można stosować między nimi konwersję. Oznacza to, że przez przypadek można porównać oba typy i uzyskać błędny wynik. Stanie się tak wówczas, gdy wartość liczby bez znaku jest na tyle duża, że podczas konwersji na liczbę ze znakiem będzie potraktowana jako liczba ujemna. W wyniku możemy otrzymać nieskończoną pętlę lub inne interesujące efekty uboczne.
Weźmy na przykład fragment „Przed”, w którym porównujemy wartość liczby bez znaku z liczbą ze znakiem. Zmiennej zostaje przypisana wartość -1, ale ponieważ zmienna ta ma typ bezznakowy, zostaje zamieniona na bardzo dużą liczbę. Porównanie jej z liczbą 10 powoduje spełnienie warunku pętli i wykonanie pętli.
Natomiast w poprawionym fragmencie „Po” obie liczby są ze znakiem i warunek pętli nie jest spełniony.
Podany przykład jest prosty i łatwo dostrzec, w którym miejscu tkwi problem. W rzeczywistych sytuacjach znalezienie błędu bywa znacznie trudniejsze. Ogólnie nie należy mieszać liczb bez znaku z liczbami ze znakiem. Gdy się na to decydujemy, wówczas powinniśmy zachować dużą ostrożność.
unikanie banalnych błędów
Przed
if(!(i+1 % 64)) cout« "\n";