Dzisiaj przeżyłem swego rodzaju oświecenie:
od jakiegoś czasu przebijam się przez kod w postaci
I w końcu się dowiedziałem. Mętne wytłumaczenie było, że od razu widać, do czego się porównuje - nad wyraz mętne.
Otóż - jak się przypadkowo napisze if (zmienna = STAŁA) to kompilator to skompiluje, a jak się napisze if (STAŁA = zmienna) to walnie błędem.
Ręce mi opadły - to mogło być prawdą w czasach kamienia łupanego, ale teraz jest znane coś takiego jak warning - kompiler pyta się, czy rzeczywiście przypisanie miało być w ifie, jak jakiś debilasty programista wyłącza warningi, to jest sam sobie kurna winien.
BOOL funkcja(void) {
if (FALSE == innaFunkcja(odZmiennejGlobalnej)) {
printf("Error w funkcji");
goto Error_Handling;
}
return TRUE;
Error_Handling:
return FALSE;
}
i zwoje mi trzeszczały, od goto, od tego porównania stała == zmienna, za cholerę nie wiedziałem skąd komuś się cośtakiego bierze, ani to wygodne, ani wygląda (pomijając już porównanie do stałej TRUE/FALSE w C++).I w końcu się dowiedziałem. Mętne wytłumaczenie było, że od razu widać, do czego się porównuje - nad wyraz mętne.
Otóż - jak się przypadkowo napisze if (zmienna = STAŁA) to kompilator to skompiluje, a jak się napisze if (STAŁA = zmienna) to walnie błędem.
Ręce mi opadły - to mogło być prawdą w czasach kamienia łupanego, ale teraz jest znane coś takiego jak warning - kompiler pyta się, czy rzeczywiście przypisanie miało być w ifie, jak jakiś debilasty programista wyłącza warningi, to jest sam sobie kurna winien.
Etykiety: soft
6 Comments:
A to wcale nie jest takie glupie... To ze kiedys nie bylo warningow nie znaczy ze nie powinnismy pisac kodu samowypalpujacego bledy. W koncu nie uzalezniajmy sie tak od IDE ;-)
Oczywiscie warto zauwazyc porownywanie w ten sposob wartosci logicznych sam w sobie jest dosc dziwny, a tak w ogole to ten kawalek kodu jest niezlym szitem...
Ja tam używam podobnej konstrukcji w Javie przy porównywaniu stringów. Zamiast:
if (zmienna.equals("STALA")) { ...
to piszę :
if ("STALA".equals(zmienna)) {...
Dzięki temu nie muszę sprawdzać czy 'zmienna' nie jest przypadkiem NULL. Poza tym to coś takiego mi się bardziej podoba bo na pierwszy rzut oka widać do czego się przyrównuje.
A mnie zastanawia to, dlaczego w tym kodzie nie jest uzyty typ bool. Z C++ orlem nie jestem, ale chyba jest tam cos takiego.
no - ja podobnie myślę jak anonim 1. to wygląda jakby ktoś znający javę uczył się C++, tylko za cholerę nie wiem po co te goto... i kilka returnów... no, ale to może jest związane z polityką firmy :).
Z tymi warningami to nie do końca prawda. Jak system jest mały i nasz poprzednik obchodził się z nim dobrze, to nie ma problemów. Gorzej jak na dzień dobry dostajesz system który generuje pierdyliard warningow. Konia z rzedem temu kto wylapie tam ten jeden dodatkowy. Moje doświadcznie wskazuje, że defensywne programowanie sie sprawdza.
Do warningów mam grepa albo Incredibuilda który ładnie pokazuje pliki siejące warningami.
I piszę tak, żeby warningów nie było.
Co do porównywania - w Javie to jeszcze zrozumiem, null pointer exception, może jeszcze jakieś optymalizacje w kompilerze i runtime.
Ale w C++ bardziej mnie interesuje co wołam, a nie do czego przyrównuję, a w kodzie dokopałem się także do kawałków, które są pisane w drugą stronę: zmienna == STAŁA.
Prześlij komentarz
<< Home