Operatory

Stronę tą wyświetlono już: 278 razy

W programowaniu stosuje się szereg różnych operatorów, które można podzielić na pewne podgrupy. Poniżej postaram się opisać operatory stosowane w języku C++.

Operatory matematyczne

Operator podstawienia wartości

W C++ dla odróżnienia wprowadzono, że operator = oznacza jedynie podstawienie pewnej wartości do danej zmiennej np. w następujący sposób:

Listing 1
  1. int x = 1;
  2. int y = x;

Operatory porównania wartości

Tego typu operatory są stosowane w instrukcjach warunkowych takich jak if, else if, pętlach: for; do while oraz while, o których mowa będzie nieco później. Wszystkie operatory porównania wartości zwracają wartość typu bool mogącą przyjmować dwa stany: 1 (true) lub 0 (false).

Równość: == - zwraca true, gdy dwa argumenty są sobie równe, false w przeciwnym przypadku. Przykładowy kod:

Listing 2
  1. bool warunek = 10 == 1; // efektem tego będzie zwrócenie wartości typu bool, w tym przypadku równej 0 (lub false)

Różne: != - zwraca true gdy dwa argumenty są różne od siebie, false w przeciwnym przypadku. Przykładowy kod:

Listing 3
  1. bool warunek = 10 != 1; // efektem tego będzie zwrócenie wartości typu bool, w tym przypadku równej 1 (lub true)

Mniejsze niż: < - zwraca true gdy argument stojący po lewej stronie jest mniejszy od argumentu stojącego po prawej stronie. Przykładowy kod:

Listing 4
  1. bool warunek = 10 < 1; // efektem tego będzie zwrócenie wartości typu bool, w tym przypadku równej 0 (lub false)

Większe niż: >

Mniejsze lub równe: <=

Większe lub równe: >=

Operator trójargumentowy porównania wartości warunek?gdy_prawda:gdy_fałsz, który zwraca wyrażenie gdy_prawda jeżeli warunek jest spełniony, w przeciwnym przypadku zwraca wyrażenie gdy_falsz. Przykład:

Listing 5
  1. int k = 2 < 3 ? 2 : 3; // ponieważ 2 jest mniejsze od 3 zwrócona zostanie wartość 2

Operator dodawania

Listing 6
  1. int y = 10, z = 20;
  2. int x = y + z;

Operator odejmowania

Listing 7
  1. int y = 10, z = 20;
  2. int x = y - z;

Operatory znaku wartości

Listing 8
  1. int x = 10, y =20;
  2. int z = -(x * y);
  3. int z2 = +x;

Operator inkrementacji

Operatorem inkrementacji jest ++. Używa się go w celu zwiększenia wartości zmiennej o 1. Przykład:

Listing 9
  1. int x = 10;
  2. x ++; // zwiększanie wartości zawartej w zmiennej x o 1

Operator dekrementacji

Operatorem dekrementacji jest --. Używa się go w celu zmniejszenia wartości zmiennej o 1. Przykład:

Listing 10
  1. int x = 10;
  2. x --; // zmniejszenie wartości zawartej w zmiennej x o 1

Operator mnożenia

Listing 11
  1. int y = 10, z = 20;
  2. int x = y * z;

Operator dzielenia

Listing 12
  1. int y = 10, z = 20;
  2. int x = y / z;

Operator modulo (reszty z dzielenia)

Listing 13
  1. int y = 105, z = 20;
  2. int r = y % z; // wynikiem będzie 5

Operator dodawania z podstawieniem

Listing 14
  1. int x = 10;
  2. x += 10; // jest to zapis równoważny x = x + 10;

Operator odejmowania z podstawieniem

Listing 15
  1. int x = 10;
  2. x -= 10; // jest to zapis równoważny x = x - 10;

Operator mnożenia z podstawieniem

Listing 16
  1. int x = 10;
  2. x *= 10; // jest to zapis równoważny x = x * 10;

Operator dzielenia z podstawieniem

Listing 17
  1. int x = 10;
  2. x /= 10; // jest to zapis równoważny x = x / 10;

Operator reszty z dzielenia z podstawieniem

Listing 18
  1. int x = 10;
  2. x %= 12; // jest to zapis równoważny x = x % 12;

Operacje na bitach

Tego typu operatory wykonują operacje na poszczególnych bitach, które mogą być operacjami: logicznymi lub przesunięcia wartości bitów.

Operator przesunięcia bitowego w prawo

