Jedną z rzeczy, których nie lubię w C++, jest operator porównania. Podczas, gdy w szkole od pierwszej klasy uczą nas, że znak równości oznacza się symbolem”=”, C++ używa tego znaku do… przypisywania wartości do zmiennej!
W czym problem
Ileż to razy przez roztargnienie próbowałem wykonać takie oto “porównanie”:
if (index = ITEM_COUNT) { ... }
Program skompilował się bezbłędnie, uruchamiam, działa…ale niepoprawnie!. Co jest grane? Program, jakże sprytnie, najpierw przypisuje do zmiennej index wartość stałej ITEM_COUNT, a następnie sprawdza warunek. O ile tylko ITEM_COUNT będzie różne od zera, to wyrażenie zawsze zwróci TRUE! I szukaj tu igły…
Jak to naprawić
Żeby uchronić się przed tego typu błędami, można posłużyć zapisem odwrotnym:
if (ITEM_COUNT == index) { ... }
Teraz, gdy przez przypadek zamiast operatora porównania użyję operatora przypisania (ITEM_COUNT = index) – kompilator natychmiast mnie o tym powiadomi (nie pozwoli przypisać wartości do stałej).
April 28th, 2011 on 18:30
Hej,
opisaną w notce technikę można też stosować dla !=, którego można pomylić z = i ! stojącymi obok siebie.
Też kiedyś o tym napisałem posta :)
http://robertgawron.blogspot.com/2011/01/in-c-or-c-its-easy-to-make-mistake-in.html
Robert
April 28th, 2011 on 20:08
Co mi z tego, kiedy z obu stron mam l-wartości?
April 28th, 2011 on 20:55
na upartego też można kompilować z opcją traktowania warningów jako błędów ;-)
ale jak człowiek zna C++ to nie ma szans, żeby cokolwiek z tym skompilować :D
April 28th, 2011 on 20:56
@sdf, wtedy to się nie przyda, ale nawyk takiego zapisu ochroni Cię w sytuacjach gdy po jednej ze stron masz np. liczbę, define’a, łańcuch znaków, a IMHO jest to na tyle częste, że ten trick i tak się opłaca.
April 28th, 2011 on 20:59
@nilphilus, można używać Klockworka albo PCLinta, one też to chyba wyłapią.
April 28th, 2011 on 22:20
Można też po prostu popatrzeć na warningi generowane przez kompilator. Dużo można zobaczyć, kiedy się patrzy.
May 4th, 2011 on 14:00
@smigut:
swiete slowa.