Podstawy programowania
Podstawy programowania
w j
w języku C i C++
ęzyku C i C++
Operatory i wyrażenia
Część czwarta
Niniejsze opracowanie zawiera skrót treści wykładu, lektura tych materiałów nie zastąpi uważnego w nim uczestnictwa.
Opracowanie to jest chronione prawem autorskim. Wykorzystywanie jakiegokolwiek fragmentu w celach innych niż nauka własna jest nielegalne.
Dystrybuowanie tego opracowania lub jakiejkolwiek jego części oraz wykorzystywanie zarobkowe bez zgody autora jest zabronione.
Roman Simiński
roman.siminski@us.edu.pl
www.us.edu.pl/~siminski
Autor
Kontakt
Operatory arytmetyczne
Operatory arytmetyczne
Podstawy programowania w C++
Podstawy programowania w C++
Copyright © Roman Simiński
2
Strona :
O p e r a t o r y i w y r a ż e n i a
O p e r a t o r y i w y r a ż e n i a
Operatory arytmetyczne to
+
: dodawanie (dwuargumentowy) i zachowanie znaku (jednoargumentowy),
―
: odejmowanie (dwuargumentowy) i zmiana znaku (jednoargumentowy),
*
: mnożenie (dwuargumentowy),
/
: dzielenie (dwuargumentowy),
%
: (dwuargumentowy)reszta z dzielenia (modulo), nie może być stosowany
do liczb rzeczywistych.
Uwaga — dzielenie na operandach całkowitych daje wynik całkowity
Uwaga — dzielenie na operandach całkowitych daje wynik całkowity
Podstawy programowania w C++
Podstawy programowania w C++
Copyright © Roman Simiński
3
Strona :
O p e r a t o r y i w y r a ż e n i a
O p e r a t o r y i w y r a ż e n i a
Ten kod:
int x = 5, y = 2;
float f = x/y;
cout << ”Wynik dzielenia ” < < x << ”przez ” << y << ” wynosi ” << f ;
wyprodukuje:
Aby otrzymać wynik rzeczywisty jeden z operandów musi być rzeczywisty:
float x = 5;
int y = 2;
float f = x/y;
int x = 5, y = 2;
float f =
( float )
x/y;
Rzutowanie (konwersja) typów w wyrażeniu
lub
Operatory relacji i operatory logiczne
Operatory relacji i operatory logiczne
Podstawy programowania w C++
Podstawy programowania w C++
Copyright © Roman Simiński
4
Strona :
O p e r a t o r y i w y r a ż e n i a
O p e r a t o r y i w y r a ż e n i a
Operatory relacji to :
>
,
>=
,
<
,
<=
.
Operatory porównania
==
,
!=
.
Operatory logiczne to
&&
(and) oraz
||
(or).
Wyrażenia połączone tymi operatorami oblicza się od lewej do prawej, koniec
obliczeń następuje natychmiast po określeniu wartości logicznej wyrażenia.
Operatory relacji mają wyższy priorytet niż operatory porównania.
Priorytet operatora && jest wyższy niż || a oba są niższe niż operatorów relacji i
porównania. Dlatego poniższy warunek może być zapisany bez nawiasów:
while( c >= ’A’ && c <= ’Z’ )
{
. . .
}
while( ( c >= ’A’ ) && ( c <= ’Z’ ) )
{
. . .
}
zamiast
Uwaga:
Operatory relacji i operatory logiczne, przykład wykorzystania
Operatory relacji i operatory logiczne, przykład wykorzystania
Podstawy programowania w C++
Podstawy programowania w C++
Copyright © Roman Simiński
5
Strona :
O p e r a t o r y i w y r a ż e n i a
O p e r a t o r y i w y r a ż e n i a
Czy rok w zmiennej całkowitej year jest przestępny?
if(
( year % 4 == 0 && year % 100 != 0 ) || year % 400 == 0
)
cout << ”Rok ” << year << ” jest rokiem przest pnym”;
ę
else
cout << ”Rok ” << year << ” nie jest rokiem przest pnym”;
ę
Czy zmienna znakowa c jest cyfrą lub małą literą?
if(
( c >= '0' && c <= '9' ) || ( c >= 'a' && c <= 'z' )
)
cout << ”Cyfra lub mała litera”;
else
cout << ”To nie jest ani cyfra, ani mała litera”;
Czy zmienna znakowa c jest cyfrą szesnastkową?
if(
( c>='0' && c<='9' ) || ( c>='a' && c<='f' ) || ( c>='A' && c<='F' )
)
cout << ”Cyfra szesnastkowa”;
else
cout << ”To nie jest cyfra szesnastkowa”;
Operatory zwiększania ++ i zmniejszania —―
Operatory zwiększania ++ i zmniejszania —―
Podstawy programowania w C++
Podstawy programowania w C++
Copyright © Roman Simiński
6
Strona :
O p e r a t o r y i w y r a ż e n i a
O p e r a t o r y i w y r a ż e n i a
Operatory
++
i
—―
zawsze powodują odpowiednio zwiększenie lub zmniejszenie
wartości argumentu. Mogą one jednak występować jako przedrostki (ang. prefix)
lub przyrostki (ang. postfix).
licznik = licznik + 1;
i = i – 1;
licznik++;
i--;
++licznik;
--i;
Operatory zwiększania ++ i zmniejszania —―
Operatory zwiększania ++ i zmniejszania —―
Podstawy programowania w C++
Podstawy programowania w C++
Copyright © Roman Simiński
7
Strona :
O p e r a t o r y i w y r a ż e n i a
O p e r a t o r y i w y r a ż e n i a
Wersja przedrostkowa zwiększa (zmniejsza) wartość argumentu przed użyciem
jego wartości.
Wersja przyrostkowa zwiększa (zmniejsza) wartość argumentu po użyciem jego
wartości.
int a = 5, b;
b =
++a
;
a ==
6
, b ==
6
int a = 5, b;
b =
a++
;
a ==
6
, b ==
5
int licznik = 0;
cout << ”Licznik: ” <<
licznik
;
licznik++
;
...
licznik++
;
cout << ”Licznik: ” <<
licznik
;
int licznik = 0;
cout << ”Licznik: ” <<
licznik++
;
...
cout << ”Licznik: ” <<
++licznik
;
Operatory zwiększania ++ i zmniejszania —―
Operatory zwiększania ++ i zmniejszania —―
Podstawy programowania w C++
Podstawy programowania w C++
Copyright © Roman Simiński
8
Strona :
O p e r a t o r y i w y r a ż e n i a
O p e r a t o r y i w y r a ż e n i a
for( int licznik = 10; licznik > 0; cout << endl <<
licznik--
<< "..." )
;
for( int licznik = 10; licznik > 0;
licznik--
)
cout << endl <<
licznik
<< "...";
Wykorzystując operatory
++
i
—―
iterację:
Można zapisać krócej:
Na operatory ++ i ―― trzeba uważać:
i = ++i---i+++i+i--;
i = ++i - --i + ++i + i--;
?
Operatory bitowe
Operatory bitowe
Podstawy programowania w C++
Podstawy programowania w C++
Copyright © Roman Simiński
9
Strona :
O p e r a t o r y i w y r a ż e n i a
O p e r a t o r y i w y r a ż e n i a
Operatory bitowe mogą być stosowane do argumentów typu całkowitego, są to:
Operator
Znaczenie
&
bitowa koniunkcja (and),
|
bitowa alternatywa (or),
^
bitowa różnica symetryczna (xor),
<<
przesunięcie w lewo,
>>
przesunięcie w prawo,
~
dopełnienie jedynkowe.
z = x & y;
0...0101
0...0111
0...0101 z == 5
int x = 5, y = 7, z;
z = x | y;
0...0101
0...0111
0...0111 z == 7
z = x ^ y;
0...0101
0...0111
0...0010 z == 2
Operatory bitowe, przykłady zastosowania
Operatory bitowe, przykłady zastosowania
Podstawy programowania w C++
Podstawy programowania w C++
Copyright © Roman Simiński
10
Strona :
O p e r a t o r y i w y r a ż e n i a
O p e r a t o r y i w y r a ż e n i a
Ustawianie pewnych bitów liczby:
flag = flag | 1;
// Ustawienie najmłodszego bitu liczby flag
Zerowanie pewnych bitów liczby:
flag = flag & ~1;
// Wyzerowanie najmłodszego bitu flag
Niech będzie zadeklarowana zmienna flag, o rozmiarze 1-go bajta:
unsigned char flag = 0;
Testowanie czy pewne bity liczby są ustawione:
if( flag & 1 )
// Czy najmłodszy bit jest ustawiony?
. . .
Operatory bitowe, przykłady zastosowania
Operatory bitowe, przykłady zastosowania
Podstawy programowania w C++
Podstawy programowania w C++
Copyright © Roman Simiński
11
Strona :
O p e r a t o r y i w y r a ż e n i a
O p e r a t o r y i w y r a ż e n i a
enum FileMode
{
FMReadOnly = 1
,
// 0...0001
FMWriteOnly = 2
,
// 0...0010
. . .
};
. . .
char znak;
int fMode = 0;
cout << "Podaj tryb otwarcia\nr: odczyt\nw: zapis\n>";
cin >> znak;
switch( znak )
{
case 'r' :
case 'R' :
fMode = fMode | FMReadOnly
;
break;
case 'w' :
case 'W' :
fMode = fMode | FMWriteOnly
;
break;
// . . .
}
Operatory bitowe, przykłady zastosowania
Operatory bitowe, przykłady zastosowania
Podstawy programowania w C++
Podstawy programowania w C++
Copyright © Roman Simiński
12
Strona :
O p e r a t o r y i w y r a ż e n i a
O p e r a t o r y i w y r a ż e n i a
if(
fMode & FMReadOnly
)
cout << "Otwarcie tylko do odczytu";
. . .
if(
fMode & FMWriteOnly
)
cout << "Otwarcie tylko do zapisu";
Testowanie trybu otwarcia:
fMode = fMode & ~FMReadOnly;
. . .
fMode = fMode & ~FMWriteOnly;
Czyszczenie określonego trybu otwarcia:
fMode = fMode | ( FMReadOnly | FMWriteOnly );
Ustawienie trybu otwarcia do zapisu i odczytu:
if( fMode & ( FMReadOnly | FMWriteOnly ) )
cout << "Otwarcie do zapisu i odczytu";
Testowanie trybu otwarcia do zapisu i odczytu:
Operatory bitowe, przesunięcia bitowe
Operatory bitowe, przesunięcia bitowe
Podstawy programowania w C++
Podstawy programowania w C++
Copyright © Roman Simiński
13
Strona :
O p e r a t o r y i w y r a ż e n i a
O p e r a t o r y i w y r a ż e n i a
Przesunięcie o jeden bit w prawo:
unsigned char flag = 128;
// 10000000
flag = flag >> 1;
// 01000000
flag = flag >> 1;
// 00100000
Uwaga na bit znaku:
signed char flag = 128;
// 10000000
flag = flag >> 1;
// 11000000
flag = flag >> 1;
// 11100000
Przesunięcie o jeden bit w lewo:
unsigned char flag = 1;
// 00000001
flag = flag << 1;
// 00000010
flag = flag << 1;
// 00000100
Operatory bitowe, przesunięcia bitowe — przykład wykorzystania
Operatory bitowe, przesunięcia bitowe — przykład wykorzystania
Podstawy programowania w C++
Podstawy programowania w C++
Copyright © Roman Simiński
14
Strona :
O p e r a t o r y i w y r a ż e n i a
O p e r a t o r y i w y r a ż e n i a
Ile bitów ma liczba typu int w danej implementacji (iteracja while)?
int number = 1, counter = 0;
while( number != 0 )
{
number = number << 1
;
counter ++;
}
cout << "Liczba bitów typu int: " << counter;
Ile bitów ma liczba typu int w danej implementacji (iteracja for)?
int number = 1, counter = 0;
for( ; number != 0; counter++ )
number = number << 1
;
cout << "Liczba bitów typu int: " << counter;
Operatory przypisania
Operatory przypisania
Podstawy programowania w C++
Podstawy programowania w C++
Copyright © Roman Simiński
15
Strona :
O p e r a t o r y i w y r a ż e n i a
O p e r a t o r y i w y r a ż e n i a
Przypisanie wartości jest w języku C/C++ wyrażeniem a nie instrukcją. Operator
przypisania = jest lewostronnie łączny, co umożliwia łączenie przypisań:
int i = 5, j, k, l;
j = k = l = i;
Zamiast:
j = ( k = ( l = ( i + 5 ) ) + 10 ) * 2; // j == 40, k == 20, l == 10
x = sin( alfa );
if(
x == 0
)
{
...
}
if(
( x = sin( alfa ) )
== 0 )
{
...
}
l = i + 5;
k = l + 10;
j = k * 2;
można napisać:
Często:
Operatory przypisania, cd. ...
Operatory przypisania, cd. ...
Podstawy programowania w C++
Podstawy programowania w C++
Copyright © Roman Simiński
16
Strona :
O p e r a t o r y i w y r a ż e n i a
O p e r a t o r y i w y r a ż e n i a
Dla większości operatorów dwuargumentowych:
+ - * / % << >> * ^ & |
można wykorzystywać specjalne operatory przypisania, pozwalające skrócić zapis
często wykorzystywanych konstrukcji, takich jak:
i = i + 2
y = y * 2
x = x << 1
j = j * ( k + 1 )
flag = flag >> k;
i += 2
y *= 2
x <<= 1
j *= k + 1
flag >>= k;
Wersja z normalna
Wersja skrócona
Operatory przypisania, cd. ...
Operatory przypisania, cd. ...
Podstawy programowania w C++
Podstawy programowania w C++
Copyright © Roman Simiński
17
Strona :
O p e r a t o r y i w y r a ż e n i a
O p e r a t o r y i w y r a ż e n i a
Ogólnie, jeśli expr1 i expr2 to wyrażenia, a op to operator dwuargumentowy,
zapis:
expr1 = expr1 op expr2
można uprościć do postaci:
expr1 op= expr2
Operator warunkowy
Operator warunkowy
Podstawy programowania w C++
Podstawy programowania w C++
Copyright © Roman Simiński
18
Strona :
O p e r a t o r y i w y r a ż e n i a
O p e r a t o r y i w y r a ż e n i a
Bardzo często spotyka się pewne „symetryczne” instrukcje warunkowe, np.:
if( delta < 0 )
brak_rozw_rzecz = 1;
else
brak_rozw_rzecz = 0;
if( a > b )
max = a;
else
max = b;
Można je zapisać krócej, z wykorzystaniem operatora warunkowego:
brak_rozw_rzecz = ( delta < 0 ) ? 1 : 0;
max = ( a > b ) ? a : b;
Inny przykład — komunikaty w wersji polskiej lub angielskiej:
enum WERSJA_JEZYKOWA { POLSKI, ANGIELSKI };
int jezyk = POLSKI;
. . .
puts( ( jezyk == POLSKI ) ? ”Podaj warto ć: ” : ”Input value:” );
ś