Jeżeli mam liczbę 8-bitową, która w zapisie dwójkowym ma wartość 10000000 (odpowiadającą 128 w systemie dziesiętnym) to następująca operacja:

Listing 19
  1. unsigned char x = 128;
  2. unsigned char y = x >> 3;

podstawi za y wartość równą w zapisie dwójkowym 00010000 (odpowiadającą 16 w systemie dziesiętnym).

Operator przesunięcia bitowego w lewo

Listing 20
  1. unsigned char x = 16;
  2. unsigned char y = x << 3; // zwróci wartość 128 (dwójkowo 10000000)

Operator bitowej koniunkcji AND

Operatorem bitowej koniunkcji jest &. Gdy dana jest liczba w zapisie dwójkowym 10101010 (w dziesiętnym to będzie 170) i druga liczba 00001111 (w dziesiętnym 15) to operacja:

Listing 21
  1. unsigned char x = 170;
  2. unsigned char y = 15;
  3. unsigned char z = x & z;

zwróci wartość w zapisie dwójkowym równą 00001010, ponieważ dla każdego bitu z tej samej pozycji w zmiennej x i y operacja koniunkcji zwraca 1 gdy oba bity są równe 1 natomiast 0 w przeciwnym przypadku.

Operator bitowej alternatywy OR

Operatorem bitowej alternatywy jest |. Gdy dana jest liczba w zapisie dwójkowym 10101010 (w dziesiętnym to będzie 170) i druga liczba 00001111 (w dziesiętnym 15) to operacja:

Listing 22
  1. unsigned char x = 170;
  2. unsigned char y = 15;
  3. unsigned char z = x | z;

zwróci wartość w zapisie dwójkowym równą 00001111, ponieważ dla każdego bitu z tej samej pozycji w zmiennej x i y operacja alternatywy zwraca 1 gdy co najmniej jeden bit jest równy 1 natomiast 0 w przeciwnym przypadku.

Operator bitowej alternatywy wykluczającej (xor)

Operatorem bitowej alternatywy wykluczającej (xor) jest ^. Gdy dana jest liczba w zapisie dwójkowym 10101010 (w dziesiętnym to będzie 170) i druga liczba 00001111 (w dziesiętnym 15) to operacja:

Listing 23
  1. unsigned char x = 170;
  2. unsigned char y = 15;
  3. unsigned char z = x ^ z;

zwróci wartość w zapisie dwójkowym równą 10100101, ponieważ dla każdego bitu z tej samej pozycji w zmiennej x i y operacja alternatywy wykluczającej zwraca 1 gdy bity mają różne wartości a 0 w przeciwnym przypadku.

Operator przesunięcia bitowego w prawo z podstawieniem

Listing 24
  1. unsigned char y = 128;
  2. y >>= 3; // odpowiednik y = y >> 3;

Operator przesunięcia bitowego w lewo z podstawieniem

Listing 25
  1. unsigned char y = 16;
  2. y <<= 3; // odpowiednik y = y << 3;

Operator bitowej alternatywy AND z jednoczesnym podstawieniem

Listing 26
  1. unsigned char x = 170;
  2. unsigned char y = 15;
  3. y &= z; // odpowiada zapisowi y = y & z;

Operator bitowej koniunkcji OR z jednoczesnym podstawieniem

Listing 27
  1. unsigned char x = 170;
  2. unsigned char y = 15;
  3. y |= z; // odpowiada zapisowi y = y | z;

Operator bitowej alternatywy wykluczającej XOR z jednoczesnym podstawieniem

Listing 28
  1. unsigned char x = 170;
  2. unsigned char y = 15;
  3. y ^= z; // odpowiada zapisowi y = y ^ z;

Operator negacji bitowej NOT

Operatorem negacji bitowej (NOT) jest ~, jeżeli dana jest liczba, która w zapisie dwójkowym ma wartość 01010101 to negacją tej wartości będzie liczba w systemie dwójkowym 10101010. Przykładowy kod z użyciem tego operatora:

Listing 29
  1. unsigned char x = 85;
  2. unsigned char y = ~x;

Operatory logiczne

Operator logicznej koniunkcji AND

Operatorem logicznej koniunkcji (AND) jest &&, zwraca wartość typu bool równą 1 (true), gdy warunki z lewej i prawej strony operatora są spełnione a 0 (false) w przeciwnym przypadku. Przykład:

Listing 30
  1. bool w = 2 < 3 && 4 > 5; // zwróci fałsz, bo prawy warunek nie jest spełniony

