PP1 lecture 2


Podstawy Programowania 1
Podstawy języka C
Arkadiusz Chrobot
Zakład Informatyki
15 pazdziernika 2015
1/43
Plan
1
Inicjacja zmiennych
2
Stałe raz jeszcze
3
Operatory
Operatory relacyjne
Operatory arytmetyczne
Operatory logiczne
Operatory bitowe
Operator trójargumentowy
Rzutowanie
Inne operatory
Kolejność działań
4
Podstawowe wejście i wyjście
2/43
Inicjacja zmiennych
Inicjacja zmiennych
Inicjacja zmiennej jest to przypisanie jej wartości przed pierwszym użyciem,
a dokładniej przed pierwszym odczytem jej zawartości. Brak inicjacji jest
jedną z najczęstszych przyczyn błędnego działania programów. Zmienne glo-
balne mają zerową wartość początkową. Czasem taka wartość początkowa
nie jest prawidłowa i chcielibyśmy ją zmienić.
W tym wykładzie dla wygody większość zmiennych będzie miała nazwy jed-
noliterowe.
3/43
Inicjacja zmiennych
Instrukcja przypisania
Najprostszą metodą inicjacji zmiennej jest przypisanie jej wartości za pomocą
instrukcji przypisania, która w języku C zapisywana jest za pomocą symbolu
=. Ta instrukcja jest używana również wtedy, gdy chcemy zmienić wartość
zmiennej. Formalnie ta instrukcja dokonuje wyznaczenia wartości wyraże-
nia stojÄ…cego po jej prawej stronie i konwersji typu wyniku na typ zmiennej
znajdującej się po jej lewej stronie. Efektem ubocznym, którym jako progra-
miści jesteśmy głównie zainteresowani, jest przypisanie tej zmiennej wartości
wyrażenia. W języku C instrukcja przypisania jest także operatorem.
4/43
Inicjacja zmiennych
Sposoby inicjacji
Inicjacja zmiennych całkowitoliczbowych
Zmiennej można przypisać wartość w miejscu jej deklaracji. Listing zamiesz-
czony poniżej pokazuje jak to zrobić dla zmiennych całkowitoliczbowych.
int a = 3, b = 075, c = 0xab, d = 1u;
int main(void)
{
return 0;
}
Jeśli liczba jest poprzedzona zerem, to taki zapis oznacza, że jest ona za-
pisana w kodzie ósemkowym, jeśli jest poprzedzona przedrostkiem 0x, to
znaczy to, że jest to liczba zapisana w kodzie szesnastkowym. Liczby mogą
być zakończone przyrostkiem, który w przypadku liczb całkowitych może być
literą u lub U i oznacza wtedy, że liczba jest bez znaku, lub literą l lub L
oznaczającą wartość typu long. Można oba te przyrostki połączyć w lu lub
LU.
5/43
Inicjacja zmiennych
Sposoby inicjacji
Inicjacja zmiennych całkowitoliczbowych
Korzystając z faktu, że w języku C instrukcja przypisania jest równocześnie
operatorem można zainicjować kilka zmiennych tą samą wartością w nastę-
pujący sposób:
int a, b, c;
int main(void)
{
a=b=c=3;
return 0;
}
6/43
Inicjacja zmiennych
Sposoby inicjacji
Inicjacja zmiennych znakowych
Zmiennym znakowym (typu char) można przypisać liczbę oznaczającą kod
ascii lub znak, umieszczajÄ…c go w apostrofach.
char a = 65, b = 'a';
int main(void)
{
return 0;
}
Przypomnijmy, że zmienne takiego typu mogą być używane nie tylko do
przechowywania znaków, ale także liczb.
7/43
Inicjacja zmiennych
Sposoby inicjacji
Inicjacja zmiennych zmiennoprzecinkowych
Zmienne zmiennoprzecinkowe (float, double i long double) możemy
inicjować z użyciem zapisu dziesiętnego, gdzie zamiast przecinka stosujemy
kropkÄ™ lub za pomocÄ… notacji wykÅ‚adniczej, gdzie np. zapis 1e-2 oznacza 1·
10-2, czyli 0.01. Liczby w notacji dziesiętnej mogą być zakończone znakiem
f jeśli chcemy aby były typu float.
double a = 0.001f, b = 0.02, c = 1e-2;
int main(void)
{
return 0;
}
8/43
Stałe raz jeszcze
Stałe i słowo kluczowe const
Zamiast instrukcji #define preprocesora można do definiowania stałej użyć
słowa kluczowego const, np.:
const int SEVEN = 7;
int main(void)
{
return 0;
}
Taki zapis oznacza, że wartośćsevennie zmieni się w czasie wykonania pro-
gramu1. Nazwy tak zdefiniowanych stałych, zgodnie z przyjętą konwencją,
piszemy wielkimi literami.
1
Są sposoby, aby zmienić wartość tej stałej, ale nie będą tu opisane.
9/43
Operatory
Operatory
Operatory, podobnie jak w matematyce służą do budowania wyrażeń, których
wartości mogą być zapisane przy pomocy instrukcji przypisania, która też
jest operatorem, do zmiennej określonego typu. W języku C dostępnych
jest kilka różnych kategorii operatorów. Nie wszystkie będą omówione na
tym wykładzie. Podobnie jak w matematyce w informatyce operatory mają
przypisaną kolejność w jakiej są wykonywane w wyrażeniach. Dodatkowo
w język C mają także cechę, nazwaną wiązaniem, która określa sposób ich
działania.
10/43
Operatory Operatory relacyjne
Operatory relacyjne
Ogólnie, operatory relacyjne służą do określania relacji zachodzących między
wartościami wyrażeń stojących po ich lewej i prawej stronie. Jeśli ta relacja
jest prawdziwa, to zwracają wartość 1, w przeciwnym przypadku 0.
Operatory Opis działania
==, != Operator porównania i operator  różne . Pierwszy daje w wy-
niku jeden, jeśli oba argumenty są takie same, drugi jeśli są
różne.
<, >, <=, >= operatory  mniejsze ,  większe ,  mniejsze lub równe ,  więk-
sze lub równe
11/43
Operatory Operatory arytmetyczne
Operatory arytmetyczne
Operatory Opis działania
++, -- Jednoargumentowe operatory inkrementacji i dekrementacji.
Mogą być stosowane zarówno przed, jaki i po argumencie
np. ++a; (preinkrementacja), a++ (postinkrementacja), --a;
(predekrementacja), a--; (postdekrementacja). Operatory te
zwracają wartość zmiennej. Operatory  post wiążą lewostron-
nie, a  pre prawostronnie.
+, - Operatory te mogą być dwuargumentowe, i wtedy oznacza-
jÄ… dodawanie i odejmowanie, lub jednoargumentowe. W tym
ostatnim przypadku operator - oznacza zmianÄ™ znaku warto-
ści zmiennej, a + nie ma żadnego efektu.
*, / Operatory mnożenia i dzielenia. Uwaga: Jeśli argumentami
operatora dzielenia są liczby (wyrażenia) całkowite, to i wy-
nik jest liczbą całkowitą, niezależnie od tego w jakiej zmiennej
go zapiszemy.
% Operator reszty z dzielenia (modulo). W języku c działa rów-
nież dla liczb ujemnych.
12/43
Operatory Operatory arytmetyczne
Operatory arytmetyczne
Przepełnienie
Należy pamiętać, że operacje arytmetyczne na liczbach całkowitych podle-
gają przepełnieniu, tzn. jeśli obliczona wartość wyrażenia przekracza zakres
zmiennej, w której wynik jest zapamiętywany, to zostanie on  ucięty .
unsigned char a = 255;
char b = -128;
int main(void)
{
a = a + 1; //Zmienna "a" ma wartość 0;
b = b - 1; //Zmienna "b" ma wartość 127.
return 0;
}
13/43
Operatory Operatory arytmetyczne
Operatory arytmetyczne
Operator modulo - objaśnienie
Operator reszty z dzielenia działa wyłącznie dla liczb całkowitych. Wynik
przez niego obliczony zawsze spełnia równanie (x/y)*y+(x%y)==x. Przy-
kłady poniżej pokazują jak on działa dla licz ujemnych.
5%-2 // Wyrażenie ma wartość 1.
-5%2 // Wyrażenie ma wartość -1.
-5%-2 // Wyrażenie ma wartość -1.
Podobnie jak w zwykłym dzieleniu, dzielnik nie może być liczbą ujemną.
14/43
Operatory Operatory arytmetyczne
Operatory arytmetyczne
Operator dzielenia - objaśnienie
Poniżej podano przykłady wyrażeń, dla których otrzymane wyniki są różne,
choć z punktu widzenia matematyki zapisy wyrażeń są takie same. Należy
pamiętać, że kompilatory języka C traktują liczby bez kropki dziesiętnej jako
liczby całkowite.
double a;
int main(void)
{
a = 4/5; // Wynik wyrażenia to 0.
a = 4.0/5; // Wynik wyrażenia to 0.8.
return 0;
}
15/43
Operatory Operatory arytmetyczne
Operatory arytmetyczne
Skrócony zapis
Zapis wyrażenia arytmetycznego można skrócić, jeśli występuje w nim ta
sama zmienna, do której przypisywany jest wynik.
int a=2, b=2;
int main(void)
{
b+=a; // Zamiast b=b+a;
b-=a; // Zamiast b=b-a;
b*=a; // Zamiast b=b*a;
b/=a; // Zamiast b=b/a;
b%=a; // Zamiast b=b%a;
return 0;
}
16/43
Operatory Operatory arytmetyczne
Operatory arytmetyczne
Objaśnienie działania operatorów inkrementacji i dekrementacji
int a = 4, b;
int main(void)
{
b=++a; //Po wykonaniu: zmienna b ma wartość 5, zmienna a ma wartość 5.
a=4;
b=a++; //Po wykonaniu: zmienna b ma wartość 4, zmienna a ma wartość 5.
a=4;
b=--a; //Po wykonaniu: zmienna b ma wartość 3, zmienna a ma wartość 3.
a=4;
b=a--; //Po wykonaniu: zmienna b ma wartość 4, zmienna a ma wartość 3.
a=4;
a++; //Po wykonaniu: zmienna a ma wartość 5.
a=4;
++a; //Po wykonaniu: zmienna a ma wartość 5.
a=4;
a--; //Po wykonaniu: zmienna a ma wartość 3.
a=4;
--a; //Po wykonaniu: zmienna a ma wartość 3.
return 0;
}
17/43
Operatory Operatory logiczne
Operatory logiczne
Operatory logiczne są używane do budowania wyrażeń, których wartość jest
określana jako prawda lub fałsz. W języku C dostępne są następujące ope-
ratory należące do tej kategorii:
Operatory Opis działania
||, && Dwuargumentowe operatory sumy logicznej (or) i iloczy-
nu logicznego (and).
! Jednoargumentowy operator negacji logicznej.
Operatory te zwracają wartości 1 (prawda) i 0 (fałsz), ale należy pamiętać,
że w języku C każde wyrażenie, którego wartość jest różna od zera jest
prawdziwe, a wyrażenia o wartości zero są fałszywe. Operator&&zwraca
w wyniku prawdę, jeśli oba jego argumenty są prawdziwe, w przeciwnym
przypadku daje fałsz. Operator || zwraca w wyniku fałsz, gdy oba jego
argumenty są fałszywe, w przeciwnym przypadku zwraca prawdę.
18/43
Operatory Operatory logiczne
Operatory logiczne
Skracanie obliczeń
W złożonych wyrażeniach z użyciem operatorów && i || stosowana jest
technika skracania obliczeń (ang. short circuit evaluation). W przypadku
operatora && oznacza ona, że jeśli jego pierwszy argument jest fałszywy, to
wartość drugiego nie jest wyznaczana, od razu wiadomo, że całe wyrażenie
musi być fałszywe. Podobnie dla || - jeśli pierwszy argument jest praw-
dziwy, to nie wylicza się wartości drugiego - wiadomo, że wyrażenie jest
prawdziwe.
int a,b;
int main(void)
{
(a=0)&&(b=4); //Obie zmienne mają wartość 0 po wykonaniu wyrażenia.
(a=4)&&(b=3); //Po wykonaniu wyrażenia zmienna a ma wartość 4, a zmienna b wartość 3.
(a=0)||(b=0); //Obie zmienne mają wartość 0 po wykonaniu wyrażenia.
(a=3)||(b=4); //Po wykonaniu wyrażenia zmienna a ma wartość 3, a zmienna b wartość 0.
return 0;
}
19/43
Operatory Operatory bitowe
Operatory bitowe
Operatory te są podobne do operatorów logicznych, ale działają na poszcze-
gólnych bitach wartości zapisanych w zmiennych całkowitoliczbowych. Nie
mogą być stosowane ze zmiennymi zmiennoprzecinkowymi. Podobnie jak
w przypadku operatorów arytmetycznych można dla nich stosować zapis
skrócony.
Operatory Opis działania
|, &, Ć Operatory sumy bitowej (or), iloczynu bitowego (and)
oraz bitowej różnicy symetrycznej (xor).
~ Jednoargumentowy operator negacji bitowej.
>>, << Operatory przesunięcia bitowego w prawo i w lewo. Uwa-
ga: W języku C operatory te działają także dla liczb
ujemnych, w szczególności przesunięcie w prawo liczby
ujemnej daje w wyniku liczbÄ™ ujemnÄ… - najstarszy bit uzu-
pełniany jest jedynką, zgodnie z kodem U2.
20/43
Operatory Operatory bitowe
Operator &
Ilustracja działania
Operator bitowy & - przykład
5 & 3 = 00000101 & 00000011 =
Działanie operatora iloczynu bitowego &, tak jak wszystkich dwuargumento-
wych operatorów bitowych, polega na przeprowadzaniu operacji na parach
bitów jego argumentów. W przypadku iloczynu to działanie można opisać
następująco: jeśli oba bity w parze są równe 1, to bit na tej samej pozy-
cji w wyniku otrzymuje wartość 1, w przeciwnym przypadku nadawana mu
jest wartość 0. Jeżeli ten operator używany jest celem zbadania wartości po-
szczególnych bitów w zmiennej to takie działanie nazywa się maskowaniem.
Jednym z argumentów w tym działaniu jest stała nazywana maską.
21/43
Operatory Operatory bitowe
Operator &
Ilustracja działania
Operator bitowy & - przykład
5 & 3 = 00000101 & 00000011 = 0
Działanie operatora iloczynu bitowego &, tak jak wszystkich dwuargumento-
wych operatorów bitowych, polega na przeprowadzaniu operacji na parach
bitów jego argumentów. W przypadku iloczynu to działanie można opisać
następująco: jeśli oba bity w parze są równe 1, to bit na tej samej pozy-
cji w wyniku otrzymuje wartość 1, w przeciwnym przypadku nadawana mu
jest wartość 0. Jeżeli ten operator używany jest celem zbadania wartości po-
szczególnych bitów w zmiennej to takie działanie nazywa się maskowaniem.
Jednym z argumentów w tym działaniu jest stała nazywana maską.
21/43
Operatory Operatory bitowe
Operator &
Ilustracja działania
Operator bitowy & - przykład
5 & 3 = 00000101 & 00000011 = 00
Działanie operatora iloczynu bitowego &, tak jak wszystkich dwuargumento-
wych operatorów bitowych, polega na przeprowadzaniu operacji na parach
bitów jego argumentów. W przypadku iloczynu to działanie można opisać
następująco: jeśli oba bity w parze są równe 1, to bit na tej samej pozy-
cji w wyniku otrzymuje wartość 1, w przeciwnym przypadku nadawana mu
jest wartość 0. Jeżeli ten operator używany jest celem zbadania wartości po-
szczególnych bitów w zmiennej to takie działanie nazywa się maskowaniem.
Jednym z argumentów w tym działaniu jest stała nazywana maską.
21/43
Operatory Operatory bitowe
Operator &
Ilustracja działania
Operator bitowy & - przykład
5 & 3 = 00000101 & 00000011 = 000
Działanie operatora iloczynu bitowego &, tak jak wszystkich dwuargumento-
wych operatorów bitowych, polega na przeprowadzaniu operacji na parach
bitów jego argumentów. W przypadku iloczynu to działanie można opisać
następująco: jeśli oba bity w parze są równe 1, to bit na tej samej pozy-
cji w wyniku otrzymuje wartość 1, w przeciwnym przypadku nadawana mu
jest wartość 0. Jeżeli ten operator używany jest celem zbadania wartości po-
szczególnych bitów w zmiennej to takie działanie nazywa się maskowaniem.
Jednym z argumentów w tym działaniu jest stała nazywana maską.
21/43
Operatory Operatory bitowe
Operator &
Ilustracja działania
Operator bitowy & - przykład
5 & 3 = 00000101 & 00000011 = 0000
Działanie operatora iloczynu bitowego &, tak jak wszystkich dwuargumento-
wych operatorów bitowych, polega na przeprowadzaniu operacji na parach
bitów jego argumentów. W przypadku iloczynu to działanie można opisać
następująco: jeśli oba bity w parze są równe 1, to bit na tej samej pozy-
cji w wyniku otrzymuje wartość 1, w przeciwnym przypadku nadawana mu
jest wartość 0. Jeżeli ten operator używany jest celem zbadania wartości po-
szczególnych bitów w zmiennej to takie działanie nazywa się maskowaniem.
Jednym z argumentów w tym działaniu jest stała nazywana maską.
21/43
Operatory Operatory bitowe
Operator &
Ilustracja działania
Operator bitowy & - przykład
5 & 3 = 00000101 & 00000011 = 00000
Działanie operatora iloczynu bitowego &, tak jak wszystkich dwuargumento-
wych operatorów bitowych, polega na przeprowadzaniu operacji na parach
bitów jego argumentów. W przypadku iloczynu to działanie można opisać
następująco: jeśli oba bity w parze są równe 1, to bit na tej samej pozy-
cji w wyniku otrzymuje wartość 1, w przeciwnym przypadku nadawana mu
jest wartość 0. Jeżeli ten operator używany jest celem zbadania wartości po-
szczególnych bitów w zmiennej to takie działanie nazywa się maskowaniem.
Jednym z argumentów w tym działaniu jest stała nazywana maską.
21/43
Operatory Operatory bitowe
Operator &
Ilustracja działania
Operator bitowy & - przykład
5 & 3 = 00000101 & 00000011 = 000000
Działanie operatora iloczynu bitowego &, tak jak wszystkich dwuargumento-
wych operatorów bitowych, polega na przeprowadzaniu operacji na parach
bitów jego argumentów. W przypadku iloczynu to działanie można opisać
następująco: jeśli oba bity w parze są równe 1, to bit na tej samej pozy-
cji w wyniku otrzymuje wartość 1, w przeciwnym przypadku nadawana mu
jest wartość 0. Jeżeli ten operator używany jest celem zbadania wartości po-
szczególnych bitów w zmiennej to takie działanie nazywa się maskowaniem.
Jednym z argumentów w tym działaniu jest stała nazywana maską.
21/43
Operatory Operatory bitowe
Operator &
Ilustracja działania
Operator bitowy & - przykład
5 & 3 = 00000101 & 00000011 = 0000000
Działanie operatora iloczynu bitowego &, tak jak wszystkich dwuargumento-
wych operatorów bitowych, polega na przeprowadzaniu operacji na parach
bitów jego argumentów. W przypadku iloczynu to działanie można opisać
następująco: jeśli oba bity w parze są równe 1, to bit na tej samej pozy-
cji w wyniku otrzymuje wartość 1, w przeciwnym przypadku nadawana mu
jest wartość 0. Jeżeli ten operator używany jest celem zbadania wartości po-
szczególnych bitów w zmiennej to takie działanie nazywa się maskowaniem.
Jednym z argumentów w tym działaniu jest stała nazywana maską.
21/43
Operatory Operatory bitowe
Operator &
Ilustracja działania
Operator bitowy & - przykład
5 & 3 = 00000101 & 00000011 = 00000001
Działanie operatora iloczynu bitowego &, tak jak wszystkich dwuargumento-
wych operatorów bitowych, polega na przeprowadzaniu operacji na parach
bitów jego argumentów. W przypadku iloczynu to działanie można opisać
następująco: jeśli oba bity w parze są równe 1, to bit na tej samej pozy-
cji w wyniku otrzymuje wartość 1, w przeciwnym przypadku nadawana mu
jest wartość 0. Jeżeli ten operator używany jest celem zbadania wartości po-
szczególnych bitów w zmiennej to takie działanie nazywa się maskowaniem.
Jednym z argumentów w tym działaniu jest stała nazywana maską.
21/43
Operatory Operatory bitowe
Operator &
Ilustracja działania
Operator bitowy & - przykład
5 & 3 = 00000101 & 00000011 = 00000001 = 1
Działanie operatora iloczynu bitowego &, tak jak wszystkich dwuargumento-
wych operatorów bitowych, polega na przeprowadzaniu operacji na parach
bitów jego argumentów. W przypadku iloczynu to działanie można opisać
następująco: jeśli oba bity w parze są równe 1, to bit na tej samej pozy-
cji w wyniku otrzymuje wartość 1, w przeciwnym przypadku nadawana mu
jest wartość 0. Jeżeli ten operator używany jest celem zbadania wartości po-
szczególnych bitów w zmiennej to takie działanie nazywa się maskowaniem.
Jednym z argumentów w tym działaniu jest stała nazywana maską.
21/43
Operatory Operatory bitowe
Operator |
Ilustracja działania
Operator bitowy | - przykład
5 | 3 = 00000101 | 00000011 =
Działanie operatora sumy bitowej | jest podobne do działania iloczynu bito-
wego, ale zasada wyznaczania wyniku jest trochę inna: jeśli oba bity w parze
bitów argumentów operatora mają wartość 0, to odpowiadający tej parze
bit w wyniku ma wartość 0, w przeciwnym przypadku 1.
22/43
Operatory Operatory bitowe
Operator |
Ilustracja działania
Operator bitowy | - przykład
5 | 3 = 00000101 | 00000011 = 0
Działanie operatora sumy bitowej | jest podobne do działania iloczynu bito-
wego, ale zasada wyznaczania wyniku jest trochę inna: jeśli oba bity w parze
bitów argumentów operatora mają wartość 0, to odpowiadający tej parze
bit w wyniku ma wartość 0, w przeciwnym przypadku 1.
22/43
Operatory Operatory bitowe
Operator |
Ilustracja działania
Operator bitowy | - przykład
5 | 3 = 00000101 | 00000011 = 00
Działanie operatora sumy bitowej | jest podobne do działania iloczynu bito-
wego, ale zasada wyznaczania wyniku jest trochę inna: jeśli oba bity w parze
bitów argumentów operatora mają wartość 0, to odpowiadający tej parze
bit w wyniku ma wartość 0, w przeciwnym przypadku 1.
22/43
Operatory Operatory bitowe
Operator |
Ilustracja działania
Operator bitowy | - przykład
5 | 3 = 00000101 | 00000011 = 000
Działanie operatora sumy bitowej | jest podobne do działania iloczynu bito-
wego, ale zasada wyznaczania wyniku jest trochę inna: jeśli oba bity w parze
bitów argumentów operatora mają wartość 0, to odpowiadający tej parze
bit w wyniku ma wartość 0, w przeciwnym przypadku 1.
22/43
Operatory Operatory bitowe
Operator |
Ilustracja działania
Operator bitowy | - przykład
5 | 3 = 00000101 | 00000011 = 0000
Działanie operatora sumy bitowej | jest podobne do działania iloczynu bito-
wego, ale zasada wyznaczania wyniku jest trochę inna: jeśli oba bity w parze
bitów argumentów operatora mają wartość 0, to odpowiadający tej parze
bit w wyniku ma wartość 0, w przeciwnym przypadku 1.
22/43
Operatory Operatory bitowe
Operator |
Ilustracja działania
Operator bitowy | - przykład
5 | 3 = 00000101 | 00000011 = 00000
Działanie operatora sumy bitowej | jest podobne do działania iloczynu bito-
wego, ale zasada wyznaczania wyniku jest trochę inna: jeśli oba bity w parze
bitów argumentów operatora mają wartość 0, to odpowiadający tej parze
bit w wyniku ma wartość 0, w przeciwnym przypadku 1.
22/43
Operatory Operatory bitowe
Operator |
Ilustracja działania
Operator bitowy | - przykład
5 | 3 = 00000101 | 00000011 = 000001
Działanie operatora sumy bitowej | jest podobne do działania iloczynu bito-
wego, ale zasada wyznaczania wyniku jest trochę inna: jeśli oba bity w parze
bitów argumentów operatora mają wartość 0, to odpowiadający tej parze
bit w wyniku ma wartość 0, w przeciwnym przypadku 1.
22/43
Operatory Operatory bitowe
Operator |
Ilustracja działania
Operator bitowy | - przykład
5 | 3 = 00000101 | 00000011 = 0000011
Działanie operatora sumy bitowej | jest podobne do działania iloczynu bito-
wego, ale zasada wyznaczania wyniku jest trochę inna: jeśli oba bity w parze
bitów argumentów operatora mają wartość 0, to odpowiadający tej parze
bit w wyniku ma wartość 0, w przeciwnym przypadku 1.
22/43
Operatory Operatory bitowe
Operator |
Ilustracja działania
Operator bitowy | - przykład
5 | 3 = 00000101 | 00000011 = 00000111
Działanie operatora sumy bitowej | jest podobne do działania iloczynu bito-
wego, ale zasada wyznaczania wyniku jest trochę inna: jeśli oba bity w parze
bitów argumentów operatora mają wartość 0, to odpowiadający tej parze
bit w wyniku ma wartość 0, w przeciwnym przypadku 1.
22/43
Operatory Operatory bitowe
Operator |
Ilustracja działania
Operator bitowy | - przykład
5 | 3 = 00000101 | 00000011 = 00000111 = 7
Działanie operatora sumy bitowej | jest podobne do działania iloczynu bito-
wego, ale zasada wyznaczania wyniku jest trochę inna: jeśli oba bity w parze
bitów argumentów operatora mają wartość 0, to odpowiadający tej parze
bit w wyniku ma wartość 0, w przeciwnym przypadku 1.
22/43
Operatory Operatory bitowe
Operator ^
Ilustracja działania
Operator bitowy Ć - przykład
5 Ć 3 = 00000101 Ć 00000011 =
Bitowa różnica symetryczna Ć działa tak samo jak pozostałe dwuargumen-
towe operatory, ale również różni się zasadą obliczania wyniku:jeśli oba bity
w parze bitów argumentów operatora mają różne wartości, to odpowiadający
parze bit wyniku otrzymuje wartość 0, a w przeciwnym przypadku 1.
23/43
Operatory Operatory bitowe
Operator ^
Ilustracja działania
Operator bitowy Ć - przykład
5 Ć 3 = 00000101 Ć 00000011 = 0
Bitowa różnica symetryczna Ć działa tak samo jak pozostałe dwuargumen-
towe operatory, ale również różni się zasadą obliczania wyniku:jeśli oba bity
w parze bitów argumentów operatora mają różne wartości, to odpowiadający
parze bit wyniku otrzymuje wartość 0, a w przeciwnym przypadku 1.
23/43
Operatory Operatory bitowe
Operator ^
Ilustracja działania
Operator bitowy Ć - przykład
5 Ć 3 = 00000101 Ć 00000011 = 00
Bitowa różnica symetryczna Ć działa tak samo jak pozostałe dwuargumen-
towe operatory, ale również różni się zasadą obliczania wyniku:jeśli oba bity
w parze bitów argumentów operatora mają różne wartości, to odpowiadający
parze bit wyniku otrzymuje wartość 0, a w przeciwnym przypadku 1.
23/43
Operatory Operatory bitowe
Operator ^
Ilustracja działania
Operator bitowy Ć - przykład
5 Ć 3 = 00000101 Ć 00000011 = 000
Bitowa różnica symetryczna Ć działa tak samo jak pozostałe dwuargumen-
towe operatory, ale również różni się zasadą obliczania wyniku:jeśli oba bity
w parze bitów argumentów operatora mają różne wartości, to odpowiadający
parze bit wyniku otrzymuje wartość 0, a w przeciwnym przypadku 1.
23/43
Operatory Operatory bitowe
Operator ^
Ilustracja działania
Operator bitowy Ć - przykład
5 Ć 3 = 00000101 Ć 00000011 = 0000
Bitowa różnica symetryczna Ć działa tak samo jak pozostałe dwuargumen-
towe operatory, ale również różni się zasadą obliczania wyniku:jeśli oba bity
w parze bitów argumentów operatora mają różne wartości, to odpowiadający
parze bit wyniku otrzymuje wartość 0, a w przeciwnym przypadku 1.
23/43
Operatory Operatory bitowe
Operator ^
Ilustracja działania
Operator bitowy Ć - przykład
5 Ć 3 = 00000101 Ć 00000011 = 00000
Bitowa różnica symetryczna Ć działa tak samo jak pozostałe dwuargumen-
towe operatory, ale również różni się zasadą obliczania wyniku:jeśli oba bity
w parze bitów argumentów operatora mają różne wartości, to odpowiadający
parze bit wyniku otrzymuje wartość 0, a w przeciwnym przypadku 1.
23/43
Operatory Operatory bitowe
Operator ^
Ilustracja działania
Operator bitowy Ć - przykład
5 Ć 3 = 00000101 Ć 00000011 = 000001
Bitowa różnica symetryczna Ć działa tak samo jak pozostałe dwuargumen-
towe operatory, ale również różni się zasadą obliczania wyniku:jeśli oba bity
w parze bitów argumentów operatora mają różne wartości, to odpowiadający
parze bit wyniku otrzymuje wartość 0, a w przeciwnym przypadku 1.
23/43
Operatory Operatory bitowe
Operator ^
Ilustracja działania
Operator bitowy Ć - przykład
5 Ć 3 = 00000101 Ć 00000011 = 0000011
Bitowa różnica symetryczna Ć działa tak samo jak pozostałe dwuargumen-
towe operatory, ale również różni się zasadą obliczania wyniku:jeśli oba bity
w parze bitów argumentów operatora mają różne wartości, to odpowiadający
parze bit wyniku otrzymuje wartość 0, a w przeciwnym przypadku 1.
23/43
Operatory Operatory bitowe
Operator ^
Ilustracja działania
Operator bitowy Ć - przykład
5 Ć 3 = 00000101 Ć 00000011 = 00000110
Bitowa różnica symetryczna Ć działa tak samo jak pozostałe dwuargumen-
towe operatory, ale również różni się zasadą obliczania wyniku:jeśli oba bity
w parze bitów argumentów operatora mają różne wartości, to odpowiadający
parze bit wyniku otrzymuje wartość 0, a w przeciwnym przypadku 1.
23/43
Operatory Operatory bitowe
Operator ^
Ilustracja działania
Operator bitowy Ć - przykład
5 Ć 3 = 00000101 Ć 00000011 = 00000110 = 6
Bitowa różnica symetryczna Ć działa tak samo jak pozostałe dwuargumen-
towe operatory, ale również różni się zasadą obliczania wyniku:jeśli oba bity
w parze bitów argumentów operatora mają różne wartości, to odpowiadający
parze bit wyniku otrzymuje wartość 0, a w przeciwnym przypadku 1.
23/43
Operatory Operatory bitowe
Operator Ü
Ilustracja działania
Operator bitowy Ü - przykÅ‚ad
Ü 5 = Ü 00000101 =
Ten operator jest jednoargumentowy. Jego działanie polega na zmianie war-
tości bitów argumentu na przeciwne.
24/43
Operatory Operatory bitowe
Operator Ü
Ilustracja działania
Operator bitowy Ü - przykÅ‚ad
Ü 5 = Ü 00000101 = 1
Ten operator jest jednoargumentowy. Jego działanie polega na zmianie war-
tości bitów argumentu na przeciwne.
24/43
Operatory Operatory bitowe
Operator Ü
Ilustracja działania
Operator bitowy Ü - przykÅ‚ad
Ü 5 = Ü 00000101 = 11
Ten operator jest jednoargumentowy. Jego działanie polega na zmianie war-
tości bitów argumentu na przeciwne.
24/43
Operatory Operatory bitowe
Operator Ü
Ilustracja działania
Operator bitowy Ü - przykÅ‚ad
Ü 5 = Ü 00000101 = 111
Ten operator jest jednoargumentowy. Jego działanie polega na zmianie war-
tości bitów argumentu na przeciwne.
24/43
Operatory Operatory bitowe
Operator Ü
Ilustracja działania
Operator bitowy Ü - przykÅ‚ad
Ü 5 = Ü 00000101 = 1111
Ten operator jest jednoargumentowy. Jego działanie polega na zmianie war-
tości bitów argumentu na przeciwne.
24/43
Operatory Operatory bitowe
Operator Ü
Ilustracja działania
Operator bitowy Ü - przykÅ‚ad
Ü 5 = Ü 00000101 = 11111
Ten operator jest jednoargumentowy. Jego działanie polega na zmianie war-
tości bitów argumentu na przeciwne.
24/43
Operatory Operatory bitowe
Operator Ü
Ilustracja działania
Operator bitowy Ü - przykÅ‚ad
Ü 5 = Ü 00000101 = 111110
Ten operator jest jednoargumentowy. Jego działanie polega na zmianie war-
tości bitów argumentu na przeciwne.
24/43
Operatory Operatory bitowe
Operator Ü
Ilustracja działania
Operator bitowy Ü - przykÅ‚ad
Ü 5 = Ü 00000101 = 1111101
Ten operator jest jednoargumentowy. Jego działanie polega na zmianie war-
tości bitów argumentu na przeciwne.
24/43
Operatory Operatory bitowe
Operator Ü
Ilustracja działania
Operator bitowy Ü - przykÅ‚ad
Ü 5 = Ü 00000101 = 11111010
Ten operator jest jednoargumentowy. Jego działanie polega na zmianie war-
tości bitów argumentu na przeciwne.
24/43
Operatory Operatory bitowe
Operator Ü
Ilustracja działania
Operator bitowy Ü - przykÅ‚ad
Ü 5 = Ü 00000101 = 11111010 = 250
Ten operator jest jednoargumentowy. Jego działanie polega na zmianie war-
tości bitów argumentu na przeciwne.
24/43
Operatory Operatory bitowe
Operator <<
Ilustracja działania
Operator << - przykład
5 << 2 = 00000101 << 2 = 000010100 = 20
Operator << jest nazywany operatorem bitowego przesunięcia w lewo. Jego
działanie polega na przesunięciu bitów w słowie bitowym (bajcie, dwóch
bajtach itd.) w lewo o zadaną liczbę pozycji i odpowiada ono pomnożeniu
lewego argumentu przez potęgę dwójki, tj. jeśli przesuwamy lewy argument
o np. cztery miejsca, to mnożymy go przez 24. Bity z lewej strony, które
 nie mieszczą się w słowie są  zapominane , a bity z prawej są uzupełniane
