KOLEJNOŚĆ WYLICZANIA ARGUMENTÓW OPERATORA 53 jednak z tym przesadzać, gdyż kod programu może stać się mylący nie tylko dla innych, ale po latach (czy nawet i dniach) również dla nas. Warto także podkreślić, że operator koniunkcji ma niższy priorytet niż operator porównani a3. Oznacza to, że kod if (flags & FL_MASK == FL_FOO) zazwyczaj da rezultat inny od oczekiwanego. Najpierw bowiem wykona się porów- nanie wartości FL MASK z wartością FL FOO, a dopiero potem koniunkcja bitowa. W takich sytuacjach należy pamiętać o użyciu nawiasów: if ((flags & FL_MASK) == FL_FOO) Kompilator GCC potrafi wykrywać takie błędy i aby to robił należy podać mu argument -Wparentheses. Kolejność wyliczania argumentów operatora W przypadku większości operatorów (wyjątkami są tu &&, ||i przecinek) nie da się określić, która wartość argumentu zostanie obliczona najpierw. W większości przy- padków nie ma to większego znaczenia, lecz w przypadku wyrażeń, które mają efekty uboczne wymuszenie konkretnej kolejności może być potrzebne. Weźmy dla przykładu program #include int foo(int a) { printf("%d\n", a); return 0; } int main(void) { return foo(1) + foo(2); } Otóż, nie wiemy czy najpierw zostanie wywołana funkcja foo z parametrem je- den, czy dwa. Jeżeli ma to znaczenie należy użyć zmiennych pomocniczych zmieniając definicję funkcji main na: int main(void) { int tmp = foo(1); return tmp + foo(2); } Teraz już na pewno najpierw zostanie wypisana jedynka, a potem dopiero dwójka. Sytuacja jeszcze bardziej się komplikuje, gdy używamy wyrażeń z efektami ubocznymi jako argumentów funkcji, np.: 3Jest to zaszłość historyczna z czasów, gdy nie było logicznych operatorów && oraz ||i zamiast nich stosowano operatory bitowe & oraz |.
... zobacz całą notatkę
Komentarze użytkowników (0)