Vous êtes sur la page 1sur 27

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

Jzyk C. Wprowadzenie
do programowania
Autor: Stephan G. Kochan
Tumaczenie: Tomasz mijewski
ISBN: 83-7361-754-X
Tytu oryginau: Programming in C. A complete
introduction to the C programming language
Format: B5, stron: 504

TWJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK

CZYTELNIA
FRAGMENTY KSIEK ONLINE

Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl

Jzyk programowania C zosta stworzony przez Dennisa Ritchieego w laboratoriach


AT&T Bell na pocztku lat 70. XX wieku. Jednak dopiero pod koniec lat 70. zosta
spopularyzowany i uzyska powszechne uznanie. W 1990 roku opublikowana zostaa
pierwsza oficjalna wersja standardu ANSI C. Najnowszy standard, znany jako ANSI C99
i ISO/IEC 9899:1999, zosta opublikowany w 1999 roku.
Jzyk C jest obecnie jednym z najpopularniejszych jzykw programowania na wiecie.
Dziki swoim moliwociom pozwala na stworzenie niemal kadego rodzaju aplikacji.
Posiada prost skadni i niewielki zbir sw kluczowych, co czyni go stosunkowo
atwym do opanowania. Jednake dziki temu, e powsta jako jzyk programowania
wykorzystywany do tworzenia systemw operacyjnych, cechuje go ogromna
elastyczno i wydajno.
Ksika Jzyk C. Wprowadzenie do programowania to podrcznik przeznaczony
dla osb, ktre chc pozna jzyk C i nie maj adnego dowiadczenia w pracy z nim.
Opisuje wszystkie elementy jzyka C zilustrowane krtkimi przykadowymi programami.
Przedstawia nie tylko zasady tworzenia programw w C, ale cay proces ich pisania,
kompilowania i uruchamiania.
Jzyki programowania wysokiego poziomu
Zmienne, stae i typy danych
Ptle i wyraenia warunkowe
Definiowanie i stosowanie funkcji
Wskaniki i struktury
Operacje na bitach
Sterowanie kompilacj za pomoc preprocesora
Obsuga operacji wejcia i wyjcia
Usuwanie bdw z programw
Podstawowe zasady programowania obiektowego
Jeli chcesz pozna jzyk C, zacznij od tej ksiki. Znajdziesz w niej wszystko,
co musisz wiedzie o C.

Spis treci
O Autorze ........................................................................................ 13
Wstp ............................................................................................. 15
Rozdzia 1. Wprowadzenie ................................................................................. 17
Rozdzia 2. Podstawy ........................................................................................ 21
Programowanie................................................................................................................ 21
Jzyki wysokiego poziomu.............................................................................................. 22
Systemy operacyjne......................................................................................................... 22
Kompilowanie programw.............................................................................................. 23
Zintegrowane rodowiska programistyczne .................................................................... 25
Interpretery...................................................................................................................... 26

Rozdzia 3. Kompilujemy i uruchamiamy pierwszy program.................................. 27


Kompilujemy nasz program ............................................................................................ 27
Uruchamianie programu.................................................................................................. 28
Analiza naszego pierwszego programu ........................................................................... 29
Wywietlanie wartoci zmiennych .................................................................................. 30
Komentarze ..................................................................................................................... 33
wiczenia........................................................................................................................ 34

Rozdzia 4. Zmienne, typy danych i wyraenia arytmetyczne ............................... 37


Uycie zmiennych ........................................................................................................... 37
Typy danych i stae ......................................................................................................... 38
Podstawowy typ danych int....................................................................................... 39
Typ zmiennoprzecinkowy float................................................................................. 40
Rozszerzony typ double ............................................................................................ 41
Pojedyncze znaki, typ char........................................................................................ 41
Logiczny typ danych, _Bool ..................................................................................... 41
Okrelniki typu: long, long long, short, unsigned i signed ........................................ 43
Wyraenia arytmetyczne ................................................................................................. 46
Arytmetyka liczb cakowitych i jednoargumentowy operator minus ........................ 48
Operator modulo ....................................................................................................... 50
Konwersje midzy liczbami cakowitymi a zmiennoprzecinkowymi ....................... 51
czenie dziaa z przypisaniem..................................................................................... 53
Typy _Complex i _Imaginary ......................................................................................... 54
wiczenia........................................................................................................................ 54

Jzyk C. Wprowadzenie do programowania

Rozdzia 5. Ptle w programach......................................................................... 57


Instrukcja for ................................................................................................................... 58
Operatory porwnania............................................................................................... 59
Wyrwnywanie wynikw ......................................................................................... 63
Dane wejciowe dla programu .................................................................................. 64
Zagniedone ptle for.............................................................................................. 66
Odmiany ptli for ...................................................................................................... 67
Instrukcja while ............................................................................................................... 68
Instrukcja do.................................................................................................................... 72
Instrukcja break......................................................................................................... 74
Instrukcja continue .................................................................................................... 74
wiczenia........................................................................................................................ 75

Rozdzia 6. Podejmowanie decyzji ...................................................................... 77


Instrukcja if ..................................................................................................................... 77
Konstrukcja if-else .................................................................................................... 80
Zoone warunki porwnania.................................................................................... 83
Zagniedone instrukcje if ........................................................................................ 85
Konstrukcja else if .................................................................................................... 87
Instrukcja switch ............................................................................................................. 93
Zmienne logiczne ............................................................................................................ 96
Operator wyboru ........................................................................................................... 100
wiczenia...................................................................................................................... 101

Rozdzia 7. Tablice .......................................................................................... 103


Definiowanie tablicy ..................................................................................................... 103
Uycie tablic jako licznikw ................................................................................... 107
Generowanie cigu Fibonacciego ........................................................................... 110
Zastosowanie tablic do generowania liczb pierwszych ........................................... 111
Inicjalizowanie tablic .................................................................................................... 113
Tablice znakowe............................................................................................................ 114
Uycie tablic do zamiany podstawy liczb ............................................................... 115
Kwalifikator const................................................................................................... 117
Tablice wielowymiarowe .............................................................................................. 119
Tablice o zmiennej wielkoci ........................................................................................ 121
wiczenia...................................................................................................................... 123

Rozdzia 8. Funkcje ......................................................................................... 125


Definiowanie funkcji..................................................................................................... 125
Parametry i zmienne lokalne ......................................................................................... 128
Deklaracja prototypu funkcji................................................................................... 129
Automatyczne zmienne lokalne .............................................................................. 130
Zwracanie wynikw funkcji .......................................................................................... 131
Nic tylko wywoywanie i wywoywanie... ............................................................... 135
Deklarowanie zwracanych typw, typy argumentw.............................................. 138
Sprawdzanie parametrw funkcji............................................................................ 140
Programowanie z gry na d........................................................................................ 141
Funkcje i tablice ............................................................................................................ 142
Operatory przypisania ............................................................................................. 146
Sortowanie tablic..................................................................................................... 147
Tablice wielowymiarowe ........................................................................................ 150
Zmienne globalne.......................................................................................................... 154
Zmienne automatyczne i statyczne................................................................................ 158
Funkcje rekurencyjne .................................................................................................... 160
wiczenia...................................................................................................................... 163

Spis treci

Rozdzia 9. Struktury ....................................................................................... 167


Struktura na daty ........................................................................................................... 167
Uycie struktur w wyraeniach ............................................................................... 169
Funkcje i struktury ........................................................................................................ 172
Struktura na czas ..................................................................................................... 177
Inicjalizowanie struktur ................................................................................................. 180
Literay zoone....................................................................................................... 180
Tablice struktur ............................................................................................................. 181
Struktury zawierajce inne struktury ............................................................................. 184
Struktury zawierajce tablice ........................................................................................ 186
Wersje struktur .............................................................................................................. 189
wiczenia...................................................................................................................... 190

Rozdzia 10. acuchy znakowe......................................................................... 193


Tablice znakw ............................................................................................................. 194
acuchy znakowe zmiennej dugoci .......................................................................... 196
Inicjalizowanie i pokazywanie tablic znakowych ................................................... 198
Porwnywanie dwch acuchw znakowych ........................................................ 200
Wprowadzanie acuchw znakowych ................................................................... 202
Wczytanie pojedynczego znaku .............................................................................. 204
acuch pusty ......................................................................................................... 208
Cytowanie znakw ........................................................................................................ 211
Jeszcze o staych acuchach......................................................................................... 213
acuchy znakowe, struktury i tablice .......................................................................... 214
Lepsza metoda szukania.......................................................................................... 217
Operacje na znakach...................................................................................................... 221
wiczenia...................................................................................................................... 224

Rozdzia 11. Wskaniki...................................................................................... 227


