46
ROZDZUŁ 8. OPERATORY
• post - i nkrementacja (“i+4-”),
• pre-dekrementacja (“-i”) i
• post. dekr ementacja (“i-”).
Operatory inkrementacji zwiększa, a dekrementacji zmniejsza argument o jeden. Ponadto operatory pre- zwracają nową wartość argumentu, natomiast post- starą wartość argumentu.
int a, b, c; a = 3;
b = a—; /* po operacji b=3 a=2 */ c = —bj /* po operacji b=2 c=2 */
Czasami (szczególnie w C++) użycie operatorów stawianych za argumentem jest nieco mniej efektywne (bo kompilator musi stworzyć nową zmienną by przechować wartość tymczasową).
Bardzo ważne jest. abyśmy poprawnie stosowali operatory dekrementacji i inlcre-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 = 1; a = a++; a = ++a; a = a++ + ++a;
printf("7.d 7.d\n", ++a, ++a); printf("7«d 7«d\n", a++, a++);
Kompilator CCC 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) (“*").
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 tabel: