49
OPERATORY LOGICZNE
• większe lub równe (“>=”).
Wykonują one odpowiednie porównanie swoich argumentów i zwracają jedynkę jeżeli warunek jest spełniony lub zero jeżeli nie jest.
Osoby, które poprzednio uczyły się innych języków programowania, często mają nawyk używania w instrukcjach logicznych zamiast operatora porównania ==, operatora przypisania =. Ma to często zgubne efekty, gdyż przypisanie zwraca wartość przypisaną lewemu argumentowi.
Porównajmy ze sobą dwa warunki:
(a - 1)
(a ■■ 1)
Pierwszy z nich zawsze będzie prawdziwy, niezależnie od wartości zmiennej a! Dzieje się tak. ponieważ zostaje wykonane przypisanie do a wartości 1 a następnie jako wartość jest zwracane to, co zostało przypisane — czyli jeden. Drugi natomiast ł>ę<lzie prawdziwy tylko, gdy a jest równe 1.
W celu uniknięcia takich błędów niektórzy programiści zamiast pisać a -■ 1 piszą 1 ■■ a. dzięki czemu pomyłka spowoduje, że kompilator zgłosi błąd.
Warto zauważyć, że kompilator GCC potrafi w pewnych sytuacjach wychwycić taki błąd. Aby zaczął to robić należy podać mu argument -Wparentheses.
Innym błędem jest użycie zwykłych operatorów porównania do sprawdzania relacji pomiędzy liczbami rzeczywistymi. Ponieważ operacje zmiennoprzecinkowe wykonywane są z pewnym przybliżeniem rzadko kiedy dwie zmienne typu float czy double są sobie równe. Dla przykładu:
#include <stdio.h> int main () { float a, b, c;
a ■ lelO; /* tj. 10 do potęgi 10 •/
b » le-10; /* tj. 10 do potęgi -10 */ c ■ b; /* c « b */
c ■ c + a; /* c ■ b + a (teoretycznie) */
c-c-a; /*c*b+a-a=b (teoretycznie) */ printf("%d\n", c ** b); /* wypisze 0 */
>
Ol)cjścieni jest porównywanie modułu różnicy liczb. Również i takie błędy kompilator GCC i>otrafi wykrywać aby to robił należy |xxlać mu argument -Wf loat-equal.
Analogicznie do części operatorów bitowych, w C definiuje się operatory logiczne, mianowicie:
negacja (!),