zerami.
25/43
Operatory Operatory bitowe
Operator >>
Ilustracja działania
Operator >> - przykład
5 >> 2 = 00000101 >> 2 = 000000001 = 1
Operator >> jest nazywany operatorem bitowego przesunięcia w prawo. Je-
go działanie polega na przesunięciu bitów w słowie bitowym (bajcie, dwóch
bajtach itd.) w prawo o zadanÄ… liczbÄ™ pozycji i odpowiada ono podzieleniu
bez reszty lewego argumentu przez potęgę dwójki, tj. jeśli przesuwamy le-
wy argument o np. cztery miejsca, to dzielimy go bez reszty przez 24. Bity
z prawej strony, które  nie mieszczą się w słowie są  zapominane , a bity
z lewej są uzupełniane zależnie od początkowej wartości najstarszego (skraj-
nie lewego) bitu. Jeśli przed rozpoczęciem operacji miał on wartość 1, to
uzupełniane są jedynkami, w przeciwnym przypadku zerami.
26/43
Operatory Operatory bitowe
Operatory bitowe
Podsumowanie
Ponieważ w zapisie niektóre operatory bitowe są podobne do operatorów lo-
gicznych, to warto zapamiętać regułę, którą wymyślił Bruce Eckel, aby wie-
dzieć jak je odróżniać:  Bity są małe, więc do zapisu operatorów bitowych
używany jest tylko jeden znak . W przypadku dwuarumentowych operato-
rów bitowych można stosować skrócony zapis, analogicznie jak w przypadku
dwuargumentowych operatorów arytmetycznych.
27/43
Operatory Operator trójargumentowy
Operator trójargumentowy
Operator trójargumentowy ma działanie podobne do instrukcji warunkowej,
która będzie omawiana na następnym wykładzie, ale dodatkowo zwraca, tak
jak pozostałe operatory wartość. W można go opisać następującym wzorcem
zmienna=warunek?pierwsze_wyrażenie:drugie_wyrażenie;
Jeśli warunek jest spełniony, to operator zwróci wartość wyrażenia za pytajni-
kiem, natomiast jeśli fałszywy, to zwróci wartość wyrażenia za dwukropkiem.
Instrukcja przypisania może być pominięta i wówczas zwrócona wartość jest
tracona. Tak możemy postąpić, jeśli zależy nam wyłącznie na wykonaniu
jednego z wyrażeń. Jeśli operator przypisania jest jednak użyty, to zmienna
stojąca po jego lewej stronie otrzymuje wartość zwróconą przez operator.
int a=5, b=3, max;
int main(void)
{
max=(a>b)?a:b;
return 0;
}
28/43
Operatory Rzutowanie
Rzutowanie
Rzutowanie służy do zamiany bieżącego typu wartości na inny typ. Może ono
być wykonywane niejawnie (przez kompilator, bez ingerencji programisty) lub
jawny (jest nakazane przez programistę). Przykład konwersji niejawnej:
int a;
int main(void)
{
a=12.3;
return 0;
}
W tym przypadku pierwotny typ liczby 12.3, czyli double zostanie zamie-
niony na int, przy czym część ułamkowa zostanie utracona. Z taką utratą
informacji należy zawsze się liczyć przy konwertowaniu typu bardziej pojem-
nego na mniej pojemny. W drugÄ… stronÄ™ to zjawisko nie zachodzi.
29/43
Operatory Rzutowanie
Rzutowanie
Jawna konwersja
W niektórych sytuacjach trzeba wprost określić w programie, że ma być
wykonana konwersja. Można to wykonać używając operatora rzutowania,
czyli umieszczając przed wartością, zmienną lub wyrażaniem nazwę typu
docelowego w nawiasach okrągłych.
double a;
int x = 4, y = 3;
int main(void)
{
a=(double)x/y;
return 0;
}
W zamieszczonym przykładzie konwersji uległa wartość zmiennej x, dzięki
temu uzyskany wynik jest prawidłowy, a nie zaokrąglony w dół do najbliższej
zmiennej całkowitej.
30/43
Operatory Inne operatory
Operator wyłuskania adresu
Operator wyłuskania adresu jest zapisywany przy pomocy pojedynczego zna-
ku &, tak samo jak operator iloczynu bitowego. Kompilator rozróżnia te ope-
ratory na podstawie kontekstu ich użycia. Operator wyłuskania jest jedno-
argumentowy, a iloczynu bitowego dwuargumentowy. Operator wyłuskania
zwraca adres w pamięci zmiennej, przed którą stoi. Taka informacja potrzeb-
na jest między innymi funkcji scanf() używanej do wprowadzania danych
z klawiatury.
31/43
Operatory Inne operatory
Operator sizeof
Operator sizeof zwraca rozmiar zmiennej przed którą stoi. Zmienna ta mo-
że być umieszczona w nawiasach okrągłych (preferowany zapis), ale nie jest
to wymagane. Zamiast zmiennej można użyć także bezpośrednio identyfika-
tora typu.
long unsigned int a,b,c;
int main(void)
{
a=sizeof b;
a=sizeof(c);
return 0;
}
32/43
Operatory Kolejność działań
Kolejność działań
Kolejność wykonywania działań w wyrażeniach zapisanych w programie na-
pisanym w języku C określona jest przez ustalone priorytety operatorów.
Można ją zmieniać za pomocą nawiasów okrągłych. Kolejność wykonywania
omówionych na tym wykładzie operatorów jest następująca: najpierw ope-
ratory inkrementacji i dekrementacji w wersji  post , potem wszystkie jed-
noargumentowe (wliczając w to sizeof i rzutowanie), następnie operatory
arytmetyczne, przy czym mnożenie dzielenie i wyznaczanie reszty z dzielenia
ma pierwszeństwo przez dodawaniem i odejmowaniem. Niższy priorytet mają
oba operatory przesunięcia bitowego, następnie relacyjne, przy czym opera-
tory  większe ,  większe lub równe ,  mniejsze ,  mniejsze lub równe są
wykonywane przed operatorami  równe i  różne . Następnie, kolejno wyko-
nywane są operatory bitowe&, Ći|, a potem logiczne w tej samej kolejności
(za wyjątkiem różnicy symetrycznej, która nie istnieje. Na końcu wykonywa-
ny jest operator trójargumentowy i operator przypisania wraz z skróconą
formą zapisu wcześniej wymienionych operatorów dwuargumentowych.
33/43
Podstawowe wejście i wyjście
Podstawowe operacje wejścia i wyjścia
W tej części wykładu zostaną omówione funkcjescanf()iprintf()z pliku
nagłówkowego stdio.h, które służą do, odpowiednio, wprowadzania z kla-
wiatury wartości do zmiennej i wypisywania wartości ze zmiennych na ekran.
Są również inne funkcje umożliwiające komunikację z użytkownikiem i będą
one omawiane na pozostałych wykładach.
34/43
Podstawowe wejście i wyjście
Funkcja scanf()
Funkcja scanf() pozwala użytkownikowi wprowadzić wartość z klawiatury,
którą zapisuje we wskazanej zmiennej.
#include
int a;
int main(void)
{
scanf("%d",&a);
return 0;
}
Funkcja ta przyjmuje co najmniej dwa argumenty rozdzielone przecinkiem.
Pierwszy to tzw. ciąg formatujący, umieszczony w cudzysłowie i rozpoczy-
nający się znakiem %. Określa on spodziewany typu danej wprowadzanej
przez użytkownika z klawiatury. Drugi to adres zmiennej, w której ta dana
ma być zapisana.
35/43
Podstawowe wejście i wyjście
Funkcja scanf()
Najważniejsze ciągi formatujące
Poniższa tabela zawiera przykłady ciągów formatujących dla większości omó-
wionych wcześniej typów danych.
CiÄ…g formatujÄ…cy Opis
%d Liczba całkowita typu int.
%ld Liczba całkowita typu long int.
%u Liczba naturalna typu unsigned int.
%lu Liczba naturalna typu unsigned long int.
%c Znak.
%f Liczba zmiennoprzecinkowa typu float.
%lf Liczba zmiennoprzecinkowa typu double.
36/43
Podstawowe wejście i wyjście
Funkcja scanf()
Wczytywanie pojedynczych znaków
Stosując funkcjęscanf()aby odczytać kilkukrotnie pojedyncze znaki należy
pamiętać, że klawisz Enter również pozostawia znak, który może zostać
przeczytany przez kolejne wywołanie tej funkcji. Aby tego uniknąć należy
użyć tej funkcji tak jak to podano w niżej zamieszczonym przykładzie.
char a,b;
int main(void)
{
scanf("%c",&a);
scanf(" %c",&b);
return 0;
}
Rozwiązanie polega na dodaniu spacji między znakami", a%w drugim ciągu
formatujÄ…cym.
37/43
Podstawowe wejście i wyjście
Funkcja printf()
Funkcja printf() jest podobna w działaniu do funkcji puts() pod tym
względem, że wypisuje umieszczony w cudzysłowie ciąg znaków na ekran.
Jednakże ta funkcja nie przenosi kursora do nowego wiersza na ekranie. Po-
nadto w przeciwieństwie do puts() potrafi on wypisywać na ekran wartości
zmiennych i wyrażeń. Aby to wykonać programista musi umieścić w ciągu wy-
pisywanych znaków ciąg formatujący podobny do tego dla funkcji scanf(),
a za głównym ciągiem, po przecinku, zmienną lub wyrażenie, którego wartość
chce przekazać użytkownikowi programu. Funkcja printf() może wypisać
kilka zmiennych różnych typów za pomocą jednego wywołania. Wystarczy
tylko umieścić odpowiednią liczbę ciągów formatujących odpowiedniego ty-
pu, oraz w odpowiedniej kolejności rozdzielone przecinkami zmienne, które
mają być wypisane.
38/43
Podstawowe wejście i wyjście
Funkcja printf()
Przykład
#include
int a,b;
int main(void)
{
puts("Podaj liczbę całkowitą");
scanf("%d",&a);
puts("Podaj drugą liczbę całkowitą");
scanf("%d",&b);
printf("%d & %d = %d\n",a,b,a&b);
return 0;
}
39/43
Podstawowe wejście i wyjście
Funkcja printf()
CiÄ…gi formatujÄ…ce
CiÄ…g formatujÄ…cy Opis
%d Liczba całkowita typu int.
%ld Liczba całkowita typu long int.
%u Liczba naturalna typu unsigned int.
%c Znak.
%f Liczba zmiennoprzecinkowa typu float. Może zawierać dodatkowe
informacje o formatowaniu np. %.3f - wartość będzie wypisana z do-
kładnością do trzech miejsc po przecinku.
%lf Liczba zmiennoprzecinkowa typu double. Podobnie jak wyżej, może
zawierać dodatkowe informacje o formatowaniu.
%e, %E Liczba zmiennoprzecinkowa typu float w notacji wykładniczej, np.
3e-9, jeśli użyte jest pierwsze formatowanie, lub 3E-9 , jeśli drugie.
%le, %lE Liczba zmiennoprzecinkowa typu double w notacji wykładniczej, np.
3e-9, jeśli użyte jest pierwsze formatowanie, lub 3E-9 , jeśli drugie.
%x, %X Liczba naturalna zapisana w kodzie szesnastkowym, np.a5, jeśli użyte
jest pierwsze formatowanie, lub A5, jeśli użyte jest drugie formato-
wanie.
%o Liczba naturalna w kodzie ósemkowym.
40/43
Podstawowe wejście i wyjście
Funkcja printf()
Znaki specjalne
Aby umieścić kursor na ekranie w następnym wierszu lub wypisać znak tabu-
latora należy użyć specjalnych znaków, które składają się ze znaku ukośnika
(ang. slash) i innego znaku. Tabela poniżej zawiera opis niektórych z nich.
Znak sterujÄ…cy Opis
\n Znak nowego wiersza.
\r Znak poczÄ…tku wiersza.
\\ Znak \ (wypisanie na ekranie).
\" Znak ".
\t Tabulator
41/43
Podstawowe wejście i wyjście
Podziękowania
Składam podziękowania dla dra inż. Grzegorza Aukawskiego i mgra inż.
Leszka Ciopińskiego za udostępnienie materiałów, których fragmenty zostały
wykorzystane w tym wykładzie.
42/43
Podstawowe wejście i wyjście
koniec
Dziękuję Państwu za uwagę!
43/43


Wyszukiwarka

Podobne podstrony:
PP1 lecture 4
PP1 lecture 5
PP1 lecture 8
PP1 lecture 6
PP1 lecture
PP1 lecture 7
PP1 lecture 9
Lecture4 Med Women Monsters Film
lecture 2
Bezhanshivili Lattices and Topology (Lecture Presentation)
wfhss conf20070503 lecture29 en
Feynman Lectures on Physics Volume 1 Chapter
Syntax lecture3
Lecture POLAND Competitiv2008
Telecommunication Systems and Networks 2011 2012 Lecture 6
PP1 laboratorium 7
CJ Lecture 6

więcej podobnych podstron