Operator logicznej alternatywy OR

Operatorem logicznej alternatywy (OR) jest ||, zwraca wartość typu bool równą 1 (true), gdy co najmniej jeden z warunków jest spełniony, a 0 (false) w przeciwnym przypadku. Przykład:

Listing 31
  1. bool w = 2 < 3 || 4 > 5; // zwróci prawdę, bo lewy warunek jest spełniony

Operatory związane z pamięcią

Operator wyłuskania wartości

Operatorem wyłuskania wartości jest *, umożliwia on wyciągnięcie z zmiennej typu wskaźnikowego wartości, na którą ta zmienna wskazuje. Przykład:

Listing 32
  1. int *wsk = new int; // deklaracja zmiennej wskaźnikowej typu int
  2. *wsk = 1; // przypisanie do wartości zawartej pod adresem zmiennej wsk
  3. int k = *wsk; // podstawienie wartości na którą zmienna wsk wskazuje do zmiennej k

Operator wyłuskania adresu

Operatorem wyłuskania adresu jest &, umożliwia on wyciągnięcie z zmiennej adresu, pod którym jego wartość została zapisana. Przykład:

Listing 33
  1. int k = 0;
  2. int *wsk = &k; // przypisanie zmiennej wskaźnikowej wsk wartości adresu pod którym została zapisana zmienna wartość zmiennej k

Operator dynamicznego przydzielania pamięci

Operatorem dynamicznego przydzielania pamięci jest new, umożliwia on dynamiczne przydzielenie pamięci do zmiennej wskaźnikowej. Przykład:

Listing 34
  1. int *wsk = new int; // przydzielania pamięci pojedynczego elementu typu int
  2. int *wsk2 = new int [20]; // przydzielanie pamięci 20 elementów typu int

Operator dynamicznego przydzielania pamięci

Operatorem dynamicznego zwalniania pamięci jest delete, umożliwia on dynamiczne przydzielenie pamięci do zmiennej wskaźnikowej. Przykład:

Listing 35
  1. int *wsk = new int; // przydzielania pamięci pojedynczego elementu typu int
  2. int *wsk2 = new int [20]; // przydzielanie pamięci 20 elementów typu int
  3. if(wsk){ // jeżeli wsk nie jest równe zero to
  4. delete wsk; // tak zwalnia się pamięć dla pojedynczego elementu
  5. wsk = 0; // trzeba potem przypisać zero, żeby było wiadomo, że pamięć została zwolniona a wskaźnik już nie wskazuje na nic
  6. }
  7. if(wsk2){
  8. delete[] wsk2; // tak się zwalnia pamięć dla wielu elementów
  9. wsk2 = 0;
  10. }

Operator indeksowania elementów tablicy

Operatorem indeksowania elementów tablicy (jak i ich deklaracji) jest []. Przykład:

Listing 36
  1. int tablica[] = {12,23,43,54,54}; // deklaracja statyczna tablicy
  2. int k = tablica[0]; // odwołanie się do pierwszego elementu tablicy

Operatory dostępu do elementów wewnętrznych struktur i klas

Operator rozróżnienia zakresu

Operatorem rozróżnienia zakresu jest ::. Typowym przykładem jego użycia jest dostęp do strumieni std::cout, i std::cin, o których nieco później będzie mowa.

Operator dostępu pośredniego

Listing 37
  1. nazwa_klasy *obiekt = new nazwa_klasy;
  2. obiekt->metoda_klasy();

Operator dostępu bezpośredniego

Listing 38
  1. nazwa_klasy obiekt;
  2. obiekt.metoda_klasy();

Operator rzutowania typów

Operator rzutowania typu to ( typ_zmiennej_rzutujacej ). Służy do zamiany (zrzutowania) zmiennej jednego typu na zmienną typu innego. Przykład:

Listing 39
  1. int x = 20;
  2. double k = (double)x / 100; // gdybym nie zrzutował, to by zły wynik wyszedł
  3. double k2 = double(x) / 100; // drugi sposób rzutowania

Operator ustalania rozmiarów danych

Operatorem ustalania rozmiaru danych jest sizeof(). Operator ten zwraca rozmiar danego typu zmiennej wyrażony w bajtach. Przykład:

Listing 40
  1. int sizeInt = sizeof(int); // ustala rozmiar typu int
  2. int sizeOfsizeInt = sizeof(sizeInt); // ustala rozmiar zmiennej sizeInt

Komentarze