46
post-inkrcmentacja (“i++”), pre-dekrementacja (“-i”) i post-dekrementacja (“i-”).
Operatory inkrementacji zwiększa, a dckrenientacji zmniejsza argmnent o jeden. Ponadto operatory pro- zwracają nową wartość argument u. natomiast post- starą wartość argumentu.
int a, b, c; a - 3;
b • a—; /* po operacji b-3 a=2 */ c * —b; /* po operacji b-2 c»2 ♦/
Czasami (szczególnie w C-f+) użycie operatorów stawianych za argumentem jest nieco mniej efektywne (lx> kompilator musi stworzyć nową zmienną by przechować wartość tymczasową).
Bardzo ważne jest, abyśmy poprawnie stosowali operatory dekrementacji i inkre-mentacji. Chodzi o to, aby w jednej instrukcji nie umieszczać kilku operatorów, które modyfikują ten sam obiekt (zmienną). Jeżeli taka sytuacja zaistnieje, to efekt działania instrukcji jest nieokreślony. Prostym przykładem mogą być następujące instrukcje:
int a-l; a - a++; a - ++a; a - a++ + ++a;
printf ("‘/A ł£d\n", ++a, ++a) ; printf("7/i %d\n", a++, a++);
Kompilator GCC potrafi ostrzegać przed takimi błędami - aby to czynił należy podać mu jako argument opcję -Wsequence-point.
Oprócz operacji znanych z lekcji matematyki w podstawówce, język C został wyposażony także w operatory bitowe, zdefiniowane dla liczb całkowitych. Są to:
• negacja bitowa (“ ”),
• koniunkcja bitowa (“&”),
• alternatywa bitowa (“—*') i
• alternatywa rozłączna (XOR) (i''”).
Działają one na poszczególnych bitach przez co mogą być szybsze od innych operacji. Działanie tych operatorów można zdefiniować za pomocą poniższych tał)cl: