2007-11-08

Dzisiaj przeżyłem swego rodzaju oświecenie: od jakiegoś czasu przebijam się przez kod w postaci
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:

6 Comments:

Anonymous Anonimowy said...

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...

4:21 PM  
Anonymous Anonimowy said...

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.

6:09 PM  
Anonymous Anonimowy said...

A mnie zastanawia to, dlaczego w tym kodzie nie jest uzyty typ bool. Z C++ orlem nie jestem, ale chyba jest tam cos takiego.

4:54 PM  
Blogger Herb Asher said...

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 :).

12:53 PM  
Anonymous Anonimowy said...

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.

11:42 AM  
Blogger kiloindia said...

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.

7:11 PM  

Publikowanie komentarza

<< Home