OPERATORY I WYRAŻENIA C++
Operatory w C++ pełnią funkcję podobną jak operatory w matematyce. Umożliwiają one po prostu przeprowadzanie różnych działań na zmiennych.
Najważniejszy operator - operator przypisania
Jednym z najważniejszych operatorów w języku C++ jest operator przypisania. Operator ten umożliwia przypisywanie wartości danej zmiennej.
= operator przypisania (to nie jest operator równości!)
Należy zwrócić uwagę na zapis - operator ten przypomina matematyczny operator równości, ale to nie jest operator równości, tylko operator przypisania. Aby dokonać przypisania, po lewej stronie operatora musimy mieć zmienną. Po prawej stronie możemy natomiast mieć zmienną, jakąś liczbę, znak lub napis (czyli tzw. literał) albo wyrażenie (na przykład sumę dwóch liczb, różnicę zmiennej i liczby itp.).
Oto przykładowy program demonstrujący użycie operatora przypisania:
#include <iostream>
#include <string>
using namespace std;
int main()
{
int liczba;
string napis;
char znak;
liczba=45; // operator przypisania dla liczby
napis=" Programowanie "; // operator przypisania dla napisu
znak='c'; //operator przypisania dla znaku
cout <<"Oto wartosci zmiennych: "<<liczba<<' '<<napis<<' '<<znak<<"\n\n";
cout <<"Podaj wartosc liczby: ";
cin >>liczba;
cin.ignore();
cout <<"Wpisz jakis napis (bez bialych znakow): ";
cin >>napis;
cin.ignore();
cout <<"Podaj znak: ";
cin >>znak;
cin.ignore();
cout <<"Oto wartosci zmiennych: "<<liczba<<' '<<napis<<' '<<znak<<"\n\n";
cout <<"Nacisnij ENTER aby zakonczyc\n";
getchar();
return 0;
}
Operator przypisania możemy zastosować do różnych typów danych. W przykładowym programie, zastosowano go zarówno dla liczby , dla znaku oraz napisu.
Operatory arytmetyczne
Kolejną grupę stanowią operatory arytmetyczne. Operatory te działają jak znane z matematyki operatory. Oto lista dostępnych operatorów arytmetycznych:
+ operator dodawania
- operator odejmowania
* operator mnożenia
/ operator dzielenia
% operator reszty z dzielenia (zwany operatorem modulo)
+ operator znaku liczby (np. +3). Liczba domyślnie jest zawsze dodatnia.
- operator znaku liczby (np. -45, -5.678)
Większość z wyżej wymienionych operatorów arytmetycznych działa tylko i wyłącznie dla typów liczbowych. Niektóre z operatorów działają również na typie znakowym czy napisowym, lecz tych operatorów używa się wyłącznie dla typów liczbowych. Warto zwrócić uwagę, na operator reszty z dzielenia %. Operator ten zwraca resztę z dzielenia, czyli np. 10%3 da nam wynik 1, 5%5 da nam wynik 0, 3%5 da nam wynik 3. Aby stosować ten operator, po jego obu stronach musimy mieć liczby całkowite dodatnie. Na przykład dla operacji 5%-5 wynik operacji jest nieokreślony. Zastosowanie operatorów arytmetycznych jest bardzo duże. Z punktu widzenia składni języka, poprawne są następujące wyrażenia:
2 + 3
2 * 3 - 5
2 + 6 + 8 + 10
2 / 3 * 2
Można wykonywać bez problemu operacje matematyczne nawet dla większej grupy liczb. To, w jakiej kolejności będą wykonywane działania, zależy od priorytetów operatorów. Akurat w przypadku operatorów arytmetycznych, priorytety operatorów są takie same, jak to wiemy z lekcji matematyki.
Oto przykładowy program pokazujący zastosowanie operatorów arytmetycznych.
#include <iostream>
using namespace std;
int main()
{
int liczba1;
int liczba2;
double liczba3;
double liczba4;
liczba1=14;
liczba2=6;
liczba3=56.78;
liczba4=22.11;
cout <<liczba1<<' '<<liczba2<<' '<<liczba3<<' '<<liczba4<<'\n';
cout <<"Suma dwoch liczb: "<<liczba1+liczba2<<'\n';
cout <<"Roznica dwoch liczb: "<<liczba2-liczba3<<'\n';
cout <<"Reszta z dzielenia: "<<liczba1%liczba2<<'\n';
liczba1=liczba1%liczba2; // zmiana wartosci zmiennej liczba1
cout <<liczba1<<' '<<liczba2<<' '<<liczba3<<' '<<liczba4<<'\n';
liczba3=liczba4-liczba1+liczba2; //zmiana wartosci zmiennej liczba3
cout <<liczba1<<' '<<liczba2<<' '<<liczba3<<' '<<liczba4<<'\n';
cout <<"Suma wszystkich liczb: "<<liczba1+liczba2+liczba3+liczba4<<'\n';
cout <<"Inne: "<<liczba1*liczba2+liczba3/liczba4-liczba2*liczba4<<'\n';
cout <<liczba1<<' '<<liczba2<<' '<<liczba3<<' '<<liczba4<<'\n';
cout <<"\nNacisnij ENTER aby zakonczyc\n";
getchar();
return 0;
}
W powyższym programie zastosowano różne operatory. Można zaobserwować, że rzeczywiście można uzyskać bardzo różne wyniki. Jednak najciekawszą sprawą jest możliwość zmiany wartości zmiennej. W linijkach opatrzonych komentarzami, dzięki zastosowaniu operatorów arytmetycznych oraz co ważniejsze operatora przypisania, zmieniamy wartość zmiennej.
Zmiana wartości zmiennej w oparciu o nią samą
Dość często w programach zdarza się, że chcemy np. dodać do obecnej zmiennej typu liczbowego pewną wartość lub wyrażenie. Np. dla zmiennej o nazwie liczba, zwiększenie jej wartości o 2 uzyskujemy pisząc:
liczba=liczba+2; Co prawda sam zapis może jest na początku trochę dziwny, jednak można go dosłownie przetłumaczyć sobie tak: nowej wartości zmiennej liczba przypisz sumę obecnej wartości tej zmiennej i liczby 2.
Tego typu operacje wykonywane są bardzo często. Oprócz chęci dodania do zmiennej danej wartości lub wyrażenia, możemy chcieć zastosować również odejmowanie, mnożenie, dzielenie czy przypisanie reszty z dzielenia.
W związku z tym, że tego typu operacje wykonywane są w języku C++ naprawdę bardzo często, została stworzona specjalna grupa operatorów, która umożliwia szybsze zapisanie wykonywanej operacji w oparciu o już istniejącą wartość zmiennej. Grupą tą są złożone operatory przypisania.
Oto najważniejsze złożone operatory przypisania:
+= zmienna += 2 to to samo co zmienna = zmienna + 2
-= zmienna -= 2 to to samo co zmienna = zmienna - 2
*= zmienna *= 2 to to samo co zmienna = zmienna * 2
/= zmienna /= 2 to to samo co zmienna = zmienna / 2
%= zmienna %= 2 to to samo co zmienna = zmienna % 2
Dzięki stosowaniu powyższych operatorów, można w znacznie prostszy sposób zapisywać pewne operacje, co w rezultacie doprowadzi do zaoszczędzenia cennego czasu.
Operatory logiczne
- operatory relacji
Są to operatory: > >= < <=
W wyniku działania tych operatorów otrzymujemy odpowiedź: prawda (true - 1) lub fałsz (false - 0). Priorytet tych operatorów jest taki sam .
- operatory przyrównania
Są to operatory == !=.
Ich priorytet jest niższy niż priorytet operatorów relacji
- operatory sumy i iloczynu logicznego
Są to operatory:
|| - realizujący sumę logiczną (LUB - alternatywa)
&& - realizujący iloczyn logiczny (I - koniunkcja)
- operator negacji !
Jest to operator jednoargumentowy i stoi zawsze po lewej stronie operandu:
!n
Operatory bitowe
Operatory te są charakterystyczne dla sposobu przechowywania informacji w komputerze (w postaci binarnej). Wiadomo, że w komputerze informacja gromadzona jest w postaci zero-jedynkowej. Te elementarne jednostki informacji (0 lub 1) nazywane są bitami. Komputer jednak nie odnosi się najczęściej do poszczególnych bitów, lecz gromadzi je w słowa, najczęściej 2 bajtowe. Informacje zapisane w słowie nie koniecznie muszą oznaczać konkretnych liczb. W jednym słowie można przechowywać szereg informacji na poszczególnych bitach słowa. Do pracy na poszczególnych bitach słowa służą właśnie operatory bitowe:
<< - przesunięcie w lewo
>> - przesunięcie w prawo
& - bitowy iloczyn logiczny
| - bitowa suma logiczna
^ - bitowa różnica symatryczna (bitowe exclusive OR)
~ - bitowa negacja
Priorytet |
Operator |
Funkcja |
Zastosowanie |
17 |
:: |
wyłuskanie składnika klasy |
nazwa_klasy::składnik |
16 |
-> |
dostęp do składnika |
wskaźnik->składnik |
15 |
sizeof |
rozmiar obiektu rozmiar typu postinkrementacja preinkrementacja postdekrementacja predekrementacja bitowa nagacja negacja minus jednoargumentowy plus jednoargumentowy adres obiektu dostęp do obiektu wskazywanego tworzenie obiektów likwidacja obiektów likwidacja tablic rzutowanie typu |
sizeof(obiekt) |
14 |
|
Wybór składnika wskaźnikiem i: |
|
13 |
* |
mnożenie |
wyrażenie * wyrażenie |
12 |
+ |
dodawanie |
wyrażenie + wyrażenie |
11 |
<< |
przesunięcie bitów w lewo |
wyrażenie << wyrażenie |
10 |
< |
mniejsze od... |
wyrażenie < wyrażenie |
9 |
== |
równe |
wyrażenie == wyrażenie |
8 |
& |
iloczyn bitowy |
wyrażenie & wyrażenie |
7 |
^ |
bitowa różnica symetryczna |
wyrażenie ^ wyrażenie |
6 |
| |
suma bitowa |
wyrażenie | wyrażenie |
5 |
&& |
koniunkcja (iloczyn logiczny) |
wyrażenie && wyrażenie |
4 |
|| |
alternatywa (suma logiczna) |
wyrażenie || wyrażenie |
3 |
?: |
wyrażenie warunkowe |
warunek ? wyrażenie : wyrażenie |
2 |
= |
zwykłe przypisanie mnożenie z przypisaniem dzielenie z przypisaniem dzielenie modulo z przypisaniem dodawanie z przypisaniem odejmowanie z przypisaniem przesunięcie w lewo z przypisaniem przesunięcie w prawo z przypisaniem iloczyn bitowy z przypisaniem suma bitowa z przypisaniem różnica symetryczna z przypisaniem |
lwartość = wyrażenie |
1 |
, |
wyrażenie przecinkowe |
wyrażenie, wyrażenie |
Wyrażenia i wartości
W C++ istnieją różne rodzaje wyrażeń. Wyrażenie proste jest to takie wyrażenie, które nie wykonuje żadnej operacji i symbolizuje tylko własną wartość. Wyrażenie złożone zaś jest to wyrażenie, w którym wartość jest uzyskiwana przez wykonanie jakiejś operacji z użyciem operatorów. Jeśli mamy np. a = abs( t ); to `a', `abs' i `t' są wyrażeniami prostymi, natomiast `abs( t )' i pozostałe, które można wyróżnić to już wyrażenia złożone. Wyrażenie proste można nazywać WARTOŚCIĄ, natomiast wyrażenie złożone po prostu WYRAŻENIEM.
Wyrażenie składa się z wartości powiązanych odpowiednimi operatorami. W podanym wyrażeniu:
a = abs( t );
`abs' jest również wartością. Dla tej wartości został użyty operator (), który oznacza wywołanie funkcji o podanej przed nim nazwie, podając odpowiednie argumenty, zawarte wewnątrz nawiasów. Tutaj zarówno `abs' jak i `t' są argumentami funkcji `operator()'.
Oczywiście powyższe wyrażenie może być podwyrażeniem innego wyrażenia; zwraca ono bowiem odniesienie do `a', do którego nastąpiło przypisanie. Całość wyrażenia jednak jest operacją (wyrażenie to jest afektywne) i kwalifikuje się do bycia instrukcją.
Ponieważ wyrażenie zawiera jakieś dane źródłowe i wskazuje operacje do wykonania na nich, wykonanie tych operacji wraz z otrzymaniem wyniku (czyli "obliczanie" wyrażenia), zwane jest często "wartościowaniem" wyrażenia (ang. evaluation). Określenie "obliczanie" też się często używa, aczkolwiek niezbyt ono pasuje; sugeruje bowiem, że wszelkie wyniki przeprowadzonych operacji są zwracane jako wartość wyrażenia, tzn. operacja obliczania wyrażenia jest nieafektywna (nie zostawia śladów); lecz tak jest nie zawsze. Przykładem takiego afektywnego wyrażenia jest `c++', gdzie wynik przeprowadzonej operacji znajduje się w zmiennej `c', a wynikiem wyrażenia jest poprzednia wartość zmiennej (a więc, bez wykonania tej operacji i tak otrzymalibyśmy tą samą wartość wyrażenia).