Ze zmiennych, stałych i literałów, posługując się operatorami języka i nawiasami, możemy konstruować wyrażenia. Wyrażenia są obliczane, a ich wyniki mogą być w różny sposób wykorzystane. Kolejność obliczeń zależy od priorytetów i wiązań (łączność) operatorów użytych w wyrażeniach. Priorytety mówią o tym, w jakiej kolejności będą wykonane różne operacje zawarte w tym samym wyrażeniu. Wiązania określają kolejność wykonania operacji o tym samym priorytecie, tzn. czy operacje te są wykonywane od lewej strony wyrażenia czy od prawej.
Priorytety
Są to operatory wykonujące znane wszystkim dodawanie,odejmowanie itp.:
Operator | Znaczenie |
+ | dodawanie |
- | odejmowanie |
* | mnożenie |
/ | dzielenie |
% | dzielenie modulo - daje w wyniku samą resztę z dzielenia |
= | operator przypisania - wykonuje działanie po prawej stronie i wynik przypisuje obiektowi po lewej |
Służą porównaniu zawartości dwóch zmiennych według określonych kryteriów:
Operator | Rodzaj porównania |
== | czy równe |
> | większy |
>= | większy bądź równy |
< | mniejszy |
<= | mniejszy bądź równy |
!= | czy różny(nierówny) |
Są jeszcze operatory, służące do grupowania porównań:
|| | lub(OR) |
&& | i,oraz(AND) |
! | negacja(NOT) |
operator | funkcja | przykład |
| | suma bitowa(OR) | 5 | 2 da w wyniku 7 ( 00000101 OR 00000010 = 00000111) |
& | iloczyn bitowy | 7 & 2 da w wyniku 2 ( 00000111 AND 00000010 = 00000010) |
~ | negacja bitowa | ~2 da w wyniku 253 ( NOT 00000010 = 11111101 ) |
>> | przesunięcie bitów o X w prawo | 7 >> 2 da w wyniku 1 ( 00000111 >> 2 = 00000001) |
<< | przesunięcie bitów o X w lewo | 7 << 2 da w wyniku 28 ( 00000111 << 2 = 00011100) |
^ | alternatywa wyłączna | 7 ^ 2 da w wyniku 5 ( 00000111 ^ 00000010 = 00000101) |
Służą do dodawania/odejmowania od liczby wartości jeden.
Przykłady:
Operacja | Opis operacji | Wartość wyrażenia |
x++ | zwiększy wartość w x o jeden | wartość zmiennej x przed zmianą |
++x | zwiększy wartość w x o jeden | wartość zmiennej x powiększona o jeden |
x-- | zmniejszy wartość w x o jeden | wartość zmiennej x przed zmianą |
--x | zmniejszy wartość w x o jeden | wartość zmiennej x pomniejszona o jeden |
Parę przykładów dla zrozumienia:
int a=7; if ((a++)==7) /* najpierw porównuje, potem dodaje */ printf ("%d\n",a); /* wypisze 8 */ if ((++a)==9) /* najpierw dodaje, potem porównuje */ printf ("%d\n", a); /* wypisze 9 */
Analogicznie ma się sytuacja z operatorami dekrementacji.
Operacja | Opis operacji | Wartość wyrażenia |
*x | operator wyłuskania dla wskaźnika | wartość trzymana w pamięci pod adresem przechowywanym we wskaźniku |
&x | operator pobrania adresu | zwraca adres zmiennej |
x[a] | operator wybrania elementu tablicy | zwraca element tablicy o indeksie a (numerowanym od zera) |
x.a | operator wyboru składnika a ze zmiennej x | wybiera składnik ze struktury lub unii |
x->a | operator wyboru składnika a przez wskaźnik do zmiennej x | wybiera składnik ze struktury gdy używamy wskaźnika do struktury zamiast zwykłej zmiennej |
sizeof(typ) | operator pobrania rozmiaru typu | zwraca rozmiar typu w bajtach |
Istnieje jeden operator przyjmujący trzy argumenty - jest to operator wyrażenia warunkowego: a ? b : c. Zwraca on b gdy a jest prawdą lub c w przeciwnym wypadku.