Jezyki i paradygmaty programowania

Transkrypt

Jezyki i paradygmaty programowania
Operatory w C/C++
Jezyki
˛
i paradygmaty programowania
Tadeusz Chmaj
Instytut Teleinformatyki
ITI PK Kraków
marzec 2012
Tadeusz Chmaj
Wykład III
Operatory w C/C++
Spis rzeczy
1
Operatory w C/C++
Typy operatorów
Operatory arytmetyczne
Operatory logiczne
Operatory bitowe
Tadeusz Chmaj
Wykład III
Operatory w C/C++
Typy operatorów
Operatory arytmetyczne
Operatory logiczne
Operatory bitowe
Operatory
operator - rodzaj funkcji wbudowanej w jezyk;
˛
różnica –
notacja
w C/C++ - dużo różnorodnych operatorów
podstawowe grupy:
operatory arytmetyczne
operatory logiczne
operatory bitowe
każdy operator jest określony przez:
liczbe˛ i typ argumentów
sposób działania
priorytet
typ łaczności
˛
Tadeusz Chmaj
Wykład III
Operatory w C/C++
Typy operatorów
Operatory arytmetyczne
Operatory logiczne
Operatory bitowe
podstawowe to operatory addytywne: + oraz multiplikatywne: * /
sa˛ to operatory dwuargumentowe, składnia: arg1 op arg2
wynik może zależeć od typu - na przykład dla operatora dzielenia
(przeładowanie operatorów)
priorytety zgodne z intuicja˛
łaczność
˛
lewostronna
operator % - reszta z dzielenia
określony tylko dla argumentów całkowitych
priorytet jak dla podstawowych operatorów multiplikatywnych
operatory znaku + –
operatory inkrementacji i dekrementacji: ++ -notacja przedrostkowa (++k) - najpierw zmieniamy wartość zmiennej,
nastepnie
˛
te˛ zmodyfikowana˛ wartość stosujemy w wyrażeniu
notacja przyrostkowa (k++) - najpierw obliczamy wartość wyrażenia z
pierwotna˛ wartościa˛ argumentu, a nastepnie
˛
modyfikujemy argument
Tadeusz Chmaj
Wykład III
Operatory w C/C++
Typy operatorów
Operatory arytmetyczne
Operatory logiczne
Operatory bitowe
Inkrementacja i dekrementacja
int x,n=5;
x=n++;
printf("%d %d\n",n,x);
int x,n=5;
x=++n;
printf("%d %d\n",n,x);
65
66
uwaga: nie należy inkrementować lub dekrementowć tej samej wartości w
jednym wyrażeniu wiecej
˛
niż raz - zabronione sa˛ instrukcje typu:
x = (2 * y++) * (6 - ++y);
wynik zależy od implementacji
jezyk
˛
nie określa prawidłowej interpretacji tego typu wyrażeń
zasada zmień–potem–użyj lub użyj–potem–zmień niejednoznaczna
Tadeusz Chmaj
Wykład III
Operatory w C/C++
Typy operatorów
Operatory arytmetyczne
Operatory logiczne
Operatory bitowe
Operatory przypisania
podstawowy operator przypisania =
dwuargumentowy, prawostronnie łaczny
˛
priorytet niższy niż dla operatorów arytmetycznych
każde przypisanie samo w sobie jest wyrażeniem majacym
˛
wartość równa˛
wartości przypisywanej
inne operatory przypisania
w C/C++ szereg innych operatorów przypisania postaci op=,
na przykład wyrażenia x=x+2 możemy zapisać x+=2
to mozna uogólnić na inne operatory dwuargumentowe, takie jak + - *
dla tych operatorów zapis wyr1 op= wyr2 jest równoważny zapisowi
wyr1 = (wyr1) op (wyr2)
zalety: zwartość zapisu, przespieszenie działania (ustalenie adresu
lewego argumentu tylko raz)
Tadeusz Chmaj
Wykład III
Operatory w C/C++
Typy operatorów
Operatory arytmetyczne
Operatory logiczne
Operatory bitowe
Operatory relacji
nierówności: <
<=
>
>=
maja˛ równy priorytet, niższy niż operatory arytmetyczne (poza
przypisaniami)
łaczne
˛
lewostronnie
operatory równości
== !=
maja˛ równy priorytet, niższy niż operatory nierówności,wyższy niż
przypisania
łaczne
˛
lewostronnie
cz˛esty bład
˛ – użycie operatora przypisania = zamiast
rowności == w wyrażeniach logicznych
int a=5, b=100;
if (a==b) //if(a=b)
cout<<"Te liczby sa rowne\n";
else
cout << ”Te liczby sa rozne\n";
cout<<" a = " << a << " b = " << b << "\n";
Tadeusz Chmaj
Wykład III
Operatory w C/C++
Typy operatorów
Operatory arytmetyczne
Operatory logiczne
Operatory bitowe
Logiczna suma i iloczyn
Zagadka - co wypisze program?
int a=-2, b=-1, c=0;
if(a<b<c) cout << "Prawda !!!\n";
else cout << "Falsz !!!\n";
konstrukcja wyrażeń logicznych - operatory suma logicznej || i logicznego
iloczynu &&
priorytety niższe od operatorów relacji, wyższe od przypisań; priorytet iloczynu
logicznego wyższy niż logicznej sumy
ustalony sposób obliczania: od lewej do prawej; obliczenia sa˛ przerywane, gdy
wartość wyrażenia jest rozstrzygnieta
˛
(a==0) && (k>10) && n++
(a>0) || (k<5) && i++
operator negacji !, odwraca wartość logiczna˛ wyrażenia;
cz˛esto stosowana fraza: zamiast: if (a==0) stosujemy: if (!a)
priorytet - wyższy od wszystkich operatorów arytmetycznych i logicznych
Tadeusz Chmaj
Wykład III
Operatory w C/C++
Typy operatorów
Operatory arytmetyczne
Operatory logiczne
Operatory bitowe
pozwalaja˛ na manipulowanie poszczególnymi bitami słowa
maszynowego
działaja˛ tylko na argumenty całkowite
numeracja bitów w słowie: od skrajnego prawego bitu (najmłodszy bit o
numerze 0) w lewo
wartość numeryczna bitu na pozycji p (czyli o numerze (p-1)) = 2p−1
przesuniecie
˛
w lewo
operator dwuargumentowy, składnia:
zmienna << ile_przesun
działanie: przesuwa wzorzec bitowy zmiennej wzgledem
˛
maski o
ile_przesun
short a=0x4072, w;
w= a << 3;
przesuń
uzupłnij
obetnij
Tadeusz Chmaj
Wykład III
Operatory w C/C++
Typy operatorów
Operatory arytmetyczne
Operatory logiczne
Operatory bitowe
Przesuniecie
˛
w prawo
działania podobne do przesuniecia
˛
w lewo dla zmiennych bez znaku, oraz
dodatnich liczb ze znakiem
short a=0x4072, w;
w= a >> 3;
przesuń
uzupłnij
obetnij
dla ujemnych liczb typów ze znakiem niejednoznaczność; uzupełnienie z lewej
może zawierać zera, lub jedynki (zależeć od implementacji )
short b=0xff00, w;
w= b >> 3;
przesuń
uzupłnij
obetnij
Tadeusz Chmaj
Wykład III
Operatory w C/C++
Typy operatorów
Operatory arytmetyczne
Operatory logiczne
Operatory bitowe
Pozostałe operatory bitowe
bitowa suma, iloczyn, różnica symetryczna (XOR)
dwuargumentowe operatory bitowe; wartość określonego bitu wyjścia
wyznaczona przez odpowiednia˛ elementarna˛ operacje˛ bitowaa˛ na
właściwych bitach wejścia
przykłady - definicje:
short int m = 0x0f0f;
short int k = 0x0ff0;
short int a, b, c, d;
a = m|k;
//suma bitowa,
a = 0x0fff
b = m&k;
//iloczyn bitowy, b = 0x0f00
c = m^k;
//bitowe XOR,
c = 0x00ff
negacja bitowa – jednoargumentowy operator bitowy każdy bit w wyniku to negacja bitowa wejscia
d= ~m;
//negacja bitowa, d = 0x0f0f0;
Tadeusz Chmaj
Wykład III
Operatory w C/C++
Typy operatorów
Operatory arytmetyczne
Operatory logiczne
Operatory bitowe
Operatory bitowe - zastosowania
przyspieszenie wykonania programu
wyrażenie if(n&1) szybsze niż if(n%2)=1)
wyrażenie n<<=1 szybsze niż n*=2
maskowanie
niech c – stała (maska), której forma bitowa to ciag
˛ jedynek
od pozycji zero, do ustalonej pozycji pozostałe wartości to
0; (przykład c=0177)
jak wyglada
˛ reprezentacja bitowa zmiennej całkowitej n po
wykonaniu instrukcji n &=p
jak wygada
˛ postać bitowa maski, która ma 10 najmłodszych
bitów ustawionych, poza tym zera
napisz instrukcje,
˛ która daje mask˛e z jedynkami na
skrajnych prawych k bitach
Tadeusz Chmaj
Wykład III
Operatory w C/C++
Typy operatorów
Operatory arytmetyczne
Operatory logiczne
Operatory bitowe
Operatory bitowe - zastosowania - c.d.
ustawianie bitów
niech SETON - stała; wtedy x |=SETON ustastawia bity x
na pozycjach, których SETON ma jedynki
manipulacje bitami - przykład:
funkcja getbits(unsigned x, int , int n) , która ze zmiennej x
wycina n-bitowe pole od pozycji p, dosuniete
˛ do prawej strony wyniku
unsigned getbits(unsigned x, int , int n)
{
return( x >> (p+1-n)) & ~(~0 << n);
}
triki bitowe
jaki
warunek sprawdza poniższe wyrażenie?
if(v&(v-1)==0) {..};
Tadeusz Chmaj
Wykład III
Operatory w C/C++
Typy operatorów
Operatory arytmetyczne
Operatory logiczne
Operatory bitowe
Pozostałe operatory
operator trójargumentowy (wyrażenie warunkowe):
składnia:
wyr1 ? wyr2 : wyr3
działanie: oblicz wyrażenie wyr1, jeżeli jest ono prawdziwe to oblicz wyr2,
które staje sie˛ wartościa˛ całego wyrażenia,
w przeciwnym razie bedzie
˛
nim wyr3
może być użyty zamiast instrukcji if ... else
zalety: zwartość zapisu, możliwość tworzenia bardziej złożonych wyrażeń
operator przecinkowy - kilka wyrażeń oddzielonych
przecinkami - wyrażenie przecinkowe
ustalony sposób obliczania (od lewej do prawej) oraz
wartość (wartość skrajnego prawego wyrażenia)
operator sizeof wyznacza rozmiary obiektów
operator & - pobierania adresu
Tadeusz Chmaj
Wykład III