Język C++ Operatory Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego Matuszyka
Jednoargumentowe operatory arytmetyczne 18 17 ++ -- POST 16 ++ -- PRE + - 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 Operatory znaku: + - a=+3; b=-5; Operatory inkrementacji i dekrementacji:++ -- wersja przedrostowa ++a; --b; wersja przyrostkowa a++; b--;
Jednoargumentowe operatory arytmetyczne #include<iostream> using namespace std; int main() { int a=5,b=5,c=5,d=5; cout<<++a<<"\t"<<a<<endl; cout<<b++<<"\t"<<b<<endl; cout<<--c<<"\t"<<c<<endl; cout<<d--<<"\t"<<d<<endl; } 6 6 5 6 4 4 5 4
Dwuargumentowe operatory arytmetyczne 18 17 ++ -- POST 16 ++ -- PRE + - 15 14 * / % 13 + - 12 11 10 9 8 7 6 5 4 3 2 1 Dodawanie + Odejmowanie - Mnożenie * Dzielenie / Reszta z dzielenia % Reszta z dzielenia działa tylko na typach całkowitych!
Operatory przypisania 18 17 ++ -- POST 16 ++ -- PRE + - 15 14 * / % 13 + - 12 11 10 9 8 7 6 5 4 3 = *= /= %= += -= <<= >>= &= |= ^= 2 1 Jest ich 11 = *= /= %= += -= <<= >>= &= |= ^= a+=2; oznacza a=a+2; Nie każdy obiekt może stać po lewej stronie operatora przypisania. Te, które mogą nazywa się l-wartościami. l-wartość = r-wartość; 2=a; - błąd 2 nie jest l-wartością!
= *= /= %= += -= <<= >>= &= |= ^= Operatory logiczne 18 17 ++ -- POST 16 ++ -- PRE + - ! 15 14 * / % 13 + - 12 11 < <= > >= 10 == != 9 8 7 6 && 5 || 4 3 = *= /= %= += -= <<= >>= &= |= ^= 2 1 Zwracają wartości typu bool. Operator: równy == różny != mniejszy < większy > mniejszy lub równy <= większy lub równy >= sumy logicznej || iloczynu logicznego && negacji !
Iloczyn logiczny: && Suma logiczna: || Negacja logiczna: ! Operatory logiczne Iloczyn logiczny: && Suma logiczna: || Negacja logiczna: ! p q p && q false true p q p || q false true p !p false true
Operatory logiczne int a=5; if (a>=4 && a<10 || a==0) { … } bool koniec = false; while (!koniec)
= *= /= %= += -= <<= >>= &= |= ^= Operatory bitowe 18 17 ++ -- POST 16 ++ -- PRE + - ! ~ 15 14 * / % 13 + - 12 << >> 11 < <= > >= 10 == != 9 & 8 ^ 7 | 6 && 5 || 4 3 = *= /= %= += -= <<= >>= &= |= ^= 2 1 iloczyn bitowy & suma bitowa | bitowa różnica symetryczna ^ negacja bitowa ~ przesunięcie bitowe w lewo << przesunięcie bitowe w prawo >> Działają tylko na typach całkowitych!
Operatory bitowe (& | ^ ~) Iloczyn bitowy Suma bitowa Bitowa różnica symetryczna Negacja bitowa … 1 & … 1 | … 1 ^ ~ … 1 32 bity (dla int)
Operatory bitowe 00000000 00000000 00000000 00001010 int main() { int a = 10, b = 6; cout << (a&b) << endl; cout << (a|b) << endl; cout << (a^b) << endl; cout << ~a << endl; system("pause"); return 0; } 00000000 00000000 00000000 00000110 00000000 00000000 00000000 00000010 00000000 00000000 00000000 00001110 00000000 00000000 00000000 00001100 11111111 11111111 11111111 11110101 2 14 12 -11
Operatory bitowe (<< >>) Operator przesunięcia bitowego w lewo zmienna << ile_miejsc bitowego w prawo zmienna >> ile_miejsc 1 … 1 … ? 1 … ? 1 … 32 bity (dla int)
hex – liczba wypisywana jest w systemie szesnastkowym Operatory bitowe #include<iostream> using namespace std; int main() { short int a=0x00ff,b=0xff00,c,d,e,f,g,h; c=~a; d=a>>2; e=a<<2; f=a&b; g=a^b; h=a|b; cout<<hex<<a<<endl; cout<<hex<<b<<endl; cout<<hex<<c<<endl; cout<<hex<<d<<endl; cout<<hex<<e<<endl; cout<<hex<<f<<endl; cout<<hex<<g<<endl; cout<<hex<<h<<endl; } ff ff00 ff00 3f 3fc ffff ffff hex – liczba wypisywana jest w systemie szesnastkowym
Operatory przesunięcia bitowego Operatory << oraz >> zostały przeładowane w ten sposób, że odpowiadają za wstawianie i wyjmowanie ze strumienia. int a; cin>>a; cout<<a; bool a = true, b = false; cout << a && b; cout << (a && b); cout << a && b; jest równoznaczne ((cout << a) && b); cout << (a && b); jest równoznaczne (cout << (a && b)); 1
Operatory logiczne a operatory bitowe int main() { int a=5; if (a>3 && a<7) cout<<"TRUE"<<endl; else cout<<"FALSE"<<endl; } int main() { int a=5; if (a>3 & a<7) cout<<"TRUE"<<endl; else cout<<"FALSE"<<endl; } TO SAMO TRUE TRUE
Operatory logiczne a operatory bitowe int main() { int a=1,b=2; if (a && b) cout<<"TRUE"<<endl; else cout<<"FALSE"<<endl; } int main() { int a=1,b=2; if (a & b) cout<<"TRUE"<<endl; else cout<<"FALSE"<<endl; } b=3 TRUE TRUE FALSE
= *= /= %= += -= <<= >>= &= |= ^= Wyrażenie warunkowe ? : 18 17 ++ -- POST 16 ++ -- PRE + - ! ~ 15 14 * / % 13 + - 12 << >> 11 < <= > >= 10 == != 9 & 8 ^ 7 | 6 && 5 || 4 ? : 3 = *= /= %= += -= <<= >>= &= |= ^= 2 1 Jest to wyrażenie, którego wartość jest zależna od wartości wyrażenia stojącego przed znakiem ? c = w ? a : b; Jeżeli w jest prawdziwe to c = a jeżeli nie to c = b
Równoznaczne instrukcji if Wyrażenie warunkowe #include<iostream> using namespace std; int main() { int a=1, b=2,c,d; if (a>b) c=a; else c=b; d = a > b ? a : b; cout << c << endl << d << endl; } Równoznaczne instrukcji if
= *= /= %= += -= <<= >>= &= |= ^= Operator przecinek 18 17 ++ -- POST 16 ++ -- PRE + - ! ~ 15 14 * / % 13 + - 12 << >> 11 < <= > >= 10 == != 9 & 8 ^ 7 | 6 && 5 || 4 ? : 3 = *= /= %= += -= <<= >>= &= |= ^= 2 1 , Wyrażenie składające się z kilku wyrażeń oddzielonych od siebie operatorem , przyjmuje wartość wyrażenia będącego najbardziej z prawej, np. wyrażenie: a , b; ma wartość równą b.
Operator przecinek Operator , ma najniższy priorytet (niższy od operatorów przypisania). Dlatego: a = (b , c); odpowiada a = c; ale a = b , c; a = b; Stosujemy go np. w sytuacji: for (int i = 0, j = 4; i < 4 && j>0; i++ , j--)
Łączność operatorów Operatory jednoargumentowe są prawostronnie łączne, np.: (!a) Operatory dwuargumentowe są lewostronnie łączne (wyjątek: operatory przypisania), np.: (((a+b)+c)+d) ale (a=(b=(c=d)))
Przykład 1 int i=0, j=3; while(i<3 || j>-1) { cout<<i<<'\t'<<j<<endl; ++i; --j; } 0 3 1 2 2 1 3 0
Przykład 1 c.d. int i=0, j=3, ile_i=0, ile_j=0; while((++ile_i, i<3) || (++ile_j, j>-1)) { cout<<i<<'\t'<<j<<endl; ++i; --j; } cout<<endl<<ile_i<<'\t'<<ile_j<<endl; 0 3 1 2 2 1 3 0 5 2
Przykład 2 int i=0, j=3, ile_i=0, ile_j=0; while((++ile_i, i<3) && (++ile_j, j>-1)) { cout<<i<<'\t'<<j<<endl; ++i; --j; } cout<<endl<<ile_i<<'\t'<<ile_j<<endl; 0 3 1 2 2 1 4 3
a = 6 b = 2 c = 4 Przykład 3 #include<iostream> using namespace std; int main() { int a,b,c; a=2+2*2; b=3%2+1; c=4/2*2; } 14 * / % 13 + - 3 = a = 6 b = 2 c = 4
a = 3 b = 4 c = 5 d = 5 BŁĄD BŁĄD g = 5 h = 5 Przykład 4 #include<iostream> using namespace std; int main(){ int a,b,c,d; a = 1 ? 2,3 : 4,5; b = 0 ? 2,3 : 4,5; c = (1 ? 2,3 : 4,5); d = (0 ? 2,3 : 4,5); int e = 1 ? 2,3 : 4,5; int f = 0 ? 2,3 : 4,5; int g = (1 ? 2,3 : 4,5); int h = (0 ? 2,3 : 4,5); } 4 ? : 3 = 1 , a = 3 b = 4 c = 5 d = 5 BŁĄD BŁĄD g = 5 h = 5
a = 5 b = 9 c = 5 d = 9 e = 5 f = 9 g = 5 h = 9 Przykład 4 c.d. #include<iostream> using namespace std; int main(){ int a,b,c,d; a = 1 ? 2+3 : 4+5; b = 0 ? 2+3 : 4+5; c = (1 ? 2+3 : 4+5); d = (0 ? 2+3 : 4+5); int e = 1 ? 2+3 : 4+5; int f = 0 ? 2+3 : 4+5; int g = (1 ? 2+3 : 4+5); int h = (0 ? 2+3 : 4+5); } 13 + 4 ? : 3 = a = 5 b = 9 c = 5 d = 9 e = 5 f = 9 g = 5 h = 9
= *= /= %= += -= <<= >>= &= |= ^= Przykład 5 #include<iostream> using namespace std; int main() { int a=2,b=1; a*=b+=2; } 3 = *= /= %= += -= <<= >>= &= |= ^= a = 6 b = 3
#include<iostream> using namespace std; int main() { Przykład 6 #include<iostream> using namespace std; int main() { short int a=0x1234, b, c; b=!a; c=~a; } a = 1234 b = 0 c = edcb
Przykład 7 #include<iostream> using namespace std; int main() { char z; if (1==4>=3) z='T'; else z='F'; } 11 < <= > >= 10 == != z = 'T'
Przykład 8 #include<iostream> using namespace std; int main() { int cout=2; std::cout<<cout<<cout<<endl; std::cout<<(cout<<cout)<<endl; } 22 8
Prezentacja udostępniona na licencji Creative Commons: Uznanie autorstwa, Na tych samych warunkach 3.0. Pewne prawa zastrzeżone na rzecz autorów. Zezwala się na dowolne wykorzystywanie treści pod warunkiem wskazania autorów jako właścicieli praw do prezentacji oraz zachowania niniejszej informacji licencyjnej tak długo, jak tylko na utwory zależne będzie udzielana taka sama licencja. Tekst licencji dostępny jest na stronie: http://creativecommons.org/licenses/by-sa/3.0/deed.pl