Definiowanie zmiennej wskanikowej .......................................................................... 227
Wskaniki w wyraeniach............................................................................................. 231
Wskaniki i struktury .................................................................................................... 232
Struktury zawierajce wskaniki............................................................................. 234
Listy powizane ...................................................................................................... 236
Sowo kluczowe const a wskaniki ............................................................................... 243
Wskaniki i funkcje....................................................................................................... 244
Wskaniki i tablice ........................................................................................................ 249
Par sw o optymalizacji programu ....................................................................... 252
To tablica czy wskanik? ........................................................................................ 253
Wskaniki na acuchy znakowe ............................................................................ 254
Stae acuchy znakowe a wskaniki ...................................................................... 256
Jeszcze raz o inkrementacji i dekrementacji............................................................ 257
Operacje na wskanikach .............................................................................................. 260
Wskaniki na funkcje .................................................................................................... 261
Wskaniki a adresy w pamici ...................................................................................... 262
wiczenia...................................................................................................................... 264

Rozdzia 12. Operacje bitowe............................................................................. 267


Operatory bitowe........................................................................................................... 268
Bitowy operator AND ............................................................................................. 269
Bitowy operator OR ................................................................................................ 271
Bitowy operator OR wyczajcego........................................................................ 272
Operator negacji bitowej ......................................................................................... 273
Operator przesunicia w lewo ................................................................................. 274

Jzyk C. Wprowadzenie do programowania


Operator przesunicia w prawo............................................................................... 275
Funkcja przesuwajca ............................................................................................. 276
Rotowanie bitw ..................................................................................................... 277
Pola bitowe.................................................................................................................... 280
wiczenia...................................................................................................................... 283

Rozdzia 13. Preprocesor................................................................................... 285


Dyrektywa #define ........................................................................................................ 285
Rozszerzalno programu ....................................................................................... 289
Przenono programu ............................................................................................ 290
Bardziej zoone definicje....................................................................................... 291
Operator # ............................................................................................................... 296
Operator ## ............................................................................................................. 297
Dyrektywa #include ...................................................................................................... 298
Systemowe pliki wczane ...................................................................................... 300
Kompilacja warunkowa................................................................................................. 300
Dyrektywy #ifdef, #endif, #else i #ifndef ............................................................... 300
Dyrektywy preprocesora #if i #elif ......................................................................... 302
Dyrektywa #undef................................................................................................... 303
wiczenia...................................................................................................................... 304

Rozdzia 14. Jeszcze o typach danych ................................................................ 305


Wyliczeniowe typy danych ........................................................................................... 305
Instrukcja typedef .......................................................................................................... 308
Konwersje typw danych .............................................................................................. 311
Znak wartoci.......................................................................................................... 312
Konwersja parametrw ........................................................................................... 313
wiczenia...................................................................................................................... 314

Rozdzia 15. Praca z wikszymi programami....................................................... 315


Dzielenie programu na wiele plikw............................................................................. 315
Kompilowanie wielu plikw z wiersza polece ...................................................... 316
Komunikacja midzy moduami.................................................................................... 318
Zmienne zewntrzne ............................................................................................... 318
Static a extern: porwnanie zmiennych i funkcji .................................................... 320
Wykorzystanie plikw nagwkowych ................................................................... 322
Inne narzdzia suce do pracy z duymi programami ................................................ 324
Narzdzie make....................................................................................................... 324
Narzdzie cvs .......................................................................................................... 326
Narzdzia systemu Unix ......................................................................................... 326

Rozdzia 16. Operacje wejcia i wyjcia w jzyku C ............................................ 329


Wejcie i wyjcie znakowe: funkcje getchar i putchar .................................................. 330
Formatowanie wejcia i wyjcia: funkcje printf i scanf................................................. 330
Funkcja printf.......................................................................................................... 330
Funkcja scanf .......................................................................................................... 336
Operacje wejcia i wyjcia na plikach ........................................................................... 340
Przekierowanie wejcia-wyjcia do pliku................................................................ 340
Koniec pliku............................................................................................................ 342
Funkcje specjalne do obsugi plikw............................................................................. 343
Funkcja fopen.......................................................................................................... 343
Funkcje getc i putc .................................................................................................. 345
Funkcja fclose ......................................................................................................... 345
Funkcja feof ............................................................................................................ 347
Funkcje fprintf i fscanf............................................................................................ 348

Spis treci

9
Funkcje fgets i fputs ................................................................................................ 348
stdin, stdout i stderr ................................................................................................. 349
Funkcja exit............................................................................................................. 349
Zmiana nazw i usuwanie plikw ............................................................................. 350
wiczenia...................................................................................................................... 351

Rozdzia 17. Rozmaitoci, techniki zaawansowane ............................................. 353


Pozostae instrukcje jzyka............................................................................................ 353
Instrukcja goto ........................................................................................................ 353
Instrukcja pusta ....................................................................................................... 354
Uycie unii .................................................................................................................... 355
Przecinek jako operator ................................................................................................. 357
Kwalifikatory typu ........................................................................................................ 358
Kwalifikator register ............................................................................................... 358
Kwalifikator volatile ............................................................................................... 359
Kwalifikator restrict ................................................................................................ 359
Parametry wiersza polece ............................................................................................ 359
Dynamiczna alokacja pamici ....................................................................................... 363
Funkcje calloc i malloc ........................................................................................... 364
Operator sizeof........................................................................................................ 364
Funkcja free ............................................................................................................ 366

Rozdzia 18. Usuwanie z programw bdw....................................................... 369


Usuwanie bdw za pomoc preprocesora................................................................... 369
Usuwanie bdw przy uyciu programu gdb ............................................................... 375
Uycie zmiennych................................................................................................... 377
Pokazywanie plikw rdowych............................................................................ 379
Kontrola nad wykonywaniem programu ................................................................. 379
Uzyskiwanie ladu stosu ......................................................................................... 383
Wywoywanie funkcji, ustawianie tablic i zmiennych ............................................ 384
Uzyskiwanie pomocy o poleceniach gdb ................................................................ 384
Na koniec ................................................................................................................ 386

Rozdzia 19. Programowanie obiektowe ............................................................. 389


Czym zatem jest obiekt?................................................................................................ 389
Instancje i metody ......................................................................................................... 390
Program w C do obsugi uamkw ................................................................................ 392
Klasa Objective-C obsugujca uamki ......................................................................... 392
Klasa C++ obsugujca uamki...................................................................................... 397
Klasa C# obsugujca uamki ........................................................................................ 399

Dodatek A Jzyk C w skrcie .......................................................................... 403


1.0. Dwuznaki i identyfikatory ...................................................................................... 403
1.1. Dwuznaki ......................................................................................................... 403
1.2. Identyfikatory................................................................................................... 404
2.0. Komentarze ............................................................................................................ 404
3.0. Stae........................................................................................................................ 405
3.1. Stae cakowitoliczbowe................................................................................... 405
3.2. Stae zmiennoprzecinkowe............................................................................... 405
3.3. Stae znakowe .................................................................................................. 406
3.4. Stae acuchy znakowe ................................................................................... 407
3.5. Stae wyliczeniowe........................................................................................... 407
4.0. Typy danych i deklaracje........................................................................................ 408
4.1. Deklaracje ........................................................................................................ 408
4.2. Podstawowe typy danych ................................................................................. 408
4.3. Pochodne typy danych ..................................................................................... 410

10

Jzyk C. Wprowadzenie do programowania


4.4. Wyliczeniowe typy danych .............................................................................. 416
4.5. Instrukcja typedef............................................................................................. 416
4.6. Modyfikatory typu const, volatile i restrict ...................................................... 417
5.0. Wyraenia............................................................................................................... 417
5.1. Zestawienie operatorw jzyka C .................................................................... 418
5.2. Wyraenia stae ................................................................................................ 420
5.3. Operatory arytmetyczne ................................................................................... 421
5.4. Operatory logiczne ........................................................................................... 422
5.5. Operatory porwnania...................................................................................... 422
5.6. Operatory bitowe.............................................................................................. 423
5.7. Operatory inkrementacji i dekrementacji ......................................................... 423
5.8. Operatory przypisania ...................................................................................... 423
5.9. Operator wyboru .............................................................................................. 424
5.10. Operator rzutowania....................................................................................... 424
5.11. Operator sizeof ............................................................................................... 425
5.12. Operator przecinek ......................................................................................... 425
5.13. Podstawowe dziaania na tablicach ................................................................ 425
5.14. Podstawowe dziaania na strukturach............................................................. 426
5.15. Podstawowe dziaania na wskanikach .......................................................... 426
5.16. Literay zoone.............................................................................................. 429
5.17. Konwersje podstawowych typw danych ...................................................... 429
6.0. Klasy zmiennych i zakres ....................................................................................... 430
6.1. Funkcje............................................................................................................. 431
6.2. Zmienne ........................................................................................................... 431
7.0. Funkcje................................................................................................................... 431
7.1. Definicja funkcji............................................................................................... 431
7.2. Wywoanie funkcji ........................................................................................... 433
7.3. Wskaniki funkcji ............................................................................................ 434
8.0. Instrukcje................................................................................................................ 434
8.1. Instrukcje zoone ............................................................................................ 434
8.2. Instrukcja break................................................................................................ 434
8.3. Instrukcja continue ........................................................................................... 435
8.4. Instrukcja do..................................................................................................... 435
8.5. Instrukcja for .................................................................................................... 435
8.6. Instrukcja goto.................................................................................................. 435
8.7. Instrukcja if ...................................................................................................... 436
8.8. Instrukcja pusta ................................................................................................ 436
8.9. Instrukcja return ............................................................................................... 437
8.10. Instrukcja switch ............................................................................................ 437
8.11. Instrukcja while.............................................................................................. 438
9.0. Preprocesor............................................................................................................. 438
9.1. Trjznaki .......................................................................................................... 438
9.2. Dyrektywy preprocesora .................................................................................. 438
9.3. Identyfikatory predefiniowane ......................................................................... 443

