LEKCJA 10 Jakie operatory stosuje C++.
_______________________________________________________________
Podczas tej lekcji:
* Poznasz operatory języka C++.
* Przetestujesz działanie niektórych operatorów.
* Dowiesz się więcej o deklarowaniu i inicjowaniu zmiennych.
_______________________________________________________________
Słów kluczowych jest w języku C++ stosunkowo niewiele, za to
operatorów wyraźnie więcej niż np. w Basicu. Z kilku operatorów
już korzystałeś w swoich programach. pełną listę operatorów
wraz z krótkim wyjaśnieniem przedstawiam poniżej. Operatory C++
są podzielone na 16 grup i można je scharakteryzować:
* priorytetem
** najwyższy priorytet ma grupa 1 a najniższy grupa 16 -
przecinek, np. mnożenie ma wyższy priorytet niż dodawanie;
** wewnątrz każdej z 16 grup priorytet operatorów jest równy;
* łącznością (wiązaniem).
[S!] Precedence - kolejność, priorytet.
________________________________________________________________
Dwie cechy opertorów C++ priorytet i łączność decydują o
sposobie obliczania wartości wyrażeń.
Precedence - kolejność, priorytet.
Associativity - asocjatywność, łączność, wiązanie. Operator jest
łączny lewo/prawo-stronnie, jeśli w wyrażeniu zawierającym na
tym samym poziomie hierarchii nawiasów min. dwa identyczne
operatory najpierw jest wykonywany operator lewy/prawy. Operator
jest łączny, jeśli kolejność wykonania nie wpływa na wynik.
________________________________________________________________
Przykład:
a+b+c+d = (a+d)+(c+b)
[S]
________________________________________________________________
ASSIGN(ment) - Przypisanie.
EQAL(ity) - Równy, odpowiadający.
BITWISE - bit po bicie (bitowo).
REFERENCE - odwołanie do..., powołanie się na..., wskazanie
na... .
Funkcje logiczne:
OR - LUB - suma logiczna (alternatywa).
AND - I - iloczyn logiczny.
XOR (eXclusive OR) - ALBO - alternatywa wyłączająca.
NOT - NIE - negacja logiczna.
________________________________________________________________
Oznaczenia łączności przyjęte w Tabeli:
{L->R} €€€(Left to Right) z lewa na prawo.
{L<<-R} €€(Right to Left) z prawa na lewo.
Lista operatorów języka C++.
________________________________________________________________
Kategoria€| Operator€€€€€| €€€Co robi / jak dziaÅ‚a
----------|--------------|--------------------------------------
1. Highest| ()€€€€€€€€€€€| * ogranicza wyrażenia,
(Najwyższy|Parentheses | * izoluje wyrażenia warunkowe,
priorytet)|€€€€€€€€€€€€€€| * wskazuje na wywoÅ‚anie funkcji,
{L->R}€€€|€€€€€€€€€€€€€€| grupuje argumenty funkcji.
€€€€€€€€€€|--------------|--------------------------------------
€€€€€€€€€€| []€€€€€€€€€€€| zawartość jedno- lub wielowymiarowych
€€€€€€€€€€|Brackets | tablic
€€€€€€€€€€|--------------|--------------------------------------
€€€€€€€€€€| . |(direct component selector)
€€€€€€€€€€| -> |(indirect, or pointer, selection)
€€€€€€€€€€|€€€€€€€€€€€€€€| BezpoÅ›rednie lub poÅ›rednie wskazanie
| | elementu unii bądź struktury.
|--------------|--------------------------------------
| :: | Operator specyficzny dla C++.
| | Pozwala na dostęp do nazw GLOBALNYCH,
| | nawet jeśli zostały "przysłonięte"
| | przez LOKALNE.
----------|--------------|--------------------------------------
2. €€€€€€€| ! €€€€€€€€€€€| Negacja logiczna (NOT)
Jednoar-€|--------------|------------------------------------
gumentowe | ~ | Zamiana na kod KOMPLEMENTARNY bit po
(Unary) | | bicie. Dotyczy liczb typu int.
{L<<-R} |--------------|--------------------------------------
| + | Bez zmiany znaku (Unary plus)
|--------------|--------------------------------------
| - | Zmienia znak liczby / wyrażenia
| | (Unary minus)
|--------------|--------------------------------------
| ++ | PREinkrementacja/POSTinkrementacja
|--------------|--------------------------------------
| -- | PRE/POSTdekrementacja
|--------------|--------------------------------------
| & | Operator adresu(Referencing operator)
|--------------|--------------------------------------
| * | Operator wskazania
| | (Dereferencing operator)
|--------------|--------------------------------------
| sizeof | Zwraca wielkość argumentu w bajtach
|--------------|--------------------------------------
| new | Dynamiczne zarządzanie pamięcią:
| delete | new - przydziela pamięć,
| | delete - likwiduje przydział pamięci
----------|--------------|--------------------------------------
3. Multi- | * | Mnożenie (UWAGA: Druga rola "*")
plikatywne|--------------|--------------------------------------
{L->R} | / | Dzielenie
|--------------|--------------------------------------
| % | Reszta z dzielenia (modulo)
----------|--------------|--------------------------------------
4. Dostępu| .* | Operatory specyficzne dla C++.
(Member |(dereference) | Skasowanie bezpośredniego wskazania
access) | | na członka klasy (Class Member).
{L->R} |--------------|--------------------------------------
| ->* | Skasowanie pośredniego wskazania typu
objektowe | | "wskaźnik do wskaźnika"
----------|--------------|--------------------------------------
5. Addy - | + | Dodawanie dwuargumentowe.
tywne |--------------|--------------------------------------
{L->R} | - | Odejmowanie dwuargumentowe.
----------|--------------|--------------------------------------
6. Przesu-| << | Binarne przesunięcie w lewo.
nięcia |--------------|--------------------------------------
(Shift) | >> | Binarne przesunięcie w prawo.
{L->R} | | (bit po bicie)
----------|--------------|--------------------------------------
7. Relacji| < | Mniejsze niż...
{L->R} |--------------|--------------------------------------
| > | Większe niż....
|--------------|--------------------------------------
| <= | Mniejsze lub równe.
|--------------|--------------------------------------
| >= | Większe lub równe.
----------|--------------|--------------------------------------
8.Równości| == | Równe (równa się).
{L->R} | != | Nie równe.
----------|--------------|--------------------------------------
9. | & | AND binarnie (Bitwise AND)
{L->R} | | UWAGA: Druga rola "&".
----------|--------------|--------------------------------------
10. | ^ | XOR binarnie (Alternatywa wyłączna).
{L->R} | | UWAGA: To nie potęga !
----------|--------------|-------------------------------------
11.{L->R} | | | OR binarnie (bit po bicie)
----------|--------------|-------------------------------------
12.{L->R} | && | Iloczyn logiczny (Logical AND).
----------|--------------|-------------------------------------
13.{L->R} | || | Suma logiczna (Logical OR).
----------|--------------|--------------------------------------
14. Oper. | ?: | Zapis a ? x : y oznacza:
Warunkowy | | "if a==TRUE then x else y"
Conditional | gdzie TRUE to logiczna PRAWDA "1".
{L<<-R} | |
----------|--------------|--------------------------------------
15. Przy- | = | Przypisz wartość (jak := w Pascalu)
pisania |--------------|--------------------------------------
{L<<-R} | *= | Przypisz iloczyn. Zapis X*=7
| | oznacza: X=X*7 (o 1 bajt krócej!).
|--------------|--------------------------------------
| /= | Przypisz iloraz.
|--------------|--------------------------------------
| %= | Przypisz resztÄ™ z dzielenia.
|--------------|--------------------------------------
| += | Przypisz sumÄ™ X+=2 oznacza "X:=X+2"
|--------------|--------------------------------------
| -= | Przypisz różnicę X-=5 ozn. "X:=X-5"
|--------------|--------------------------------------
| &= | Przypisz iloczyn binarny ( Bitwise
| | AND)
| | bit po bicie.
|--------------|--------------------------------------
| ^= | Przypisz XOR bit po bicie.
|--------------|--------------------------------------
| |= | Przypisz sumÄ™ log. bit po bicie.
|--------------|--------------------------------------
| <<= | Przypisz wynik przesunięcia o jeden
| | bit w lewo.
|--------------|--------------------------------------
| >>= | j. w. o jeden bit w prawo.
----------|--------------|--------------------------------------
16. Prze- | , | Oddziela elementy na liście argu -
cinek | | mentów funkcji,
(Comma) | | Stosowany w specjalnych wyrażeniach
{L->R} | | tzw. "Comma Expression".
----------|--------------|-------------------------------------
UWAGI:
* Operatory # i ## stosuje siÄ™ tylko w PREPROCESORZE.
* Operatory << i >> mogą w C++ przesyłać tekst do obiektów cin i
cout dzięki tzw. Overloadingowi (rozbudowie, przeciążeniu)
operatorów. Takiego rozszerzenia ich działania dokonali już
programiści producenta w pliku nagłówkowym IOSTREAM.H>
Gdyby okazało się, że oferowane przez powyższy zestaw operatory
nie wystarczajÄ… Ci lub niezbyt odpowiadajÄ…, C++ pozwala na tzw.
OVERLOADING, czyli przypisanie operatorom innego, wybranego
przez użytkownika działania. Można więc z operatorami robić
takie same sztuczki jak z identyfikatorami. Sądzę jednak, że ten
zestaw nam wystarczy, w każdym razie na kilka najbliższych
lekcji.
Podobnie, jak pieniÄ…dze na bezludnej wyspie, niewiele warta jest
wiedza, której nie można zastosować praktycznie. Przejdźmy więc
do czynu i przetestujmy działanie niektórych operatorów w
praktyce.
TEST OPERATORÓW JEDNOARGUMENTOWYCH.
Otwórz plik nowego programu:
* Open [F3],
* Wpisz:
A:\UNARY.CPP
* Wybierz klawisz [Open] w okienku lub naciśnij [Enter].
Wpisz tekst programu:
[P017.CPP ]
// UNARY.CPP - operatory jednoargumentowe
# include
# include
float x;
void main(void)
{
clrscr();
for(;;)
{
printf("\n Podaj liczbe...\n");
scanf("%f", &x);
printf("\n%f\t%f\t%f\n", x, +x, -x );
printf("\n%f", --x );
printf("\t%f", x );
printf("\t%f", ++x);
if(getch() = '.') break;
};
}
Zwróć uwagę, że po nawiasie zamykającym pętlę nie ma tym razem
żadnego rozkazu. Nie wystąpi także ostrzeżenie (Warning:) przy
kompilacji.
Uruchom program Run | Run. Popraw ewentualne błędy.
Podając różne wartości liczby x:
- dodatnie i ujemne,
- całkowite i rzeczywiste,
przeanalizuj działanie operatorów.
Przerwij program naciskajÄ…c klawisz [.]
Zmodyfikuj w programie deklaracjÄ™ typu zmiennej X wpisujÄ…c
kolejno:
- float x; (rzeczywista)
- int x; €€€€€€(caÅ‚kowita)
- short int x; €€€€€(krótka caÅ‚kowita)
- long int x;€€€€€(dÅ‚uga caÅ‚kowita)
Zwróć uwagę, że zmiana deklaracji zmiennej bez JEDNOCZESNEJ
zmiany formatu w funkcjach scanf() i printf() spowoduje
komunikaty o błędach.
Spróbuj samodzielnie dobrać odpowiednie formaty w funkcjach
scanf() i printf(). Spróbuj zastosować zamiast funkcji printf()
i scanf() strumienie cin i cout. Pamiętaj o dołączeniu
właściwych plików nagłówkowych.
Jeśli miałeś kłopot z dobraniem stosownych formatów, nie
przejmuj się. Przyjrzyj się następnym przykładowym programom.
Zajmijmy się teraz dokładniej INKREMENTACJĄ, DEKREMENTACJĄ i
OPERATORAMI PRZYPISANIA.
1. Zamknij zbędne okna na ekranie. Pamuiętaj o zapisaniu
programów na dyskietkę/dysk w tej wersji, która poprawnie działa
lub w ostatniej wersji roboczej.
2. Otwórz plik:
ASSIGN.CPP
3. Wpisz tekst programu:
[P018.CPP]
# include
# include
long int x;
short int krok;
char klawisz;
int main()
{
clrscr();
printf("Test operatora przypisania += \n");
x=0;
printf("Podaj KROK ? \n");
scanf("%d",&krok);
for(;;)
{
printf("\n%d\n", x+=krok);
printf("[Enter] - dalej [K] - Koniec\n");
klawisz = getch();
if (klawisz=='k'|| klawisz=='K') goto koniec;
}
koniec:
printf("\n Nacisnij dowolny klawisz...");
getch();
return 0;
}
W tym programie już sami "ręcznie" sprawdzamy, czy nie pora
przerwać pętlę. Zamiast użyć typowej instrukcji break (przerwij)
stosujemy nielubiane goto, gdyż jest bardziej uniwersalne i w
przeciwieństwie do break pozwala wyraźnie pokazać dokąd
następuje skok po przerwaniu pętli. Zwróć uwagę na nowe elementy
w programie:
* DEKLARACJE ZMIENNYCH:
long int x; (długa, całkowita)
short int krok; €€€€(krótka, caÅ‚kowita)
char klawisz;€€€€€(zmienna znakowa)
* INSTRUKCJĘ WARUNKOWĄ:
if (KLAWISZ=='k'|| KLAWISZ=='K') goto koniec;
(JEŻELI zmienna KLAWISZ równa się "k" LUB równa się "K"
idź do etykiety "koniec:")
* Warunek sprawdzany po słowie if jest ujęty w nawiasy.
* Nadanie wartości zmiennej znakowej char klawisz przez funkcję:
klawisz = getch();
4. Skompiluj program. Popraw ewentualne błędy.
5. Uruchom program. Podając różne liczby (tylko całkowite!)
prześledź działanie operatora.
6. Zapisz poprawnÄ… wersjÄ™ programu na dysk/dyskietkÄ™ [F2].
7. Jeśli masz już dość, wyjdź z TC - [Alt]-[X], jeśli nie,
pozamykaj tylko zbędne okna i możesz przejść do zadań do
samodzielnego rozwiÄ…zania -> [Z]!
[Z]
________________________________________________________________
1. Do programu przykładowego wstaw kolejno różne operatory
przypisania:
*=, -=, /= itp.
Prześledź działanie operatorów.
2. W programie przykładowym zmień typ zmiennych:
long int x; na float x;
short int KROK; float KROK;
Przetestuj działanie operatorów w przypadku liczb
zmiennoprzecinkowych.
3. Zapisz w języku C++
* negacjÄ™ iloczynu logicznego,
* sumę logiczną negacji dwu warunków.
________________________________________________________________
TEST OPERATORÓW PRE/POST-INKREMENTACJI.
W następnym programie zilustrujemy działanie wszystkich pięciu
operatorów inkrementacji (dekrementacja to też inkrementacja
tylko w przeciwnÄ… stronÄ™).
[P019.CPP]
# include
# include
int b,c,d,e;
int i;
int STO = 100;
void main(void)
{
clrscr();
printf("Demonstruje dzialanie \n");
printf(" PREinkrementacji POSTinkrementacji");
printf("\nNr€€€€--X€€€€€€++X€€€€€€€€€€€€X--€€€€€€€X++ \n");
b = c = d = e = STO;
for(i=1; i<6; i++)
{
printf("%d\t%d\t%d\t\t%d\t%d\t\n", i,--b,++c,d--,e++);
}
getch();
}
[S!] PRE / POSTINKREMENTACJA.
________________________________________________________________
INKREMENTACJA oznacza zwiększenie liczby o jeden,
DEKREMENTACJA oznacza zmniejszenie liczby o jeden.
PRE oznacza wykonanie in/de-krementacji przed użyciem zmiennej,
POST - in/de-krementację po użyciu zmiennej.
________________________________________________________________
Działanie możesz prześledzić na wydruku, który powinien Ci dać
program przykładowy INDEKREM.CPP:
Demonstruje dzialanie
PREinkrementacji POSTinkrementacji
Nr€€€€--X€€€€€€++X€€€€€€€€€€€€X--€€€€€€€X++
1 99 101 100 100
2 98 102 99 101
3 97 103 98 102
4 96 104 97 103
5 95 105 96 104
JAK KORZYSTAĆ Z DEBUGGERA?
Uruchom program powtórnie naciskając klawisz [F7]. Odpowiada to
poleceniu Trace into (włącz śledzenie) z menu Run. Prześledzimy
działanie programu przy pomocy Debuggera.
Po wykonaniu kompilacji (lub odstąpieniu od kompilacji, jeśli
nie dokonałeś zmian w programie) pojawił się na ekranie pasek
wyróżnienia wokół funkcji main(), bo to od niej rozpoczyna się
zawsze wykonanie programu. Naciśnij powtórnie [F7].
Pasek przesunÄ…Å‚ siÄ™ na funkcjÄ™ clrscr();. MignÄ…Å‚ na chwilÄ™ ekran
użytkownika, ale na razie nie ma po co tam zaglądać, więc
wykonamy kolejne kroki. Podam klejno: [Klawisz]-[wiersz].
[F7] - printf("DemonstrujÄ™...");
Zaglądamy na ekran użytkownika [Alt]-[F5].....[Enter] - wracamy
do edytora.
[F7],[F7]... doszliśmy do wiersza
b=c=d=e=STO;
Zapraszamy teraz debugger do pracy wydajÄ…c mu polecenie "Wykonaj
InspekcjÄ™" [Alt]-[D] | Inspect. Pojawia siÄ™ okienko dialogowe
"Inspect".
* Wpisz do okienka tekstowego nazwę zmiennej b i naciśnij
[Enter].
Pojawiło się okienko dialogowe "Inspecting b" zawierające
fizyczny adres pamięci RAM, pod którym umieszczono zmienną b i
wartość zmiennej b (zero; instrukcja przypisania nada jej
wartość 100). Naciśnij [Esc]. Okienko zniknęło.
[F7] - for(i=1; i<6; i++);
* Naprowadź kursor na zmienną d w tekście programu i wykonaj
inspekcję powtórnie [Alt]-[D], [I]. Jak widzisz w okienku
zmiennej d została nadana wartość 100. Naciśnij [Esc].
Dokonamy teraz modyfikacji wartości zmiennej przy pomocy
polecenia Evaluate and Modify (sprawdź i zmodyfikuj) z menu
Debug.
* Naciśnij klawisze [Alt]-[D], [E]. Pojawiło się okienko
dialogowe "Evaluate and Modify". W okienku tekstowym
"Expression" (wyrażenie) widzisz swoją zmienną d.
* Przejdź przy pomocy [Tab] do okienka tekstowego "New Value"
(nowa wartość) i wpisz tam liczbę 1000. Naciśnij [Enter] a
następnie [Esc]. Okienko zamknęło się. Zmiana wartości zmiennej
została dokonana.
[F7] - printf("...") - wnętrze pętli for.
[F7] - wykonała się pętla.
Obejrzyjmy wyniki [Alt]-[F5].
W czwartej kolumnie widzisz efekt wprowadzonej zmiany:
Demonstruje dzialanie
PREinkrementacji POSTinkrementacji
Nr€€€€--X€€€€€€++X€€€€€€€€€€€€X--€€€€€€€X++
1 99 101 1000 100
2 98 102 999 101
3 97 103 998 102
4 96 104 997 103
5 95 105 996 104
Zwróć uwagę w programie przykładowym na:
* Zliczanie ilości wykonanych przez program pętli.
int i; (deklaracja, że i będzie zmienną całkowitą)
...
i=1; (zainicjowanie zmiennej, nadanie początkowej wartości)
...
i++; (powiększanie i o 1 w każdej pętli)
...
i<6 (warunek kontynuacji)
* Możliwość grupowej deklaracji zmiennych tego samego typu:
int b,c,d,e;
[Z]
________________________________________________________________
4. Zmień w programie przykładowym wartość początkową STO na
dowolną inną - np. zero. Przetestuj działanie programu.
5. Sprawdź, czy można wszystkie zmienne używane w programie
przykładowym zadeklarować wspólnie (jeden wiersz zamiast
trzech).
________________________________________________________________
Wyszukiwarka
Podobne podstrony:
cpp2 LEKCJA43
cpp2 LEKCJA33
cpp2 LEKCJA15
cpp2 LEKCJA38
cpp2 LEKCJA18
cpp2 LEKCJA19
cpp2 LEKCJA2
cpp2 LEKCJA14
cpp2 LEKCJA48
cpp2 LEKCJA44
cpp2 LEKCJA37
cpp2 LEKCJA1
cpp2 LEKCJA22
cpp2 LEKCJA46
cpp2 LEKCJA35
więcej podobnych podstron