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