Dodatek B Standardowa biblioteka C .............................................................. 445


Standardowe pliki nagwkowe..................................................................................... 445
<stddef.h> ............................................................................................................... 445
<limits.h>................................................................................................................ 446
<stdbool.h> ............................................................................................................. 447
<float.h>.................................................................................................................. 447
<stdint.h> ................................................................................................................ 448
Funkcje obsugujce acuchy znakowe........................................................................ 448
Obsuga pamici............................................................................................................ 450

Spis treci

11
Funkcje obsugi znakw................................................................................................ 451
Funkcje wejcia i wyjcia.............................................................................................. 452
Funkcje formatujce dane w pamici ............................................................................ 457
Konwersja acucha na liczb ....................................................................................... 458
Dynamiczna alokacja pamici ....................................................................................... 459
Funkcje matematyczne .................................................................................................. 460
Arytmetyka zespolona............................................................................................. 466
Funkcje oglnego przeznaczenia................................................................................... 468

Dodatek C Kompilator gcc .............................................................................. 471


Oglna posta polecenia................................................................................................ 471
Opcje wiersza polece................................................................................................... 471

Dodatek D Typowe bdy................................................................................. 475


Dodatek E

Zasoby .......................................................................................... 479


Odpowiedzi do wicze, errata itd. ............................................................................... 479
Jzyk programowania C ................................................................................................ 479
Ksiki .................................................................................................................... 479
Witryny WWW ....................................................................................................... 480
Grupy news ............................................................................................................. 480
Kompilatory C i zintegrowane rodowiska programistyczne ........................................ 480
gcc........................................................................................................................... 480
MinGW ................................................................................................................... 481
GygWin................................................................................................................... 481
Visual Studio........................................................................................................... 481
CodeWarrior ........................................................................................................... 481
Kylix ....................................................................................................................... 481
Rne ............................................................................................................................ 481
Programowanie obiektowe...................................................................................... 482
Jzyk C++ ............................................................................................................... 482
Jzyk C#.................................................................................................................. 482
Jzyk Objective-C ................................................................................................... 482
Narzdzia programistyczne ..................................................................................... 482

Skorowidz...................................................................................... 483

Rozdzia 4.

Zmienne, typy danych


i wyraenia arytmetyczne
W tym rozdziale powiemy wicej o nazwach zmiennych i staych. Omwimy te dokadnie podstawowe typy danych oraz pewne zasady dotyczce zapisywania wyrae arytmetycznych.

Uycie zmiennych
Pocztkowo programici musieli pisa swoje programy w binarnych jzykach obsugiwanych komputerw. Instrukcje maszynowe trzeba byo rcznie kodowa w formie liczb
dwjkowych i dopiero wtedy mona byo przekazywa je do komputera. Co wicej,
programici musieli jawnie przypisywa miejsce w pamici i potem odwoywa si do
niego, podajc konkretny adres fizyczny.
Obecnie jzyki programowania pozwalaj skoncentrowa si na rozwizywaniu konkretnych problemw, zbdne stao si odwoywanie si do kodw maszynowych czy adresw fizycznych w pamici. Do zapisywania wynikw oblicze i potem odwoywania
si do nich mona uywa nazw symbolicznych nazw zmiennych. Nazwa zmiennej
moe by tak dobierana, aby od razu byo wida, jakiego typu warto zawiera dana
zmienna.
W rozdziale 3. uywalimy kilku zmiennych do zapisywania wartoci cakowitoliczbowych. W programie 3.4 na przykad zmienna sum zawieraa wynik dodawania liczb
50 i 25.
Jzyk C pozwala stosowa inne typy zmiennych, nie tylko liczby cakowite. Jednak przed
ich uyciem konieczne jest prawidowe zadeklarowanie. Zmienne mog zawiera liczby
zmiennoprzecinkowe, znaki, a nawet wskaniki do okrelonych miejsc w pamici.

38

Jzyk C. Wprowadzenie do programowania

Zasady tworzenia nazw zmiennych s proste nazwa musi zaczyna si liter lub
podkreleniem (_), dalej moe by dowolna kombinacja liter (wielkich i maych), podkrele oraz cyfr, 0 do 9. Oto przykady poprawnych nazw zmiennych:
sum
pieceFlag
i
J5x7
Liczba_ruchow
_sysflag

Niej podajemy przykady nazw zmiennych, ktre s niepoprawne.


sum$value

znak dolara, $, jest niedopuszczalny

piece flag

nie mona uywa spacji wewntrz nazwy

3Spencer

nazwa zmiennej nie moe zaczyna si cyfr

int

int

to sowo zarezerwowane

Nie mona wykorzysta sowa int jako nazwy zmiennej, gdy sowo to ma w jzyku C
specjalne znaczenie, czyli jest to sowo zarezerwowane. Oglna zasada jest taka, e nie
mona jako nazwy zmiennej uywa adnej nazwy majcej dla kompilatora C specjalne
znaczenie. W dodatku A podano pen list nazw zarezerwowanych.
Zawsze trzeba pamita, e w jzyku C ma znaczenie wielko liter. Wobec tego nazwy
zmiennych sum, Sum i SUM odnosz si do rnych zmiennych. Nazwy zmiennych mog
by dowolnie dugie, ale znaczenie maj tylko pierwsze 63 znaki, a w pewnych sytuacjach, opisanych w dodatku A, nawet tylko pierwsze 31 znakw. Zwykle nie zaleca si
stosowania dugich nazw po prostu dlatego, e wymagaj one zbyt wiele pisania. Poniszy zapis jest wprawdzie poprawny:
ilePieniedzyZarobilemOdPoczatkuTegoRoku = pieniadzeNaKoniecTegoRoku
pieniadzeNaPoczatkuTegoRoku;

jednak rwnowany mu wiersz:


tegorocznePieniadze = pieniadzeNaKoniec pieniadzePoczatkowo;

jest rwnie czytelny, a znacznie krtszy.


Dobierajc nazwy zmiennych, musimy pamita o jednym nie wolno zanadto folgowa swemu lenistwu. Nazwa zmiennej powinna odzwierciedla jej przeznaczenie. To
zalecenie jest oczywiste zarwno komentarze, jak i dobrze dobrane nazwy zmiennych mog znakomicie poprawi czytelno programu i uatwi usuwanie z niego
bdw, a dodatkowo stanowi dokumentacj. Ilo wymaganej dokumentacji znaczco
si zmniejsza, jeli program jest czytelny sam w sobie.

Typy danych i stae


Omwilimy ju podstawowy typ danych jzyka C, int. Jak pamitamy, zmienna tego
typu moe zawiera tylko liczby cakowite, czyli liczby niemajce czci uamkowej.

Rozdzia 4. Zmienne, typy danych i wyraenia arytmetyczne

39

Jzyk C ma jeszcze cztery inne podstawowe typy danych: float, double, char oraz
_Bool. Zmienna typu float moe zosta uyta dla liczb zmiennoprzecinkowych. Typ
double jest podobny do float, ale umoliwia zapisanie liczby z okoo dwukrotnie wiksz dokadnoci. Typ char moe by wykorzystany do zapisywania pojedynczego
znaku, na przykad litery a, cyfry 6 czy rednika (wicej na ten temat w dalszej czci
rozdziau). W kocu typ danych _Bool moe zawiera jedynie dwie wartoci: 0 lub 1.
Zmienne tego typu s uywane, kiedy potrzebna jest informacja w rodzaju wczone/wyczone, tak/nie czy prawda/fasz.
W jzyku C liczba, pojedynczy znak lub acuch znakw to stae, na przykad liczba 58
to staa warto cakowitoliczbowa. acuch "Programowanie w C to nieza zabawa.\n"
to przykad staego acucha znakowego. Wyraenia, ktrych wszystkie elementy s
staymi, to wyraenia stae. Wobec tego wyraenie
128 + 7 - 17

jest wyraeniem staym, gdy kady z jego elementw jest wartoci sta. Jeli jednak
i zadeklarujemy jako zmienn typu int, to wyraenie:
128 + 7 - i

nie bdzie ju wyraeniem staym.

Podstawowy typ danych int


W jzyku C staa cakowitoliczbowa to jedna lub wicej cyfr. Jeli przed tak sta znajduje si znak minus, mamy do czynienia z wartoci ujemn. Przykadami cakowitoliczbowych wartoci staych s 158, -10 czy 0. Midzy cyframi nie wolno wstawia adnych
spacji, poza tym nie mona grupowa cyfr za pomoc przecinkw ani kropek (zatem nie
mona napisa 12,000 zamiast tego trzeba uy staej 12000).
W jzyku C przewidziano dwa specjalne formaty dotyczce zapisu liczb innych ni
dziesitne. Jeli pierwsz cyfr wartoci jest 0, liczba ta jest traktowana jako liczba
semkowa. Wtedy pozostae cyfry musz by te cyframi semkowymi, czyli nalee
do zakresu od 0 do 7. Aby zatem zapisa w C semkow warto 50, ktrej odpowiada
dziesitne 40, piszemy 040. Analogicznie, semkowa staa 0177 odpowiada dziesitnej
staej 127 (164+78+7). Warto mona wywietli jako semkow, jeli w acuchu
formatujcym funkcji printf uyjemy formantu %o. Wtedy pokazywana jest liczba
semkowa, ale bez wiodcego zera. Gdy zero jest potrzebne, uywamy formantu %#o.
Jeli staa liczba cakowita poprzedzona jest zerem i liter x (wielk lub ma), warto
jest traktowana jako liczba szesnastkowa. Zaraz za znakiem x znajduj si cyfry szesnastkowe, czyli cyfry od 0 do 9 oraz litery od a do f (lub od A do F). Litery reprezentuj
odpowiednie wartoci z zakresu od 10 do 15. Aby zatem do zmiennej rgbColor typu
int przypisa szesnastkow warto FFEF0D, moemy uy instrukcji:
rgbColor = 0xFFEF0D;

Aby wywietli warto szesnastkowo bez wiodcych 0x, z maymi cyframi od a do f,


uywamy formantu %x. Jeli maj by dodane wiodce 0x, stosujemy formant %#x, taki jak
poniej:

40

Jzyk C. Wprowadzenie do programowania


printf ("Kolor to %#x\n", rgbColor);

Jeli chcemy uzyska wielkie cyfry, od A do F, i ewentualnie wiodce 0X, uywamy


formantw %X oraz %#X.

Alokacja pamici, zakres wartoci


Kada warto, czy to znak, czy liczba cakowita, czy zmiennoprzecinkowa, ma dopuszczalny zakres wartoci. Zakres ten wie si z iloci pamici przeznaczanej na
wartoci danego typu. Oglnie rzecz biorc, w jzyku nie zdefiniowano wielkoci
pamici na poszczeglne typy; zaley to od uywanego komputera, wic s to wielkoci
zalene od maszyny. Na przykad liczba typu int moe mie 32 lub 64 bity. W programach nigdy nie naley przyjmowa zaoe dotyczcych wielkoci danych okrelonego typu. Istniej jednak pewne gwarantowane wielkoci wartoci danego typu nigdy
nie bd zapisywane w mniejszej iloci pamici ni wielko gwarantowana, na przykad dla typu int s to 32 bity (32 bity to w wielu komputerach sowo). Wicej informacji na ten temat podajemy w tabeli A 4, w dodatku A.

Typ zmiennoprzecinkowy float


Zmienna zadeklarowana jako zmienna typu float moe zosta uyta do przechowywania liczb z czci uamkow. Stae zmiennoprzecinkowe charakteryzuj si wystpowaniem w ich zapisie kropki dziesitnej. Mona pomin cyfry przed kropk, mona
pomin cyfry za kropk, ale nie jednoczenie. Przykadami poprawnych staych typu
float s 3., 125.8 czy -.0001. Jeli chcemy wywietli liczb zmiennoprzecinkow
przy uyciu funkcji printf, korzystamy z formantu %f.
Stae zmiennoprzecinkowe mog by te zapisywane w notacji naukowej. Zapis 1.7e4
oznacza warto 1.710-4. Warto przed liter e to mantysa, za za liter e to wykadnik.
Wykadnik moe by poprzedzony znakiem plus lub minus i oznacza potg 10, przez
jak naley przemnoy mantys. Wobec tego w staej 2.25e-3 warto mantysy to 2.25,
a wykadnik to 3. Staa taka odpowiada wartoci 2.2510-3, czyli 0.00225. Litera e
oddzielajca mantys od wykadnika moe by wielka lub maa.
Aby wywietli warto w notacji naukowej, w funkcji printf uywamy formantu %e.
Formant %g powoduje, e sama funkcja printf decyduje, czy warto wywietli w zwykym formacie zmiennoprzecinkowym, czy w notacji naukowej. Decyzja ta zaley od
wykadnika jeli jest on mniejszy od 4 lub wikszy od 5, stosowany jest formant
%e (czyli notacja naukowa); w przeciwnym razie uywany jest formant %f.
Jeli musimy wywietla wartoci zmiennoprzecinkowe, warto korzysta z formantu %g,
gdy daje on najbardziej estetyczne wyniki.
Szesnastkowa staa zmiennoprzecinkowa zaczyna si od 0x lub 0X, dalej jest jedna lub
wicej cyfr dziesitnych lub szesnastkowych, potem litera p lub P, w kocu opcjonalny
wykadnik dwjki ze znakiem, na przykad 0x0.3p10 oznacza warto 3/16210 = 192.

Rozdzia 4. Zmienne, typy danych i wyraenia arytmetyczne

41

Rozszerzony typ double


Typ double jest bardzo podobny do typu float, ale korzystamy z niego, kiedy zakres
wartoci typu float nie wystarcza. Zmienne zadeklarowane jako zmienne typu double
mog mie blisko dwukrotnie wicej cyfr znaczcych ni zmienne typu float. W wikszoci komputerw s one zapisywane w 64 bitach.
Jeli nie okrelimy inaczej, domylnie stae wartoci zmiennoprzecinkowe s traktowane w C jako wartoci typu double; jeli chcemy mie warto sta typu float, na koniec
trzeba doda liter f lub F, na przykad:
12.5f

Aby wywietli warto typu double, korzystamy z formantw %f, %e lub %g interpretowanych tak samo jak dla wartoci typu float.

Pojedyncze znaki, typ char


Zmienne typu char mog przechowywa pojedyncze znaki1. Sta znakow tworzymy,
zamykajc znak w parze apostrofw, na przykad 'a', ';' czy '0'. Pierwsza staa odpowiada literze a, druga rednikowi, a trzecia cyfrze zero; trzeba pamita, e nie
jest to liczba zero! Nie naley myli staych znakowych, czyli pojedynczych znakw
ujtych w apostrofy, z acuchami znakowymi, ujtymi w cudzysowy.
Staa znakowa '\n' znak nowego wiersza to cakiem poprawna staa, cho pozornie wydaje si, e jest niezgodna z podanymi zasadami. Jednak odwrotny ukonik to
w C znak specjalny, ktry nie jest traktowany jako zwyky znak. Wobec tego kompilator C traktuje napis '\n' jako pojedynczy znak, cho zapisywany jest za pomoc dwch
znakw. Istniej te inne znaki specjalne zaczynajce si od odwrconego ukonika;
pena ich lista znajduje si w dodatku A.
Do pokazywania pojedynczego znaku za pomoc funkcji printf uywamy formantu %c.

Logiczny typ danych, _Bool


Zmienna typu _Bool bdzie wystarczajco dua, aby zmieci dwie wartoci: 0 i 1.
Dokadna ilo zajmowanej pamici nie jest okrelona. Zmienne typu _Bool s uywane
w programach tam, gdzie potrzebny jest warunek logiczny (inaczej booleowski). Za
pomoc tego typu mona na przykad wskaza, czy z pliku zostay odczytane wszystkie
dane.
Zgodnie z powszechnie przyjt konwencj, 0 oznacza fasz, a 1 prawd. Kiedy
zmiennej przypisujemy warto typu _Bool, w zmiennej tej 0 jest zapisywane jako
liczba 0, za kada warto niezerowa jako 1.
1

W dodatku A omawiane s metody zapisywania znakw z rozszerzonego zestawu znakw; wykorzystuje


si do tego cytowania, znaki uniwersalne oraz znaki szerokie.

42

Jzyk C. Wprowadzenie do programowania

Aby uatwi sobie prac ze zmiennymi typu _Bool, uywamy standardowego pliku nagwkowego <stdbool.h>, w ktrym zdefiniowano wartoci bool, true i false. Przykad jego zastosowania pokazano w programie 6.10 A z rozdziau 6.
W programie 4.1 uyto podstawowych typw danych jzyka C.
Program 4.1. Uycie podstawowych typw danych
#include <stdio.h>
int main (void)
{
int
integerVar = 100;
float
floatingVar = 331.79;
double doubleVar = 8.44e+11;
char
charVar = 'W';
_Bool
printf
printf
printf
printf
printf

boolVar = 0;
("integerVar = %i\n", integerVar);
("floatingVar = %f\n", floatingVar);
("doubleVar = %e\n", doubleVar);
("doubleVar = %g\n", doubleVar);
("charVar = %c\n", charVar);

printf ("boolVar = %i\n", boolVar);


return 0;
}

Program 4.1. Wyniki


integerVar = 100
floatingVar = 331.790009
doubleVar = 8.440000e+11
doubleVar = 8.44e+11
charVar = W
boolVar = 0

W pierwszej instrukcji programu 4.1 deklarowana jest zmienna integerVar jako zmienna cakowitoliczbowa, przypisywana jest jej warto pocztkowa 100; zapis ten jest
rwnowany dwm osobnym wierszom:
int integerVar;
integerVar = 100;

W drugim wierszu wynikw dziaania programu mamy warto zmiennej floatingVar,


331.79, wywietlan jako 331.790009. Dokadna warto zaley od uywanego systemu. Powodem widocznej tu niedokadnoci jest sposb wewntrznego zapisywania
liczb w pamici komputera. Wikszo czytelnikw zapewne zetkna si z podobn
niedokadnoci podczas korzystania z kalkulatora. Dzielenie 1 przez 3 daje na kalkulatorze .33333333, ewentualnie moe by nieco wicej trjek na kocu. Jest to przyblienie jednej trzeciej. Teoretycznie trjek powinno by nieskoczenie wiele, jednak kal-

Rozdzia 4. Zmienne, typy danych i wyraenia arytmetyczne

43

kulator ma na wywietlaczu tylko okrelon liczb cyfr i std bierze si pewna niedokadno. Z tak sam niedokadnoci mamy do czynienia w naszym przypadku
pewne liczby zmiennoprzecinkowe nie daj si dokadnie zapisa w komputerze.
Kiedy wywietlamy warto zmiennej typu float lub double, mamy do dyspozycji
trzy rne formanty. %f powoduje wywietlenie wartoci w sposb standardowy. Jeli
nie okrelimy inaczej, printf zawsze wywietla wartoci float i double, pokazujc
sze cyfr czci uamkowej. W dalszej czci tego rozdziau pokaemy, jak okrela
liczb wywietlanych cyfr.
Formant %e powoduje wywietlanie wartoci float i double w notacji naukowej. Tutaj
take domylnie wywietlanych jest sze cyfr czci uamkowej.
Formant %g powoduje, e funkcja printf wybiera jeden z dwch poprzednich formantw, %f lub %e, i automatycznie usuwa wszelkie kocowe zera. Jeli nie ma adnej
czci uamkowej, kropka dziesitna te nie jest wywietlana.
Przedostatnia instrukcja printf korzysta z formantu %c i wywietla pojedynczy znak 'W',
ktry przypisalimy zmiennej charVar. Pamitajmy jeli acuch znakw (taki jak
pierwszy argument funkcji printf) jest zamknity w podwjny cudzysw, to staa znakowa musi by ujta w par apostrofw.
Ostatnia funkcja printf pokazuje, jak mona wywietli warto zmiennej _Bool przy
wykorzystaniu formantu liczb cakowitych, %i.

Okrelniki typu:
long, long long, short, unsigned i signed
Jeli bezporednio przed deklaracj typu int uyty zostanie okrelnik long, w niektrych
systemach zmienna tak utworzona bdzie miaa wikszy zakres. Przykadowa deklaracja
typu long int moe wyglda nastpujco:
long int silnia;

Deklarujemy zmienn silnia jako liczb typu long int. Tak jak w typach float
i double, konkretna dokadno zmiennej long zaley od uywanego systemu. Czsto
int i long int maj taki sam zakres i mog przechowywa liczby cakowite o wielkoci
do 32 bitw (231-1, czyli 2, 147, 483, 647).
Wartoci stae typu long int moemy tworzy, dodajc do staej liczbowej na kocu
liter L (wielk lub ma). Midzy liczb a L nie mog pojawi si adne spacje. Wobec
tego deklaracja:
long int liczbaPunktow = 131071100L;

powoduje zadeklarowanie zmiennej liczbaPunktow typu long int z wartoci pocztkow 131 071 100.

44

Jzyk C. Wprowadzenie do programowania

Jeli funkcja printf ma wywietli warto typu long int, przed znakiem typu i, o lub
x dodajemy modyfikator l (litera l). Wobec tego uywamy formantu %li, aby wywietli
warto long int w systemie dziesitnym. Aby wywietli t sam warto semkowo, stosujemy %lo, a szesnastkowo %lx.
Istnieje jeszcze typ liczb cakowitych long long. Instrukcja:
long long int maxIloscPamieci;

deklaruje liczb cakowit o rozszerzonym zakresie. W tym przypadku mamy gwarancj, e warto bdzie miaa przynajmniej 64 bity. W acuchu formatujcym printf
stosuje si dwie litery ll zamiast pojedynczej litery l, na przykad %lli.
Okrelnik long moe te wystpi przed deklaracj typu double:
long double deficyt_USA_2004;

Stae typu long double zapisujemy jak wszystkie inne stae zmiennoprzecinkowe, ale na
kocu dodajemy liter l lub L, na przykad:
1.234e+7L

Aby wywietli warto typu long double, uywamy modyfikatora L. Wobec tego %Lf
spowoduje wywietlenie wartoci long double jako zmiennoprzecinkowej, %Le w notacji naukowej, a %Lg nakae funkcji printf wybiera midzy formantami %Lf a %Le.
Specyfikator short umieszczony przed deklaracj typu int nakazuje kompilatorowi C
traktowa dan zmienn jako warto cakowit o zmniejszonym zakresie. Uycie short
jest uzasadnione przede wszystkim wtedy, gdy chodzi o oszczdno miejsca w pamici
kiedy program ju wymaga bardzo duo pamici lub ilo dostpnej pamici jest
znaczco ograniczona.
W niektrych systemach zmienne typu short int zajmuj poow miejsca przeznaczonego na zwyke zmienne int. Tak czy inaczej, mamy gwarancj, e typ short int zajmie nie mniej ni 16 bitw.
W jzyku C nie mona jawnie zdefiniowa staej typu short int. Aby wywietli zmienn typu short int, przed normalnym oznaczeniem typu cakowitoliczbowego dodajemy
liter h, czyli uywamy formantw %hi, %ho i %hx. Mona te uy dowolnej konwersji
wartoci short int, gdy i tak zostan one odpowiednio przeksztacone przy przekazywaniu do funkcji printf.
Ostatni okrelnik uywany przed typem danych int informuje, czy zamierzamy przechowywa jedynie liczby dodatnie. Deklaracja:
unsigned int licznik;

przekazuje do kompilatora, e zmienna licznik zawiera bdzie jedynie wartoci dodatnie.


Ograniczajc zakres wartoci do liczb dodatnich, zwikszamy dopuszczalny zakres liczb.
Sta typu unsigned int tworzymy, dodajc liter u (lub U) po staej:
0x00ffU

Rozdzia 4. Zmienne, typy danych i wyraenia arytmetyczne

45

Zapisujc stae, moemy czy litery u (lub U) i l (lub L), zatem


20000UL

oznacza sta o wartoci 20 000 zapisan jako typ unsigned long.


Staa liczba cakowita, za ktr nie wystpuje adna z liter u, U, l ani L i ktra nie jest
zbyt dua, aby przekroczy zakres liczb int, traktowana jest przez kompilator jako
liczba unsigned int. Jeli jest zbyt dua, aby zmieci si w zakresie liczb unsigned
int, kompilator traktuje j jako long int. Kiedy take w tym zakresie si nie mieci,
liczba traktowana jest jako unsigned long int; gdy i to nie wystarcza, traktowana jest
jako long long int albo ostatecznie jako unsigned long long int.
W przypadku deklarowania zmiennych typw long long int, long int, short int
oraz unsigned int, mona pomin sowo kluczowe int. Wobec tego zmienn licznik typu unsigned int moemy zadeklarowa, stosujc instrukcj:
unsigned licznik;

Mona te deklarowa zmienne char jako unsigned.


Kwalifikator signed moe zosta uyty, aby jawnie nakaza kompilatorowi traktowanie zmiennej jako wartoci ze znakiem. Najczciej stosuje si go przed deklaracj
typu char; wicej o typach powiemy jeszcze w rozdziale 14.
Nie warto si przejmowa, jeli dotychczasowy opis okrelnikw (specyfikatorw)
wydaje si nieco abstrakcyjny. W dalszej czci ksiki wiele zagadnie zilustrujemy
konkretnymi przykadami programw. W rozdziale 14. dokadnie zajmiemy si typami danych oraz ich konwersjami.
W tabeli 4.1 zestawiono podstawowe typy danych oraz kwalifikatory.
Tabela 4.1. Podstawowe typy danych
Typ

Przykady staych

Formanty funkcji printf

char

'a', '\n'

%c

_Bool

0, 1

%i, %u

short int

%hi, %hx, %ho

unsigned short int

%hu, %hx, %ho

int

12, -97, 0xFFE0, 0177

%i, %x, %o

unsigned int

12u, 100U, 0XFFu

%u, %x, %o

long int

12L, -2001, 0xffffL

%li, %lx, %lo

unsigned long int

12UL, 100ul, 0xffeeUL

%li, %lx, %lo

long long int

0xe5e5e5e5LL, 500ll

%lli, %llx, %llo

unsigned long long int

12ull, 0xffeeULL

%llu, %llx, %llo

float

12.34f, 3.1e-5f, 0x1.5p10, 0x1P-1

%f, %e, %g, %a

double

12.24, 3.1e-5, 0x.1p3

%f, %e, %g, %a

long double

12.34l, 3.1e-5l

%Lf, %Le, %Lg

46

Jzyk C. Wprowadzenie do programowania

Wyraenia arytmetyczne
W jzyku C, tak jak chyba w kadym innym jzyku programowania, znak plus (+)
suy do dodawania dwch wartoci, znak minus (-) do odejmowania, gwiazdka (*) to
mnoenie, a ukonik (/) oznacza dzielenie. Operatory te nazywamy binarnymi operatorami arytmetycznymi, gdy dziaaj na dwch czynnikach.
Widzielimy ju, jak atwo w jzyku C dodawa liczby. Program 4.2 pokazuje jeszcze
odejmowanie, mnoenie i dzielenie. Ostatnie dwa dziaania prowadz do pojcia priorytetu operatora. Kady operator jzyka C ma jaki priorytet uywany do okrelania, jak
naley wylicza wyraenie zawierajce wicej ni jeden operator najpierw wyliczane
s operatory z wyszym priorytetem. Wyraenia zawierajce operatory o takim samym priorytecie s obliczane od lewej do prawej lub od prawej do lewej w zalenoci
od tego, jakich operatorw uyto, a dokadniej od ich cznoci. Pen list priorytetw
operatorw i zasady ich cznoci podano w dodatku A.
Program 4.2. Uycie operatorw arytmetycznych
// Ilustracja dziaania rnych operatorw arytmetycznych
#include <stdio.h>
int main (void)
{
int a = 100;
int b = 2;
int c = 25;
int d = 4;
int result;
result = a b;
// odejmowanie
printf ("a b = %i\n", result);
result = b * c;
// mnoenie
printf ("b * c = %i\n", result);
result = a / c;
// dzielenie
printf ("a / c = %i\n", result);
result = a + b * c;
// priorytety
printf ("a + b * c = %i\n", result);
printf ("a * b + c * d = %i\n", a * b + c * d);
return 0;

Program 4.2. Wyniki


a
b
a
a
a

*
/
+
*

b
c
c
b
b

=
=
=
*
+

98
50
4
c = 150
c * d = 300

Rozdzia 4. Zmienne, typy danych i wyraenia arytmetyczne

47

Po zadeklarowaniu zmiennych cakowitych a, b, c, d i result program przypisuje zmiennej result wynik odejmowania b od a, nastpnie wywietla wartoci przy uyciu funkcji
printf.
Nastpna instrukcja:
result = b * c;

powoduje wymnoenie b przez c i zapisanie iloczynu w zmiennej result; wynik


znw jest wywietlany za pomoc funkcji printf.
Nastpnie w programie uywany jest operator dzielenia ukonik. Wynik dzielenia
100 przez 25, 4, pokazywany jest znowu przy uyciu funkcji printf.
W niektrych systemach prba dzielenia przez zero powoduje awaryjne zakoczenie
wykonywania programu2. Jeli nawet program nie zakoczy awaryjnie swojego dziaania, wyniki uzyskiwane z takich oblicze s bezwartociowe.
W tym rozdziale zobaczymy, jak mona sprawdzi, czy nie mamy do czynienia z dzieleniem przez zero jeszcze przed samym podzieleniem. Jeli wiadomo, e dzielnik jest
zerem, mona podj odpowiednie dziaania i unikn dzielenia.
Wyraenie:
a + b * c

nie da w wyniku 2550 (10225), ale odpowiednia funkcja printf pokae 150. Wynika to
std, e w jzyku C, tak jak w wikszoci innych jzykw programowania, istniej
zasady okrelajce kolejno wykonywania dziaa. W zasadzie wyraenia s przetwarzane od strony lewej do prawej. Jednak mnoenie i dzielenie maj wyszy priorytet ni
dodawanie i odejmowanie, wic wyraenie:
a + b * c

zostanie zinterpretowane w jzyku C jako:


a + (b * c)

(tak samo jak w normalnej algebrze).


Jeli chcemy zmieni kolejno wyliczania wyrae, moemy uy nawiasw. Wanie
wyraenie podane ostatnio jest zupenie poprawnym wyraeniem jzyka C. Wobec tego
instrukcja:
result = a + (b * c);

moe zosta wstawiona do programu 4.2 i ten da taki sam wynik jak poprzednio. Jeli
jednak uyjemy instrukcji:
result = (a + b) * c;

Dzieje si tak w przypadku kompilatora gcc w systemie Windows. W systemach Unix program moe nie
przerwa swojego dziaania, dajc 0 w wyniku dzielenia liczby cakowitej przez zero i nieskoczono
w przypadku dzielenia przez zero wartoci float.

48

Jzyk C. Wprowadzenie do programowania

zmienna result bdzie miaa warto 2550, gdy warto zmiennej a (100) zostanie
dodana do wartoci b (2) przed mnoeniem przez c (25). Nawiasy mog te by zagniedane wtedy wyraenie wyliczane jest w kolejnoci od nawiasw najbardziej
wewntrznych. Aby unikn pomyek, zwykle wystarczy sprawdzi, czy liczba nawiasw otwierajcych rwna jest liczbie nawiasw zamykajcych.
Z ostatniej instrukcji programu 4.2 wynika, e cakiem poprawne jest przekazywanie
do funkcji printf jako argumentu wyraenia, bez koniecznoci przypisywania zmiennej
wartoci tego wyraenia. Wyraenie:
a * b + c * d

jest wyliczane, zgodnie z podanymi wczeniej zasadami, jako:


(a * b) + (c * d)

czyli:
(100 * 2) + (25 * 4)

Funkcja printf dziaa na uzyskanym wyniku, czyli 300.

Arytmetyka liczb cakowitych i jednoargumentowy


operator minus
Program 4.3 suy utrwaleniu przekazanej wczeniej wiedzy, pokazuje te zasady
arytmetyki cakowitoliczbowej.
Program 4.3. Dalsze przykady uycia operatorw arytmetycznych
// Jeszcze troch wyrae arytmetycznych
#include <stdio.h>
int main (void)
{
int a = 25;
int b = 2;
float c = 25.0;
float d = 2.0;
printf
printf
printf
printf

("6 + a / 5 *
("a / b * b =
("c / d * d =
("-a = %i\n",

return 0;
}

Program 4.3. Wyniki


6 + a / 5 * b = 16
a / b * b = 24

b = %i\n", 6 + a / 5 * b);
%i\n", a / b * b);
%f\n", c / d * d);
-a);

Rozdzia 4. Zmienne, typy danych i wyraenia arytmetyczne

49

c / d * d = 25.000000
-a = -25

Do deklaracji zmiennych typu int wstawiono dodatkowe spacje, aby wyrwna wszystkie
deklarowane zmienne. Dziki temu program jest czytelniejszy. Uwani czytelnicy zauwayli te zapewne, e w pokazywanych dotd programach kady operator jest otoczony spacjami. Nie jest to niezbdne, a robione w celu poprawienia estetyki programu.
Warto doda kilka spacji, jeli czytelno programu na tym zyska.
Wyraenie z pierwszego wywoania funkcji printf w programie 4.3 wskazuje, jak istotne
s priorytety operatorw. Wyznaczanie wartoci tego wyraenia odbywa si nastpujco.
0. Dzielenie ma wyszy priorytet od dodawania, wic warto zmiennej a (25)

jest dzielona najpierw przez 5. Wynik poredni wynosi 5.


0. Mnoenie ma wyszy priorytet od dodawania, wic wynik poredni 5 jest
mnoony przez 2, warto zmiennej b, co daje nowy wynik poredni 10.
0. W kocu wykonywane jest dodawanie 6 i 10, co daje 16 jako ostateczny wynik.

W drugiej instrukcji printf pojawia si dodatkowa komplikacja. Mona by si spodziewa,


e dzielenie a przez b i nastpnie pomnoenie przez b powinno da warto a, czyli 25.
Jednak uzyskany wynik to 24. Czyby komputer gdzie po drodze zgubi jeden bit? Prawdziwa przyczyna jest taka, e obliczenia robione s przy uyciu arytmetyki liczb cakowitych.
Spjrzmy jeszcze raz na deklaracje zmiennych a i b obie s typu int. Kiedy wyliczane wyraenie zawiera tylko dwie liczby cakowite, C korzysta z arytmetyki liczb cakowitych, zatem tracone s ewentualne czci uamkowe. Wobec tego, dzielc warto
zmiennej a przez b, czyli dzielc 25 przez 2, uzyskujemy wynik poredni 12, a nie 12.5.
Mnoenie tego wyniku poredniego przez 2 daje ostatecznie 24. Trzeba pamita, e,
dzielc przez siebie dwie liczby cakowite, zawsze uzyskamy liczb cakowit.
W przedostatniej instrukcji printf z programu 4.3 widzimy, e uzyskamy wynik zgodny z oczekiwaniami, jeli te same dziaania przeprowadzimy na liczbach zmiennoprzecinkowych.
Decyzj o typie zmiennych int lub float trzeba podj na podstawie tego, jak
zamierzamy tej zmiennej uywa. Jeli jej cz uamkowa bdzie zbdna, uywamy
zmiennych cakowitoliczbowych. Uzyskany program bdzie zwykle dziaa szybciej.
Jeli jednak cz uamkowa bdzie potrzebna, wybr jest jasny i pozostaje jedynie
pytanie, czy uy typu float, double, czy long double. Odpowied zaley od tego,
jaka dokadno jest potrzebna oraz od wielkoci przetwarzanych liczb.
W ostatniej instrukcji printf warto zmiennej jest zanegowana przy uycia jednoargumentowego operatora minus. Operator jednoargumentowy, zgodnie ze swoj nazw,
ma tylko jeden argument. Znak minus moe peni tylko dwie rne role moe by
operatorem binarnym (dwuargumentowym) uywanym do odejmowania dwch liczb
lub operatorem jednoargumentowym, zwracajcym przeciwiestwo liczby.

50

Jzyk C. Wprowadzenie do programowania

Jednoargumentowy operator minus ma priorytet wyszy od wszystkich innych operatorw arytmetycznych (wyjtkiem jest jednoargumentowy plus, o takim samym priorytecie). Wobec tego wyraenie:
c = -a * b;

spowoduje wymnoenie a przez b. W dodatku A znajduje si tabela z zestawieniem


operatorw i ich priorytetw.

Operator modulo
Teraz omwimy operator modulo, oznaczany symbolem procenta %. Na podstawie
programu 4.4 sprbujmy zorientowa si, jak dziaa ten operator.
Program 4.4. Uycie operatora modulo
// Operator modulo
#include <stdio.h>
int main (void)
{
int a = 25, b = 5, c = 10, d = 7;
printf
printf
printf
printf

("a
("a
("a
("a

%% b = %i\n", a % b);
%% c = %i\n", a % c);
%% d = %i\n", a % d);
/ d * d + a %% d = %i\n",
a / d * d + a % d);

return 0;
}

Program 4.4. Wyniki


a
a
a
a

%
%
%
/

b
c
d
d

=
=
=
*

0
5
4
d + a % d = 25

W pierwszej instrukcji w funkcji main definiujemy i inicjalizujemy jednoczenie cztery


zmienne: a, b, c i d.
Jak ju wiemy, funkcja printf wykorzystuje znaki znajdujce si za znakiem procenta
jako definicje wywietlanych wartoci. Jeli jednak za jednym znakiem procenta wystpuje drugi taki sam znak, funkcja printf traktuje ten procent jako zwyky znak do
wywietlenia.
Zgadza si, operator % zwraca reszt z dzielenia pierwszej wartoci przez drug. W pierwszym przykadzie reszt dzielenia 25 przez 5 jest 0. Jeli podzielimy 25 przez 10,
otrzymamy reszt 5 wida to w drugim wierszu wyniku. Dzielc 25 przez 7, otrzymujemy reszt 4, co wynika z trzeciego wiersza.

Rozdzia 4. Zmienne, typy danych i wyraenia arytmetyczne

51

Ostatni wiersz wynikowy programu 4.4 wymaga pewnego wyjanienia. Najpierw zauwamy, e odpowiednia instrukcja zostaa zapisana w dwch wierszach. W jzyku C
jest to jak najbardziej dopuszczalne. Instrukcja moe by przeniesiona do nastpnego
wiersza podzia moliwy jest wszdzie tam, gdzie moe wystpi spacja (wyjtkiem s acuchy znakowe, ktre dokadnie bdziemy omawia w rozdziale 10.). Czasami dzielenie programu na kilka wierszy moe by nie tylko przydatne, ale wprost niezbdne. W programie 4.4 przeniesiona do nastpnego wiersza cz instrukcji printf
jest wcita, aby podzia instrukcji na czci by dobrze widoczny.
Zwrmy uwag na wyraenie obliczane w ostatniej instrukcji. Przypomnijmy, e
wszystkie obliczenia na liczbach cakowitych wykonywane s zgodnie z arytmetyk
cakowitoliczbow, zatem reszta uzyskiwana z dzielenia dwch liczb cakowitych jest
po prostu odrzucana. Wobec tego dzielenie 25 przez 7, wynikajce z wyraenia a / d,
daje wynik poredni 3. Mnoc t warto przez d, czyli 7, uzyskamy poredni wynik
21. W kocu, dodajc reszt z dzielenia a przez d (wyraenie a % d), otrzymujemy
ostatecznie 25. Nie jest przypadkiem, e jest to ta sama warto, jak pocztkowo
miaa zmienna a. Oglnie rzecz biorc, wyraenie:
a / b * b + a % b

zawsze da warto a, jeli a i b s liczbami cakowitymi. Operator modulo moe by


uywany tylko z liczbami cakowitymi.
Operator modulo ma taki sam priorytet jak operatory mnoenia i dzielenia. Oznacza to
oczywicie, e wyraenie:
tablica + wartosc % WIELKOSC_TABLICY

bdzie wyliczane jako:


tablica + (wartosc % WIELKOSC_TABLICY)

Konwersje midzy liczbami cakowitymi


a zmiennoprzecinkowymi
Aby w jzyku C pisa dobrze dziaajce programy, trzeba zrozumie zasady niejawnej konwersji midzy liczbami zmiennoprzecinkowymi a cakowitymi. W programie
4.5 pokazano niektre rodzaje konwersji. Warto wiedzie, e niektre kompilatory
mog generowa ostrzeenia o realizowanych konwersjach.
Program 4.5. Konwersje midzy liczbami cakowitymi a zmiennoprzecinkowymi
// Najprostsze konwersje typw w jzyku C
# include <stdio.h>
int main (void)
{
float f1 = 123.125, f2;
int i1, i2 = -150;
char c = 'a';

52

Jzyk C. Wprowadzenie do programowania


i1 = f1;
// konwersja typu float na int
printf ("%f przypisane zmiennej typu int daje %i\n", f1, i1);
f1 = i1;
// konwersja typu int na float
printf ("%i przypisane zmiennej typu float daje %f\n", i2, f1);
f1 = i2 / 100;
// dzielenie przez siebie dwch liczb int
printf ("%i dzielone przez 100 daje %f\n", i2, f1);
f2 = i2 / 100.0;
// dzielenie liczby int przez float
printf ("%i dzielone przez 100.0 daje %f\n", i2, f2);
f2 = (float) i2 / 100; // operator rzutowania typw
printf ("(float) %i dzielone przez 100 daje %f\n", i2, f2);
}

return 0;

Program 4.5. Wyniki


123.125000 przypisane zmiennej typu int daje 123
-150 przypisane zmiennej typu float daje 150.000000
-150 dzielone przez 100 daje 1.000000
-150 dzielone przez 100.0 daje 1.500000
(float) -150 dzielone przez 100 daje 1.500000

Kiedy w jzyku C zmiennej cakowitoliczbowej przypisujemy liczb zmiennoprzecinkow,


cz uamkowa jest odrzucana. Kiedy zatem w powyszym programie do zmiennej i1
przypisujemy warto zmiennej f1, z liczby 123.125 odrzucana jest cz uamkowa, czyli
w zmiennej i1 znajduje si warto 123. Wida to w pierwszym wierszu wynikowym.
Przypisanie zmiennej cakowitej do zmiennej zmiennoprzecinkowej nie powoduje
adnej zmiany wartoci; warto ta jest po prostu konwertowana przez system i zapisywana w odpowiedniej zmiennej. W drugim wierszu wynikowym wida, e warto
i2 (-150) zostaa prawidowo skonwertowana i zapisana w zmiennej f1 jako float.
W nastpnych dwch wierszach wynikowych pokazano, o czym trzeba pamita przy
zapisywaniu wyrae arytmetycznych. Po pierwsze, chodzi o arytmetyk cakowitoliczbow, ktra bya ju omawiana w tym rozdziale. Kiedy oba operandy wyraenia
s liczbami cakowitymi (czyli chodzi o typy short, unsigned, long i long long), dziaanie jest wykonywane zgodnie z zasadami arytmetyki cakowitoliczbowej. Wobec tego
wszystkie czci uamkowe powstajce po dzieleniu s odrzucane, nawet jeli wynik zapiszemy potem jako warto zmiennoprzecinkow (jak w naszym programie). Wobec
tego, kiedy zmienna cakowitoliczbowa i2 jest dzielona przez sta cakowit 100,
system wykonuje dzielenie cakowitoliczbowe. Wynikiem dzielenia -150 przez 100 jest
1; taka warto jest zapisywana w zmiennej f1 typu float.
Nastpne dzielenie powyszego programu zawiera zmienn cakowitoliczbow i sta
zmiennoprzecinkow. W jzyku C dziaanie jest traktowane jako zmiennoprzecinkowe,
jeli ktry z argumentw dziaania jest zmiennoprzecinkowy. Wobec tego dzielenie i2
przez 100.0 system traktuje jako dzielenie zmiennoprzecinkowe, zatem uzyskujemy
warto 1.5, przypisywan zmiennej f1 typu float.

Rozdzia 4. Zmienne, typy danych i wyraenia arytmetyczne

53

Operator rzutowania typw


Ostatnie dzielenie z programu 4.5, majce posta:
f2 = (float) i2 / 100;

// operator rzutowania typw

zawiera nowy operator operator rzutowania. Operator ten powoduje konwersj zmiennej i2 na typ float na potrzeby pokazanego wyraenia. Nie wpywa jednak w trway
sposb na zmienn i2; jest to jednoargumentowy operator zachowujcy si tak, jak
wszystkie inne operatory. Wyraenie a nie ma adnego trwaego wpywu na warto a, tak
samo trwaego wpywu nie ma wyraenie (float) a.
Operator rzutowania typw ma priorytet wyszy ni wszelkie operatory arytmetyczne
poza jednoargumentowymi plusem i minusem. Oczywicie w razie potrzeby mona
uy nawiasw, aby wymusi podan kolejno oblicze. Innym przykadem uycia operatora rzutowania jest wyraenie:
(int) 29.55 + (int) 21.99

interpretowane w jzyku C jako:


29 + 21

wynika to std, e rzutowanie wartoci zmiennoprzecinkowych na liczby cakowite


polega na odrzuceniu czci uamkowej. Z kolei wyraenie:
(float) / (float) 4

da wynik 1.5, podobnie jak wyraenie:


(float) 6 / 4

czenie dziaa z przypisaniem


Jzyk C pozwala czy dziaania arytmetyczne z operatorem przypisania; uywamy
do tego oglnej postaci op=. W zapisie tym op to jeden z operatorw arytmetycznych
(+, -, *, / i %). Poza tym op moe by jednym operatorw dziaa i przesuni bitowych,
ktre omwimy pniej.
Wemy pod uwag instrukcj:
ilosc *= 10;

Wynik dziaania operatora += bdzie taki, e znajdujce si po jego prawej stronie


wyraenie zostanie dodane do wyraenia z jego lewej strony, a wynik zostanie przypisany wyraeniu z lewej strony operatora. Wobec tego powysza instrukcja jest rwnowana instrukcji:
ilosc = ilosc + 10;

Wyraenie:
licznik -= 5

powoduje odjcie od zmiennej licznik wartoci 5 i zapisanie wyniku z powrotem w zmiennej licznik; jest rwnowane wyraeniu:

54

Jzyk C. Wprowadzenie do programowania


licznik = licznik 5

Nieco bardziej skomplikowane jest wyraenie:


a /= b + c

ktre dzieli a przez wyraenie po prawej stronie; w tym wypadku sum b i c, a nastpnie
iloraz przypisuje zmiennej a. Dodawanie jest wykonywane jako pierwsze, gdy operator
dodawania ma wyszy priorytet od operatora przypisania. Zreszt wszystkie operatory
poza przecinkiem maj priorytety wysze od operatorw przypisania; z kolei
wszystkie operatory przypisania maj taki sam priorytet.
Pokazane wczeniej wyraenie bdzie zatem rwnowane nastpujcemu:
a = a / (b + c)

Pokazanych operatorw przypisania uywamy z trzech powodw. Po pierwsze, atwiejsze


jest zapisywanie instrukcji programu, gdy to, co jest po lewej stronie operatora przypisania nie musi ju by powtarzane po jego prawej stronie. Po drugie, wyraenie tak
uzyskane jest atwiejsze do czytania. Po trzecie, uycie takich operatorw przypisania
moe przyspieszy dziaanie programw, gdy czasami kompilator generuje nieco
mniej kodu do wyliczania wyrae.

Typy _Complex i _Imaginary


Zanim przejdziemy do nastpnego rozdziau, warto odnotowa istnienie jeszcze dwch
typw, _Complex i _Imaginary, uywanych do zapisu liczb zespolonych i urojonych.
Kompilator nie musi obu tych typw obsugiwa3. Wicej informacji na ich temat znajdziemy w dodatku A.

wiczenia
0. Przepisz i uruchom pi programw pokazanych w tym rozdziale. Uzyskane

wyniki porwnaj z wynikami pokazanymi w tekcie.


0. Ktre z poniszych nazw zmiennych s nieprawidowe i dlaczego?
Int
Calloc
floating
ReInitialize

char
Xx
_1312
_

6_05
alpha_beta_routine
z
A$

0. Ktre z poniszych staych s nieprawidowe i dlaczego?


123.456
0001
0Xab05
3

0x10.5
0xFFFF
0L

0X0G1
123L
-597.25

W chwili pisania tej ksiki kompilator gcc w wersji 3.3 nie obsugiwa tych typw w peni.

Rozdzia 4. Zmienne, typy danych i wyraenia arytmetyczne


123.5e2
98.6F
0996
1234uL
1.234L
0XABCDEFL

.0001
98.7U
-12E-12
1.2Fe-7
197u
0xabcdu

+12
17777s
07777
15,000
100U
+123

0. Napisz program przeliczajcy 27 ze skali Fahrenheita (F) na skal Celsjusza (C).

Uyj nastpujcej zalenoci:


C = (F 32) / 1.8
0. Jaki wynik da nastpujcy program?
#include <stdio.h>
int main (void)
{
char c, d;
c = 'd';
d = c;
printf ("d = %c\n", d);
}

return 0;

0. Napisz program wyliczajcy warto wielomianu:

3x35x2+6
dla x = 2.55.
0. Napisz program wyznaczajcy warto poniszego wyraenia i pokazujcy

wyniki (pamitaj o uyciu zapisu wykadniczego przy wywietlaniu wynikw):


(3.3110-82.0110-7)/(7.1610-6+2.0110-8)
0. Aby zaokrgli liczb cakowit i do najbliszej wielokrotnoci innej liczby
cakowitej j, moesz uy wzoru:
Nastepna_wielokrotnosc = i + j i % j

Aby na przykad zaokrgli 256 dni do najbliszej liczby dni dzielcej si


na pene tygodnie, mamy i = 256 i j = 7, wic z powyszego wzoru otrzymujemy:
Nastepna_wielokrotnosc

= 256 + 7 256 % 7
= 256 + 7 4
= 259

Napisz program znajdujcy najblisze wielokrotnoci dla nastpujcych


wartoci i i j:
i

365
12,258
996

7
23
4

55

Vous aimerez peut-être aussi