You are on page 1of 1290

Jerzy Grębosz
Instytut Fizyki Jądrowej im. H. Niewodniczańskiego
Polska Akademia Nauk
Kraków

Programowanie w języku C++
orientowane obiektowo

Kraków 2005

© JERZY GRĘBOSZ i iM g
Wszelkie prawa zastrzeżone

Opracowanie graficzne: Jerzy Grębosz
Zdjęcie na tylnej stronie okładki: Dr Stanislav Tachenow, GSI Darmstadt

WYDANIE PIERWSZE

AUTOR ORAZ WYDAWNICTWO DOŁOŻYLI WSZELKICH STARAŃ, BY ZAWARTF W KSIAŻCF
INFORMACJE BYŁY RZETELNE I KOMPLETNE. NIE BIORĄ JEDNAK ODPOWIEDZIALNOŚCI ANI
ZA ICH WYKORZYSTANIE, ANI ZA ZWIĄZANE Z TYM EWENTUALNE NARUSZENIE PRAW
PATENTOWYCH LUB AUTORSKICH. *uaz.r:iNit rKAW

ŻADNA CZĘŚĆ TEJ PUBLIKACJI NIE MOŻE BYĆ REPRODUKOWANA FOTOGRAFICZNIE
KSEROGRAFICZNIE ANI W ŻADEN INNY SPOSÓB. NIE MOŻE BYĆ SKŁADOWANA NA ŻAIWTCH
(A W SZCZEGÓLNOŚCI ELEKTRONICZNYCH) NOŚNIKACH INFORMACJI NIE MOŻE BYĆ
PRZESYŁANA ELEKTRONICZNIE, FOTOGRAFICZNIE, ANI W ŻADEN INNY SPOSÓB RP7
PISEMNEJ ZGODY WŁAŚCICIELA PRAW AUTORSKICH.
UDOSTĘPNIANIE l/LUB KOPIOWANIE TEJ PUBLIKACJI ZA POMOCĄ UR7AD7FŃ
KOPIUJĄCYCH LUB PRZY WYKORZYSTANIU NOŚNIKÓW ELEKTRONICZNYCH IFST
PRZESTĘPSTWEM.
WYDAWNICTWO ZASTRZEGA SOBIE PRAWO DO DOCHODZENIA ODSZKODOWANIA ZA
PONIESIONE STRATY OD OSÓB NIELEGALNE ROZPOWSZECHNIAJĄCYCH TĘ
PUBLIKACJĘ.

ALL OF THE PRODUCTS AND SOFTWARE MENTIONED IN THIS BOOK
ARE REGISTERED TRADEMARKS OF THEIR OWNERS

WYŁĄCZNY DYSTRYBUTOR (ADRES KORESPONDENCYJNY):
WYDAWNICTWO „EDITION 2000”
y k UL. STASZICA 3/8
£ / j 31-162 KRAKÓW
TEL. (012) 635-15-00
2000 E-MAIL: BIURO@EDITION2000.COM.PL

W ydano przy współpracy
Oficyny Kallimach

ISBN 83-7366-073-9

Spis treści III

Spis treści
0 P r o s z ę n i e c z y t a ć t e g o ! ..................................
................................................................... i
1 S t a r t u j e m y ! ..............................
1.1 Pierw szy p ro g ra m ................
1.2 D rugi p r o g r a m ......................
1.3 Ć w iczenia................................
i s t r u k c j e s t e r u j ą c e ......... ............. ................... ...............................................................2 2
2.1 P raw da - Fałsz, czyli o w a ru n k a c h .....................
2.1.1 W yrażenie lo g ic z n e ........
2.1.2 Zm ienne logiczne b o o l jako w a ru n e k .......... .................................................................23
2.1.3 Stare dobre sp o so b y z daw nego C + + ............ .................................................................24
2.2 Instrukcja w aru n k o w a i f . .„
2.3 Pętla w h i l e .............................
2.4 Pętla d o . . . w h i l e ................
2.5 Pętla f o r .................................. .
2.6 Instrukcja s w i t c h .................
2.7 C o w y b rać s w i t c h czy i f . . . e l s e ? ................. .................................................................37
2.8 In stru k q a b r e a k ..................
2.9 Instrukcja g o t o ......................
2.10 Instrukcja c o n t i n u e ............
2.11 K lam ry w instrukcjach sterujących........................
2.12 Ć w iczenia..................................

3.1
3.2 System atyka ty p ó w z języka C + +............................................................................................ 50
3.3 Typy fu n d a m e n ta ln e ...................................................................................................................50
3.3.1 D efiniow anie ob iek tó w „w b ie g u " .................................................................................... 56
3.4 Stale dosło w n e............................................................................................................................... 58

IV Spis treści

3.4.1 Stałe b ęd ące liczbam i całkow itym i ................................................................................ 59
3.4.2 Stałe rep rezen tu jące liczby z m ie n n o p rz e c in k o w e .....................................................61
3.4.3 Stałe z n a k o w e ........................................................................................................................ 62
3.4.4 Stałe tek sto w e, napisy, albo p o p ro stu stringi ............................................................65
3.5 T ypy z ło ż o n e ............................................................................................................................... 68
3.6 Typ ................................................................................................................................................
3.7 Zakres w ażności nazw y obiektu, a czas życia obiektu ................................................. 70
Zakres: lo k aln y 71
3.7.1
3.7.2 Zakres: b lo k funkcji.............................................................................................................. 71
3.7.3 Zakres: o b szar p lik u ............................................................................................................. 72
3.7.4 Zakres: o b sz a r k la sy ............................................................................................................. 72
3.7.5 Zakres ok reślo n y p rzez przestrzeń n a z w ......................................................................72
3.8 Zasłanianie n a z w ........................................................................................................
3.9 Specyfikator (przydomek) c o n s t ...............................................................................
Pojedynek: const contra # d e f i n e .....................................................................
3.9.1
3.10 Obiekty r e g i s t e r .............................. - ....................................................................
3.11 Specyfikator v o l a t i l e .................................................................................................
3.12 Instrukcja t y p e d e f .......................................................................................................
3.13 T ypy wyliczeniowe enum ......................................................................................
3.14 Ćwiczenia......................................................................................................................

...................
U Operatory arytmetyczne
4.1.1
Operator %, czyli reszta z dzielenia (modulo) .........................................................96
4. 1.2 Jednoargumentowe operatory + i - ..... .....................................................................98
4.1.3 Operatory inkrementacji i dekrementacji ......................
4.1.4 Operator przypisania = ....................................................
4.2 Operatory logiczne ..................................................................
4.2.1 Operatory relacji................................................................
4.2.2 Operatory sumy logicznej I i i iloczynu logicznego &&
4.2.3 Wykrzyknik ! - czyli operator negacji..................................................................... 104
4.3 Operatory bitowe .............................................................................................................105
4.31 P rzesunięcie w lew o « ................................................................................................. ^ 06
4.3.2 Przesunięcie w prawo » ......................................................................................... 1u/
4.3.3 Bitowe operatory sumy, iloczynu, negacji, różnicy symetrycznej .................108
4.4
Różnica między operatorami logicznymi, a operatorami bitowymi ...................... 109
4.5 Pozostałe operatory przypisania ................................................................................... 110
4.6 Wyrażenie warunkowe ................................................................................................... m
4.7 O perator s i z e o f ..................................................................................................................
4.8 Operatory rzutowania .....................................................................................................114
4.8.1
Rzutowanie według tradycyjnych inie zalecanych) sposobów ...........................115
4.8.2 Rzutowanie za pomocą nowych operatorów rzutowania.................................... 116
4.8.3 Operator s t a t i c _ c a s t ..............................................................................................117
4.8.4 Operator c o n s t _ c a s t .................................................................................................119
4.8.5 Operator d y n a m i c _ c a s t ............................................................................................121
4.8.6 Operator r e i n t e r p r e t c a s t ................................................................................. 121

Spis treści V
Ol Ol

VI Spis treści

7.4 Przykład z tablicą elem entów ty p u enum ..........................................................................
Tablice zn ak o w e
Tablice wielowymiarowe
Typ w y rażeń zw iązanych z tablicą w ie lo w y m ia ro w ą ............................................ 243
7.6.1
7.6.2 Przesyłanie tablic wielowymiarowych do funkcji
Ćwiczenia.

skaźniki........................... —
W skaźniki m ogą b ardzo u łatw ić życic
8.2 D efiniow anie w skaźników
83 Praca ze w skaźnikiem
L -w artosc..
8.5 Operator rzutowania r e i n t e r p r c t _ c a s t . a w skaźniki.........................................261
W skaźniki typu v o i d
Cztery do m en y zastosow ania w sk aźn ik ó w .................................................................... 267
Z astosow anie wskaźników wobec tab lic.......................................................................267
Ć w iczenia z m echaniki ru ch u w s k a ź n ik a ................................................................... 26
8.8.1
8 8.2
.
U życie w sk aźn ik a w pracy z ta b licą..............................................................................*72
8.8.3 Arytmetyka wskaźników ...........................................................................................
8.8.4 P o rów n y w an ie w skaźników
8.8.5 Wskaźnik m ożna porów nać z adresem 0
Zastosowanie wskaźników w argumentach funkcji
8.9.1 jeszcze raz o przesyłaniu tablic do funkcji
8.9.2 O dbieran ie tablicy jako w sk a ź n ik a ................................................................................ 28®
8.9.3
Argument formalny będący w skaźnikiem do obiektu c o n s t
Z astosow anie w skaźników p rz y dostępie do k o n k retn y ch kom órek p a m ię c i.......292
8.10
8.11 Rezerw acja o b szaró w pam ięci ....................... - ...............'."'T'".'......................................
O p erato ry new i d e l e t e albo O ratorium S tw orzenie Św iata ...........................294
8 . 11.1
8. 11.2 Dynamiczna alokacja tablicy
Tablice w ielow ym iarow e tw o rzo n e operatorem n e w .............................................. 299
8.11.3
8.11.4 Umiejscawiający operator new
Przychodzimy, odchodzimy - cichuteńko, na...
8.11.5
8 . 11.6 Z ap as pam ięci to nie jest stu d n ia bez dna
8.11.7 Funkcja s e t _ n e w _ h a n d l e r .........................................
_ . « 1 _— M 1 1 /~\/~* ........... ...... . - ......• • • • l / .l ^
8.11.8 Pojedynek: new contra m a l l o c ...................................................................................... ^
8.12 Stałe w sk aźn ik i
813 Stałe w sk aźn ik i, a w skaźniki d o stałych
8.14 Strzał n a oślep - W skaźnik zaw sze pokazuje na cos ^19
w sk a ź n ik ó w ........................................................................................
8.15 Sposoby u staw ian ia
8.16 P arada kłam ców , czyli o rzu to w an iu c o n s t _ c a s t 326
8.17 Tablice w sk a źn ik ó w
8.18 W ariacje na tem at C -s trin g o w .............................................................................................. ^
8.19 W skaźniki d o funkcji
8.19.1 Ćwiczenia z definiowania wskaźników do funkcji
8.19.2 W sk aźn ik do funkcji jako arg u m en t innej funkcji
8.19.3 Tablica w sk aźn ik ó w d o funkcji

Spis treści VII

8.20 A rgum en ty z lin ii w yw ołania p ro g ram u ........................................................................363
8 21 Ć w iczen ia.................................................................................................................................... 366

9.1 Co to znaczy: p rz e ła d o w a n ie ............................................................................................. ...374
9.2 Bliższe szczegóły p rz e ła d o w a n ia .........................................................................................378
9.3 Czy p rz e ła d o w a n ie nazw funkcji jest techniką obiektow o o rientow aną? ..............381
9.4 Linkow anie z m o d u łam i z innych języków ..................................................................... 382
9 5 P rzeładow anie, a zak res w ażności deklaracji funkcji .................................................... 383
9.6 R ozw ażania o identyczności lu b odm ienności typów arg u m e n tó w ......... 386
9.6.1 P rzeład o w an ie, a t y p e d e f i enum ..............................................................................386
9.6.2 Tablica, a w s k a ź n ik ............................................................................................................ 386
9.6.3 Pew ne szczegóły o tablicach w ielow ym iarow ych ................................................... 388
9.6.4 P rzeład o w an ie, a referencja ............................................................................................ 390
9.6.5 Identyczność typów : T, const T, voIatile T ................................................................... 391
9.6.6 P rzeład o w an ie - a typy: T*, volatile T*, const T *....................................................... 392
9.5.7 P rzeład o w an ie - a typy: T&, volatile T&, const T&................................................... 394
9.7 A dres funkcji przeładow anej .............................................................................................. 394
9.7.1 Z w rot rezu ltatu będącego ad resem funkcji p rz e ła d o w a n e j....................................397
9.8 Kulisy d o p aso w y w an ia argum entów d o funkcji p rzeład o w an y ch ........................... 398
9.9 Etapy d o p aso w an ia ................................................................................................................ 400
9.9.1 Etap 1. D o p aso w an ie d o k ła d n e.......................................................................................401
9.9.2 Etap la . D opasow anie dokładne, ale z tzw . tryw ialną konw ersją ......................401
9.9.3 Etap 2. D o p aso w an ie z aw ansem (z p ro m o c ją )..........................................................402
9.9.4 Etap 3. Próba dopasow ania za pom ocą konw ersji stan d ard o w y ch .....................405
9.9.5 Etap 4. Próba dopasow ania z użyciem konw ersji zdefin io w an y ch przez
u żytkow nika...........................................................................................................................................406
9.9.6 Etap 5. Próba dopasow ania d o funkcji z w ielokropkiem ....................................... 407
9.9.7 W skaźników nie dopasow uje się inaczej niż d o sło w n ie ..........................................407
9.10 D opasow yw anie w yw ołań z kilkom a a rg u m e n ta m i........................................................408
9.11 Ć w iczenia.................................................................................................................................... 409

10.1 Typy definiow ane p rzez u ż y tk o w n ik a .............................................................................. 412
10.2 Składniki klasy ........................................................................................................................ 414
10.3 Składnik będący o b ie k te m .....................................................................................................416
1 04 E n k ap su lacja............................................................................................................................ 416
10 5 U kryw anie inform acji ....................................................................................................418
10 6 Klasa, a o b ie k t.......................................................................................................................... 421
10 7 Fu nkcje s k ła d o w e ....................................................................................................................424
10 7.1 Posługiw anie się funkcjami sk ład o w y m i...................................................................... 424
10.7.2 D efiniow anie funkcji sk ład o w y ch .................................................................................. 425
10.8 Jak to w łaściw ie jest ? ( t h i s ) .............................................................................................. 431
10.9 O dw ołanie się d o publicznych danych sk ła d o w y c h .......................................................434
10.10 Zasłanianie nazw ................................................................................................................... 435
10.10.1 Nie sięgaj z klasy do obiektów globalnych..................................................................439

VIII Spis treści

10.11 Przeładowanie i zasłonięcie równocześnie ................................ .439
10.12 N ow a klasa? O sobny p lik !........................................................ .......... .440
10.13 Przesyłanie d o funkcji argumentów będących obiektami ...... .452
10.13.1 Przesyłanie obiektu przez w artość.......................................... .453
10.13.2 Przesyłanie przez referencję ..................................................... .455
10.14 Konstruktor-pierwsza wzmianka ................................................. .457
10.15 Destruktor-pierwsza wzmianka ................................................... .462
10.16 Składnik statyczny .................................................... ................... .465
10.16.1 Deklaracja składnika statycznego połączona z inicjalizacją .470
10.17 Statyczna funkcja składowa .................................................... ••••• .476
10.18 Do czego m oże nam się p rzy d ać sk ład n ik statyczny w klasie? .480
10.19 Funkcje składowe typu c o n s t oraz v o l a t i l e ..................... .480
10.19.1 Przeładowanie, a funkcje składowe c o n s t i v o l a t i l e .485
10.20 Specyfikator m u ta b le .................................................................... .485
499
10.21 Ćwiczenia.............................................................................................
503
..505
..511
..516
..517
..519
..519
..520
..521
..521
..523
..524
..527
..527
..528
11.5.2 D ziałanie funkcji składow ej .................................................................................... ..529
11.6 Praca z fragm entem stringu, czyli z su b -strin g ie m ................................................. ..532
11.7 Funkcja sk ład o w a s u b s t r ........................... ........ .... . ..533
11.8 S zukanie z a d a n e g o substrin g u w obiekcie klasy s t r i n g - funkcja f i n d i je)
..534
p o k re w n e .............................................................. ;..........................................................................
11.9 Szukanie ro zp o czy n an e od końca s trin g u .................................................................. ..538
11.10 Szukanie w strin g u jednego ze zn ak ó w z zad an eg o z e s t a w u ............................. ..539
11.11 U su w an ie zn a k ó w ze stringu - funkcje e r a s e ................................................ ..542
11.12 W staw ianie z n a k ó w d o już istniejącego stringu - funkcje i n s e r t ............ ..544
11.13 Z am iana części zn ak ó w na inne zn ak i - r e p l a c e ........................................... ,.547
11.14 Z am iana zaw arto ści obiektu k lasy s t r i n g na C -s trin g ................................. .552
11.15 Z ag ląd an ie d o w n ętrza obiektu klasy s t r i n g funkcją d a t a ....................... .555
1116 W p o rząd k u alfabetycznym - czyli porów nyw anie s tr in g ó w ...................... .557
11.16.1 P o ró w n y w an ie stringów funkcjam i c o m p a r e ............................................. .557
11.16.2 Porównywanie stringów przy użyciu operatorów ==, ! =, <, >, <-, > - .563

Spis treści IX

11.17 Z am iana treści strin g u na m ałe (lub w ielkie) litery.........................................................565
11.18 K opiow anie treści obiektu klasy s t r i n g do w ybranej tablicy znakow ej - funkcja
c o p y 572
11.19 W zajem na za m ia n a treści dw óch obiektów klasy s t r i n g - funkcja s w a p ............ 573
11.20 P rzypisanie d o o b iek tu klasy s t r i n g , funkcja a s s i g n ............................................... 573
11.21 D opisyw anie d o końca stringu za pom ocą funkcji a p p e n a ........................................ 576
11.22 W czytyw anie z k law iatu ry długiego stringu o nieznanej w cześniej długości -
g e t l i n e ...................................................................................................................................................577
11.22.1 P ułapka - czyli jak g e t l i n e m oże Cię zaskoczyć....................................................581
11.23 Iteratory s tr in g u ........................................................................................................................ 586
11.23.1 Iterator do o b iek tu sta łe g o ............................................................................................... 590
11.23.2 Funkcje sk ła d o w e klasy s t r i n g pracujące z ite ra to ra m i...................................... 592
11.24 Bryk - czyli "pam ięć zew nętrzna" p ro g ra m is ty ...............................................................599
11.25 Ć w iczenia.....................................................................................................................................608
12Dpklararie nrzviaźni
| ^ U w W I C i l C l U J C 615
| J l f c y j C I f c M I » « « « » a * « « » « a a « * a« « « « » « a a a « - a a a a a a a a a a a a a a « a a a a a a a a a a a a a a a » a a a a a a a a a a a a a a a a a V I V

12.0. 1 Klasy zap rzy jaźn io n e ....................................................................................................625
12.0. 2 Słowo o z a k re s ie .............................................................................................................. 628
13Struktury, Unie, Pola bitowe...............................................................629
13.1 S tru k tu ra ......................................................................................................................................629
13.2 U n ia .............................................................................................................................................. 630
13.2.1 Inicjalizacja u n ii .................................................................................................................632
13.2.2 Unia a n o n im o w a ............................................................................................................... 633
13.3 Pola bitow e ................................................................................................................................ 634
13.4 U nia i pola b itow e - upraszczają ro zpakow anie s łó w .................................................... 639
13.5 Ć w iczenia.....................................................................................................................................647
14Klasa zagnieżdżona lub lokalna ....................................................... 649
14.1 Z agnieżdżona definicja klasy..................... 649
14.2 Lokalna definicja klasy ......................................................................................................... 654
14.3 Lokalne nazw y ty p ó w ........................................................................................................... 657
14.4 Ć w iczenia.....................................................................................................................................658
15Konstruktory i Destruktory ...............................................................660
15.1 K o n stru k to r................................................................................................................................ 660
15.1.1 Przykład program u zawierającego klasę z konstruktoram i........................................ 661
15.2 Specyfikator (p rzy d o m ek ) e x p l i c i t .................................................................................675
15.3 Kiedy i jak w y w o ły w an y jest k o n stru k to r......................................................................... 675
15.3.1 K onstruow anie obiektów lokalnych ........................................................................... 675
15.3.2 K onstruow anie obiektów globalnych ........................................................................676
15.3.3 Konstrukcja obiektów tw orzonych operatorem new ............................................677
15.3.4 Jaw ne wrywołanie konstruktora ..................................................................................... 678
15-3.5 Dalsze sytuacje, g d y pracuje k o n stru k to r......................................................................680
15-4 D estruktor ............................................................................................................................... 681
15.5 K onstruktor do m n iem an y ....................................................................................................683
15.6 Lista inicjalizacyjna k o n s tru k to ra ........................................................................................ 684
15.7 Konstrukcja obiektu, którego składnikiem jest obiekt innej klasy ........................... 688

X Spis treści

15.8 K o n stru k to ry nie-publiczne 7 ............................. ................................................................. 695
15.9 K o n stru k to r kopiujący (albo inicjalizator k o p iu ją c y ).................................................. 69/
15.9.1 P rzy k ład klasy z k o n stru k to rem k o p iu ją c y m ............................................................699
15.9.2 D laczego p rzez referencję?...............................................................................................
15.9.3 Jak d o stać p iątk ę z C++ ? ......................... 707
15.9.4 K o n stru k to r kopiujący g w aran tu jący n ie ty k a ln o ś ć .................................................709
15.9.5 W sp ó ło d p o w ied z ialn o ść .................................................................................................. 7^
15.9.6 K o n stru k to r kopiujący g en ero w an y a u to m a ty c z n ie ............................................... 710
15.9.7 K iedy k o n stru k to r kopiujący jest niezbędny?
15.10 Ć w icze n ia............
16Tablice o b ie k tó w ......................
161 Tablica o b iek tó w definiow ana o p erato rem n e w .............................................................../z z
16.2 Inicjalizacja tablic obiektów ...................................................................................................7JJ
16.2.1 Inicjalizacja tablic obiektów będących a g r e g a ta m i.................................................724
16.2.2 Inicjalizacja tablic nie b ędących agregatam i............................................................. 728
16.2.3 Inicjalizacja tablic tw orzonych w zapasie pam ięci
16.3 Ć w icze n ia...............................................................................
17Wskaźnik do składników klasy
17.1 W skaźniki zw ykłe - r e p e ty to riu m .... ...............
17.2 W skaźnik d o pokazyw ania n a składnik-daną
17.2.1 P rzy k ład zastosow ania w sk aźn ik ó w do sk ład n ik ó w k la s y ................................... 740
17.3 W skaźnik d o funkcji składow ej .......................................................................................... 747
17.3.1 Z astosow anie w skaźników d o funkcji s k ła d o w y c h ..................................................749
17.4 Tablica w sk a źn ik ó w do dan y ch składow ych klasy ....................................................... 756
17.5 Tablica w sk aźn ik ó w do funkcji składow ych k l a s y ........................................................ 757
17.6 W skaźniki d o składników statycznych ............................................................................. 758
............................................................759
17.7 Ć w iczenia.
18 Konwersje......
18.1 Sformułowanie problemu.....................
18.2 Konstruktory konwertujące..... ...........
18.2.1 Kiedy jaw nie, kiedy n ie ja w n ie ......
18.2.2 Przykład konwersji konstruktorem
18.3 Funkcja k o nw ertująca - o p erato r k o n w ersji..................................................................... 772
18.3.1 N a co konw ertow ać nie m o ż n a ...................................................................................... 778
18.4 K tóry w a ria n t konw ersji w ybrać ?....................................................................................... 779
18.5 Sytuacje, w których zachodzi k o n w e r s ja .......................................................................... 781
18*6 Zapis ja w n eg o w yw ołania konw ersji typów ............ .....................................................782
18.6.1 Advocatus zapisu przypominającego: „wywołanie funkcji" ................................ 783
18.6.2 Advocatus zapisu: „rzutowanie" ...................................................... ........................... 783
18.7 Niecałkiem pasujące argumenty, czyli konwersje przy dopasow aniu ..................... 784
18.8 Kilka ra d dotyczących konw ersji
18.9 Ć w iczenia.........................................

Spis treści XI

.ie operatorów......................... ......................
19.1 P rzełado w an ie o p erato ró w - definicja i trochę te o rii.................................................... 796
19.2 Moje z a b a w k i.............................................................................................................................800
19.3 Funkcja o p erato ro w a jako funkcja s k ła d o w a ...................................................................801
19.4 Funkcja o p e ra to ro w a nie m usi być przyjacielem klasy ................................................ 805
19.5 O peratory p red efin io w an e ................................................................................................... 806
19.6 A rg u m en to w o ść o p erato ró w ................................................................................................. 807
19.7 O peratory je d n o a rg u m e n to w e ............................................................................................. 807
19.8 O peratory d w u arg u m en to w e ............................................................................................. 810
19.8.1 P rzykład na p rzeład o w an ie o p erato ra d w u a rg u m e n to w e g o ................................811
19.8.2 P rz e m ie n n o ś ć ...................................................................................................................... 812
19.8.3 Choć o p erato ry inne, to nazw ę mają tę sam ą ............................................................ 814
19.9 P rzykład zu p e łn ie nie m atem aty czn y .................................................................................814
19.10 C ztery o p erato ry , k tóre m uszą być niestatycznym i funkcjam i sk ład o w y m i...........827
19.11 O perator p rz y p isa n ia = .......................................................................................................... 827
19.11.1 P rzykład na p rzeład o w an ie o p erato ra przypisania ................................................ 830
19.11.2 Jak konieczność istnienia o p erato ra przypisania - o p ow iedzieć p o to czn ie?.....840
19.11.3 Kiedy o p erato r p rzypisania nie jest generow any au to m aty czn ie ........................842
19.12 O perator [ ] 843
19.13 O perator ( ) ................................................................................................................................ 848
19.14 O perator - > ................................................................................................................................ 850
19.14.1 „Z ręczny w sk a źn ik " - w ykorzystuje przeład o w an ie w łaśnie tego o p erato ra .852
19.15 O peratory new, new [ j ............................................................................................................ 859
19.15.1 P rzykład p rzeład o w an ia o p erato ra n ew .......................................................................860
19.15.2 Przykład p rzeład o w an ia o p erato ra new l ] ................................................................. 862
19.16 O peratory d e l e t e , d e i e t e [ ] ........................................................................................... 863
19.16.1 Prosty p rzy k ła d p rzeładow ania d e l e t e ......................................................................864
19.16.2 Prosty p rzy k ła d p rzeładow ania d e l e t e [ ................................................................ 865
19.17 Program p rzy k ła d o w y na zastosow anie operatorów new, d e l e t e ........................... 865
19.18 Przeładow anie globalnych o peratorów new, new [ ] , d e l e t e , d e l e t e [ ] ..............869
19.19 O peratory postinkrem entacji i postdekrem entacji, czyli koniec z
n ie sp raw ied liw o ścią............................................................................................................................. 871
19.20 Rady prak ty czn e dotyczące p rz e ła d o w a n ia ......................................................................874
19.21 Pojedynek: O p erato r jako funkcja składow a, czy globalna............................................876
19.22 Zasłona spada, czyli tajemnica o p erato ra « .................................................................. 878
19.23 Rzut oka w s te c z .........................................................................................................................884
19.24 Ć w iczenia.....................................................................................................................................886

20 Dziedziczenie....................... 890
20.1 Istota d z ie d z ic z e n ia .................................................................................................................. 890
20.2 Dostęp do sk ład n ik ó w ............................................................................................................894
20.2.1 Pryw atne sk ład n ik i klasy podstaw ow ej........................................................................ 894
20.2.2 N iepryw atne składniki klasy po d staw o w ej .............................................................. 896
20.2.3 Klasa pochodna też d ecy d u je...........................................................................................897
20.2.4 Deklaracja d o stęp u u s ir .g - czyli udostępnianie w ybiórcze ..............................899
20.3 Czego się nie d z ie d z ic z y ......................................................................................................... 9 0 3

X II Spis treści

20.3.1 "Nie dziedziczenie" k o n s tru k to ró w .............................................................................903
20.3.2 "Nie dziedziczenie" o p erato ra przypisania .............................................................904
20.3.3 "Nie dziedziczenie" d e s tr u k to r a ................................................................................... 904
20.4 D rzew o genealogiczne............................................................................................................905
20.5 D ziedziczenie - doskonałe n arzęd zie p ro g ra m o w a n ia ................................................ 906
20.6 Kolejność w yw oływ ania k o n s tr u k to r ó w ..........................................................................909
20.7 P rzypisanie i inicjalizacja obiektów w w arunkach dziedziczenia ........................... 915
20.7.1 K lasa pochodna nie definiuje sw ojego o p erato ra p rzy p isan ia............................. 915
20.7.2 Klasa pochodna nie definiuje sw ojego k o n stru k to ra kopiującego......................917
20.7.3 Inicjalizaqa i przy p isy w an ie w ed łu g obiektu w zorcow ego będącego c o n s t ..917
20.7.4 D efiniow anie k o nstruktora kopiującego i o p erato ra przypisania dla klasy
pochodnej ............................................................................................................................... .918
20.8 D ziedziczenie od kilku "rodziców " (czyli w ie lo k ro tn e ).................................. .925
20.8.1 K onstruktor klasy pochodnej p rz y w ielokrotnym dziedziczeniu .......... .927
20.8.2 R yzyko w ieloznaczności p rzy dziedziczeniu .............................................. .929
20.8.3 Bliższe pokrew ieństw o u su w a w ieloznaczność........................................... .932
20.8.4 P o szlak i.................................................................................................................... .932
20.9 Pojedynek: D ziedziczenie klasy, contra zaw ieranie obiektów składow ych .933
20.10 Konwersje standardowe przy dziedziczeniu ............................................... .935
20.10.1 P anoram a korzyści................................................................................................ .940
20.10.2 C zego robić się nie opłaca ................................................................................. .943
20.10.3 T uzin sam ochodów nie jest rodzajem tuzina p o ja z d ó w ............................ .944
20.10.4 K onw ersje stan d ard o w e w sk aźn ik a do składnika k l a s y .......................... ,949
20.11 W irtualn e klasy p o d staw o w e ............................................................................... .951
20.11.1 Publiczne i p ry w atn e dzied ziczen ie tej samej klasy w irtu aln ej............... ,955
20.11.2 U w ag i o konstrukcji i inicjalizacji w p rzy p ad k u klas w irtualnych ........ ,956
20.11.3 Dominacja klas wirtualnych ........................................................................ ,960
20.12 Ć w iczen ia....................................................................................................................... 961

21 Funkcje wirtualne................................................................................ .968
21.1 P o lim o rfiz m ............................................................................................................................ ...975
21.2 Typy rezu ltató w różnych realizacji funkcji w irtu a ln e j................................................ ...979
21.3 D alsze sz c z e g ó ły .................................................................................................................... ...982
21.4 W czesne i p ó źn e w iązanie ................................................................................................ ...984
21.5 K iedy dla w y w o łań funkcji w irtualnych, m im o w szy stk o , zachodzi w czesn e
wiązanie? ........................................................................................................ ...986
21.6 K ulisy białej m agii, czyli: Jak to jest zrobione ? ......................... ...988
21.7 Funkcja w irtu aln a, a m im o to i n l i n e ..................................... ...989
21.8 P ojedynek - funkcje p rzeład o w an e contra funkcje w irtu aln e ...990
21.9 Klasy abstrakcyjne ............................................................................ ...992
21.10 D estruktor? to najlepiej w ir tu a ln y ! ................................................ ...999
21.11 Co p ra w d a , ko n stru k to r nie m oże być w irtualny, ale............... .1004
21.12 R zutow an ie d y n a m i c _ c a s t jest dla typów polim orficznych .1011
21.13 W szystko, co najw ażniejsze.............................................................. .1015
21.14 Finis c o r o n a to p u s ................................................................................ .1017
21.15 Ć w icze n ia............................................................................................... 1018

Spis treści X III

22.1 Biblioteka io s tre a m ............................................................................................................... 1022
22.2 S tru m ie ń ..................................................................................................................................1023
22.3 Strum ienie zd efin io w an e stan d ard o w o ....................................................................... 1025
22.4 O peratory » i « ............................................................................................................... 1026
22.5 D om niem ania w p racy strum ieni zdefiniow anych s ta n d a r d o w o ........................... 1027
22.6 U w aga na p r io r y te t.............................................................................................................. 1031
22.7 O peratory « o raz » definiow ane przez użytkow nika ...........................................1032
22.7.1 O perato ró w w staw iania i w yjm ow ania ze strum ienia - nie dziedziczy się ...1038
22.7.2 O peratory w staw ian ia i w yjm ow ania n ie mogą być w irtu aln e. N iestety.........1039
22.8 Sterow anie form atem .........................................................................................................1041
22.9 Flagi stanu fo rm ato w an ia ................................................................................................ 1041
22.9.1 Znaczenie poszczególnych flag sterow ania form atem ........................................1044
22.10 Sposoby zm ian y try b u (reguł) fo rm ato w a n ia............................................................... 1050
22.10.1 Zm iana sp o so b u form atow ania funkcjam i s e t f , u n s e t f ............................ 1052
22.10.2 D odatkow e funkcje do zm iany param etró w fo rm ato w a n ia............................... 1057
22.11 M a n ip u la to ry ..........................................................................................................................1065
22.11.1 M anipulatory b e z a rg u m e n to w e ..................................................................................1066
22.11.2 M anipulatory p a ra m e try z o w a n e ............................................................................... 1072
22.11.3 D efiniow anie sw oich m anipulatorów .......................................................................1076
22.11.4 M anipulator jako fu n k cja...............................................................................................1077
22.11.5 D efiniow ane m an ip u lato ra z p a ra m e tre m ..................................................................1079
22.12 N ieform atow ane operacje w ejścia/w yjścia .................................................................. 1083
22.13 O m ów ienie funkcji wyjm ujących ze stru m ien ia............................................................1086
22.13.1 Funkcje do p racy ze znakam i i s trin g a m i.................................................................1086
22.13.2 W czytyw anie b in arn e - fu n k q e r e a d i read so zn e .............................................1093
22.13.3 Funkcja i g n o r e .............................................................................................................1095
22.13.4 Pożyteczne funkcje pom ocnicze................................................................................... 1096
22.13.5 Funkcje w staw iające do stru m ie n ia .............................................................................1099
22.14 Strum ienie płynące d o lub od p lik ó w ............................................................................. 1102
22.14.1 O tw ieranie i zam ykanie strum ienia ........................................................1104
22.15 Błędy w trakcie p racy strum ienia ....................................................................................1110
22.15.1 Flagi stanu b łęd u strum ienia ............................................................................... 1111
22.15.2 Funkcje do p racy na flagach b łę d u .............................................................................. 1112
22.15.3 Kilka u d o g o d n ie ń ............................................................................................................. 1113
22.15.4 U staw ianie i kasow anie flag błędu stru m ie n ia ........................... 1115
22.15.5 Trzy plagi - czyli „gotow iec", jak rad zić sobie zb łę d a m i...................................... 1119
22.16 Przykład program u pracującego na p lik a c h .................................................................. 1123
22.17 Strum ienie, a tech n ik a rzucania w y ją tk ó w ..................................................................... 1126
22.18 W ybór miejsca czytania lub pisania w p l i k u ..................................................................1130
22.18.1 Funkcje sk ład o w e inform ujące o pozycji w sk aźn ik ó w ...........................................1132
22.18.2 W ybrane fu nkq'e składow e do pozycjonow ania w sk aźn ik ó w .......................... 1132
22.19 Pozycjonowanie w przykładzie w iększego program u ............................................... 1136
22.20 Tie - harm onijna praca dw óch s tru m ie n i........................................................................ 1 143
22.21 Dlaczego tak nie lubim y biblioteki s t d i o ? ..................................................................1145

XIV Spis treści

22.22 Synchronizaq'a biblioteki i o s t r e a m z biblioteką s t d i o 1148
22.23 S trum ień zapisujący d o obiektu klasy s t r i n g 1150
P rogram p rzy k ład o w y ilustrujący użycie klasy o s t r i n g s t r e a m 1155
22.23.1
22.24 S trum ień czytający z obiektu klasy s t r i n g .................................................................. 1159
22.24.1 P rosty p rzy k ład użycia stru m ien ia istrin g stream .................................................. 1161
22.24.2 W czytyw anie arg u m en tó w w yw oływ ania p r o g r a m u ..........................................1167
22.25 O żenek: stru m ień s t r i n g s t r e a m - czytający i zapisujący do stringu 1170
P rzy k ład o w y pro g ram posługujący się klasą s t r i n g s t r e a m 72
22.25.1
22.26 Ć w iczenia................................................................................................................................. 1174

P rzegląd kilku technik p ro g ra m o w a n ia ......................................................................... 1163
23.1.1 Programowanie liniow e .............................................................................................. 1183
23.1.2 P rog ram o w an ie p ro ced u raln e (czyli "orientow ane funkcyjnie") ......................1183
23.1.3 Programowanie z u k ry w an iem danych .................................................................. 1184
23.1.4 P rog ram o w an ie obiektow e programowanie „b azujące" na o b ie k ta c h ........ 1184
P rogram o w an ie O biektow o O rientow ane (OO) 185
23.1.5
23.2 O w yższości p ro g ram o w an ia obiektow o o rien to w an eg o nad Św iętam i Wielkiej
1186
Nocy
23.3 O biektow o O rientow ane: P ro je k to w a n ie ........................................................................1189
1190
23.4 P raktyczne w skazów ki dotyczące projektow ania p ro g ram u techniką O O
Rekonesans - czyli rozpoznanie zagadnienia .....................1191
23.4.1
Faza projektow ania 1192
23.4.2
E tap 1: Identyfikacja zach o w ań sy ste m u ...................................................................1193
23.4.4 E tap 2: Identyfikacja obiektów (klas o b ie k tó w ).......................................................1193
23.4.5 E tap 3: U system atyzow anie klas obiektów ................................................................1195
E tap 4: O kreślenie w zajem nych zależności klas 1197
23.4.6
23.4.7 E tap 5: Składanie m odelu. O kreślanie sekwencji d ziałań obiektów i cykli
życiowych 1199
1200
23.5 Faza im plem entacji
1201
23.6 Przykład projektowania
23.7 Faza: R o zp o zn an ie naszego z a g a d n ie n ia ........................................................................ 1201
205
23.8 Faza: Projektow anie
23.8.1 E tap 1 - Identyfikacja zach o w ań naszego s y s te m u ................................................ 1205
. i. >■ . . < ___ .•______ j ______ :__n n /:
23.8.2 E tap 2 - Identyfikacja klas obiektów , z którym i m a m y do czy n ien ia................1206
23.8.3 E tap 3 U system atyzow anie klas obiektów z w ystępujących w n aszy m system ie
1210
E tap 4 - O kreślenie w zajem nych zależności klas 2 1
23.8.4
23.8.5 E tap 5 - S kładam y m odel naszego sy stem u ..............................................................1214
23.9 Im plem entacja m odelu naszego sy ste m u ........................................................................ 1218
23.10 Sym fonia C++, C oda
23.11 P o sło w ie .................................................................................................................................... Y2.7&

A. D laczego k o m p u ter nie liczy tak jak my?
A.2 System szesn astk o w y (heksadecym alny)

Spis treści XV

A .3 Ć w iczenia ...1237
Skorowidz 1239

ifrćiAsn*- w

Proszę nie czytać tego! 1

0 Proszę nie czytać tego !
Zaprzyjaźnijmy się !
eśli m am y z e sobą spędzić p arę g o d zin , to p ro p o n u ję - p rzejd źm y na „ty ".

J Moje n azw isk o zobaczyłeś już na okładce, d o d a m w ięc tylko, że książka ta
wstała na p o d staw ie moich d o św iad czeń jako p rogram isty:
♦> w H a h n -M e itn e r-In s titu t1 w B erlin ie-w ó w czas Z ach o d n im (N iem cy),
♦$» w In stitu t d e Recherches S ubatom iques w S trasb o u rg u (Francja),
•t* oraz w G esselschaft fuer S ch w erio n en fo rsch u n g - D arm stad t (N iem cy).
W instytutach tych mój m acierzysty In sty tu t Fizyki Jądrow ej im. H enryka
N iew odniczańskiego PAN (K raków) o d g ry w a znaczącą rolę w ek sp ery m en ­
tach z d zied zin y badania stru k tu ry jądra atom ow ego m eto d am i sp ek tro sk o p o ­
w ym i. E k sp ery m en ty te w ym agają ro zb u d o w an eg o o p ro g ram o w an ia, w k tó re­
go tw orzeniu m iałem zaszczyt uczestniczyć.
Jestem oczarow any jasnością, prostotą i logiką p ro g ram o w an ia w
języ k u C++ i dlatego p ro p o n u ję Ci sp ęd zen ie z e m ną paru chw il
w k rain ie p rogram ow ania obiektow o o rientow anego.

Książka ta jest następcą wydanej przed 10 laty książki "Symfonia C++".
Tam ta 700 stronicow a książka m iał w iele w y d a ń i cieszyła się o g ro m n ą
poczytnością - ale, gdy pojaw ił się d łu g o oczekiw any sta n d a rd języka C ++,
należało napisać n ow ą książkę. To w łaśn ie efekt tej pracy. M am nadzieje, że i tę
książkę czytelnicy polubią, tak jak tam tą starą "Sym fonię C + + ”

1) instytut badań jądrowych

2 Proszę nie czytać tego!

Wstępne założenie
Książka ta jest napisana z myślą o czytelnikach, którym nieobce są takie pojęcia
jak program, instrukcja, dyskietka, monitor. O czyw iście najlepiej by było, gdy­
byś znał już jakiś inny, choćby najprostszy język programowania - wszystko
jedno, czy to będzie BASIC czy język C. Jeśli tak nie jest, to - jak sądzę -
wystarczy Ci 20 minutowa rozmowa z kolegą, który już programuje, lub
przeczytanie jakiejś strony internetowej tłumaczącej, co to znaczy progra­
m ow ać komputer.

N ajk ró cej m ów iąc po leg a o n o n a zm ianie sp o so b u m y ślen ia o p ro g ra m o w a n iu .
T P rz y p o m n ij sobie jak to jest, g d y m usisz n a p isa ć p ro g ra m w z n a n y c h Ci d o tej
p o ry języ k ach p ro g ra m o w a n ia . W szystko je d n o czy to b ęd zie p ro g ra m na
s te ro w a n ie lotem sam o lo tu , czy p ro g ram n a o b s łu g ę ek sp ery m e n tu fizycznego.
O tó ż n ajp ierw starasz się te n k aw ałek rzeczy w isto ści, k tóry m a sz o p ro g ra ­
m o w ać, w y razić za p o m o c ą liczb - zm ien n y ch w y stęp u jący ch w p ro g ram ie.
D ziesią tk i takich z m ien n y ch śą (luźno) ro z rz u c o n e p o T w oim p ro g ra m ie , a s a ­
m o n a p isa n ie p ro g ra m u , to n ap isan ie sekw encji d z ia ła ń na tych liczbach.
T en s a m p ro b lem w ujęciu obiektow o o rie n to w a n y m ro zw iązu je się ta k , że
w p ro g ra m ie b u d u je się m a łe i w iększe m o d e le o b ie k tó w św iata re a ln e g o , po
czy m w y p o sa ż a się je w zach o w an ia i p o p ro s tu p o zw ala śię im d ziałać.
O b ie k te m m o że być ster k ie ru n k u sam olotu, c z y te ż u k ła d elek tro n iczn y p r z e t­
w a rz a ją c y jakiś sygnał. G d y tak ie m odele ju ż w p ro g ra m ie istnieją, w y d a ją sobie
n a w z a je m polecenia - ń p . o b iek t d rążek s te ro w y w y d a je p o le cen ie stero w i
k ie ru n k u , ab y w y ch y lił się 7 sto p n i w praw o .
O b ie k ty n ie pouczają się ja k coś trzeba zro b ić, ty lk o m ó w ią co trz e b a zrobić.
P ro g ra m o w a n ie tą te ch n ik ą - po za tym , ż e je st logiczne, bo o d z w ie rc ie d la
relacje istniejące w św iecie rzeczy w isty m - p ro g ra m o w a n ie tą te c h n ik ą d o s ta r­
cza p o p ro stu dobrej z a b a w y .

Proszę nie czytać tego! 3

Argument o dobrej zabawie
nie p rz e k o n a łb y oczyw iście n ig d y szefó w d u ży ch zesp o łó w pro g ram istó w —
dla nich n ajw aż n iejszy jest fakt, że ta technika p o zw ala, by p rogram iści zn ali się
tylko na s w o im k aw ałk u pracy b ez konieczności o p a n o w y w a n ia całości olb rzy ­
m iego p ro jek tu . P ozw ala ona też na b a rd z o łatw e w p ro w a d z a n ie pow ażnych
m odyfikacji d o p ro g ram u - bez konieczności an g a ż o w a n ia w tę pracę całości
zespo łu . D la te g o ostatniego - p ro g ram o w an ie o b iek to w o o rien to w an e jest
w ręcz jakby stw o rzo n e. Te cechy są ła tw o przeliczan e na p ie n iąd ze - n ak ład y
finan so w e n a p ra c ę zespołu.

Jest tak że p o w ó d , d la którego język C + + zrobił k arie rę n a w e t w śró d p ro g ram i­
stów p racu jący ch pojedynczo, a tak że w śró d am ato ró w . O tóż język ten p o zw ala
na ła g o d n e p rzejście z klasycznych tech n ik p ro g ram o w an ia na technikę o biek­
tow o o rien to w a n ą.

Ta cecha n a z y w a n a jest h y b ry d o w o ścią języka C ++. W p ro g ram ie m o żn a
technikę O O sto so w a ć w takim s to p n iu , w jakim się ją o p an o w ało . Tak też d zieje
się najczęściej — program iści w y b ierają sobie z niego n ajp ierw tylko sam e
„ro d zy n k i" i je sto su ją, a w k ażd y m n astęp n y m p ro g ram ie sięgają p o coś więcej.
W języku C ++ m o żn a pisać n a w e t p ro g ra m y nie m ające z techniką O O nic
w spólnego. T y lko, że to tak, jakby zw ied z ać G ra n a d ę m ając zam k n ięte oczy^.
Dość na tym . O technice O O p o ro zm a w iam y jeszcze w ielokrotnie. T eraz
chciałbym w y tłu m a c z y ć się z p a ru sp raw .

Dlaczego ta książka jest taka gruba?
N ie w y n ik a to w cale z faktu, by język C + + był tak tru d n y . U zn ałe m tylko, ż e to,
co uczy n a p ra w d ę - to p rzy k ład y . W książce w ięc o p ró cz „teorii" są setki
przy k ład o w y ch p ro g ram ó w , a k a ż d y je st szczegółow o o m ó w io n y . P rzy k ład o m
tow arzyszą w y d ru k i pokazujące w y g lą d ekranu po w y k o n a n iu p ro g ram u . To
w szystko w ła śn ie sp raw ia, że k siążk a jest tak o b szern a. Je d n a k w y d ru k i te
załączam w p rześw iad cz en iu , że często łatwiej zo rie n to w a ć się „co p ro g ra m
robi" - rzucając o k iem na taki w y d ru k (ekran). D opiero p o te m ra d z ę an alizo w ać
sam program .

Do w y k o n an ia p rzy k ład o w y ch p ro g ra m ó w uży łem d w ó c h k o m p ilato ró w :
♦> w sy tem ie operacyjnym Linuks: G N U g++ w ersja 3.3.3
*X* w sy tem ie operacyjnym W in d o w s: M icrosoft V isu al C ++ w ersja 6.0
O czyw iście, w k siążce zajm ujem y się sa m y m językiem C ++, w ięc p o w in n a Ci
ona pom óc n iezależn ie od tego, z k tó ry m k o m p u terem i ty p e m k o m p ilato ra
m asz d o czynienia.

2) "...kobieto, daj jałmużnę ślepcowi, bo nie ma większego nieszczęścia niż być ślepcem w
Granadzie..."

4 Proszę nie czytać tego!

Wersja języka
Sam język C++ ciągle się unow ocześnia. Opisuję go tu bez tzw. templates i ex-
ception handling, jako że jest to temat na tyle obszerny iż poświęciłem im osobną
książkę pt. "Pasja C++"ł .
Absolutnym autorytetem w sprawie języka był dla mnie dokument standardu
języka C++ (International Standard ISO/IEC 14882).
W razie jakichkolwiek niejasności odsyłam d o tego tekstu. (Uprzedzam jednak,
że jest napisany w bardzo sform alizowanym stylu i nie nadaje się jako podręcz­
nik do nauki).
W tekście czasem wspom inam o wersji języka. Pamiętać należy, ż e termin wersja
języka nie ma nic w spólnego z wersją kompilatora. Wersja kompilatora to wersja
konkretnego dostarczonego Ci produktu. Tymczasem wersja języka to reguły
gry, w edług których ten kompilator postępuje.

Pióro
Ktoś kiedyś powiedział, że są dwa style pisania - pierwszy to: „-popatrzcie jaki!
ja jestem mądry" - a drugi to: „-popatrzcie jakie to proste". Ja w tej książce
wybieram ten drugi wariant w przeświadczeniu, że prędzej zaprowadzi do
celu. Z drugiej strony wiem, że bezpośredni, wręcz kolokwialny styl tej książki,
zupełnie naturalny w książkach na Zachodzie - w Polsce może zaskoczyć nie­
których czytelników.

Dla kogo jest ta książka?
Pisząc tę książkę musiałem najpierw określić sobie czytelnika, dla którego jest ta
książka. Otóż jest ona dla tzw. szerokiego grona czytelników. Pisałem ją tak, by
była podręcznikiem dla czternastoletniego programisty amatora, jak i dla zawo­
dow ego informatyka. Trudno te sprawy pogodzić, więc są w niej kompromisy
w obu kierunkach. Co do jednego z takich kompromisów mam najwięcej obaw: i

Czołem bracia angliści!
Gdy słyszałem, jak początkujący programiści wymawiają występujące w
języku C++ angielskie słowa takie jak np. „unsigned", „volatile", „width" —
postanowiłem w miejscach, gdzie się pojawiają po raz pierw szy - zamieście
adnotacje o ich wymowie. Wymowa podana jest nie w transkrypcji fonetycznej,
ale za pomocą polskich liter. Wiem, że fakt ten może razić wielu czytelników
Proszę wtedy o wyrozumiałość - pamiętajcie, że ta książka ma służyć równie:
maluczkim. Wymowa podana jest chyłkiem - w przypisie, w nawiasie, a w
dodatku jeszcze w cudzysłow ie- więc nie trzeba jej koniecznie czytać. Spodzie
wam się, że fakt zamieszczenia wymowy nie będzie przeszkadzał Czytelnikom

Są w niej omówione szablony funkcji, szablony klas, klasy pojemnikowe i obsługa sytuacj
wyjątkowych. Zajrzyj do niej jeśli już przeczytasz „Symfonię C++ standard" i ją polubisz.

Proszę nie czytać tego! 5

k tó rzy ję zy k iem angielskim p o słu g u ją się na co d z ie ń o d la t - ale na p ew n o
w z b u d z i p ro te s t tych, k tórzy an g ielsk ieg o nauczyli się p rzed w czo raj.
A sw oją d ro g ą , to n aw et w śró d m oich kolegów fizyków i p ro g ram istó w - nie
sp o tk ałem p o p ra w n ie w ym aw iających słowo: „width".

A teraz o strukturze tej książki
M ożna ją p o d z ie lić na dw ie z a sad n icze części - tę k lasy czn ą, opisującą zw y k łe
n a rz ę d z ia p ro g ram o w an ia, i d ru g ą (zaczynającą się o d ro zd ziału o klasach)
opisującą n a rz ę d z ia d o p ro g ram o w an ia obiektow o o rien to w an eg o . Po tym
w sz y stk im n astę p u je ro zd ział om aw iający operacje w ejścia/w y jścia - czyli
sposo b y p racy z takim i u rz ąd z en iam i zew n ętrzn y m i jak k law iatura, ekran,
d y sk i m a g n ety cz n e. W reszcie n astęp u je rozdział o p ro jek to w an iu p ro g ram u
ob iek to w o o rien to w a n eg o - zaw ierający szczegółow y in stru k taż. U znałem te
sp ra w y z a b a rd z o w ażne, g d y ż często p ro g ram ista m ając w ręce to d o sk o n ałe
n a rz ę d z ie p ro g ra m o w a n ia , jakim jest C ++, nie w ie, co z n im począć.
. ■ Hi f J ł .v • : .f ' i . h . ^ .Ł* a
Metodą kolejnych przybliżeń
N ie liczę n a to, ż e czytając tę k siążk ę zro zu m iesz w sz y stk o od razu. W ręcz
p rzeciw n ie - w tekście w ielokrotnie su g eru ję, byś o p u śc ił n iektóre p arag rafy
p rz y p ie rw s z y m czytaniu książki. N ie w szystkie a s p e k ty są w ażn e ju ż na
sam ym p o czą tk u nauki. Lepiej m ieć n ajp ierw ogólny p o g lą d , a do p iero p o tem
zagłębiać się w tru d n iejsze szczegóły. T e fragm enty p o p rz e d z a zw y k le zn aczek
X Licząc n a to, ż e p o p ierw szym czy tan iu całości w n ie k tó re miejsca w rócisz -
p e w n e fra g m e n ty tekstu o p atrzy łem ta k że adnotacją: „ d la w tajem niczonych".
Są tam u w a g i w ybiegające nieco d o p rz o d u , ale d o ty c zące sp raw , k tó re p o
p ie rw szy m czy ta n iu będziesz ju ż p rzecież znał.

N ie szan u j tej książki. P rzygotuj sobie kolorow e (tzw . niekryjące) flam astry
i czytając zak reślaj w ażn e dla C iebie w y ra z y czy m yśli. N a m arg in esach p isz
ołów kiem sw o je u w a g i i kom entarze. C h o ciażb y m iały to b y ć teksty ty p u „C o za
bzdura!" a lb o „ N ie rozum iem d laczeg o ..." albo „p o ró w n aj d w ie stro n y w cześ­
niej". Ta a k ty w n o ść zaprocentuje Ci naty ch m iast, bo m ając tak osobisty s to s u ­
nek d o te k stu , ła tw iej koncentrow ać n a n im u w ag ę - co je st w a ru n k ie m sine qua
non szybkiej nauki.

Jeśli znasz język C „klasyczny” (czyli tzw. ANSI C)
to za p e w n e p ie rw sz e rozdziały będ ą d la Ciebie w y ra ź n ie z a łatw e. M im o to
rad zę je p rzejrzeć, chociaż p o b ieżn ie, g d y ż w y stęp u ją p e w n e ró żn ice w
językach C i C ++ - n aw et na ty m etap ie (oczyw iście na k o rzy ść C++).
G orąco n a to m ia st zachęcam d o u w a ż n e g o p rzeczy tan ia ro z d z ia łu o w sk a ź n i­
kach. Z d o św iad cze n ia w iem , ż e te s p ra w y zna się zw y k le najgorzej. T y m cza­
sem zaró w n o w klasycznym C jak i w C ++ w skaźnik je s tb a rd z o w ażn y m i p o ż y ­
tecznym n arzę d ziem . D latego te n ro z d z ia ł tak ro zb u d o w ałe m .

6 Proszę nie czytać tego!

Szukajcie, a znajdziecie
N a koniec uw ag a zec ersk a . W tekście k siążk i często w ystępują p rz y p isy u dołu
stro n y . Jeśli - z p rz y c z y n ty p o g raficzn y ch —jakiś przy p is nie b ę d z ie m ógł się
pojaw ić się u d o łu stro n y , n ależy g o sz u k a ć n a stronie następnej.

Podziękowania
W inien jestem w d z ię c z n o ść p rzyjaciołom , k tó rz y w jakiś sposób p rzy czy n ili się
d o p o w stan ia tej k siążk i. Byli to: Sven B laser, O laf Boebel, Jo h a n n e s Diemer,
Jeffrey E rxm eyer, B engt Skogvall, Kai S o m m e r, K laus Spohr, Joachim Steiger i
D etlef W eid en h am m er. Z u p e łn ie w y ją tk o w e p o d zięk o w an ia n a le ż ą się Sycylij­
czy k o w i P ierpaolo F ig u era za w iele g o d z in , k tó re mi pośw ięcił. P oniew aż ta
k siążk a pisana b y ła o d ra z u p o p o lsk u , d la te g o ża d e n z nich n ig d y jej nie czytał.
W szy stk o , co d o b re w tej książce, jest je d n a k ich zasługą; w sz y stk o , co złe - to
w y łącz n ie moja w in a . Jestem w in ien w d z ię c z n o ść p ierw szy m czy teln ik o m tej
książki: M irkow i Z ięb liń sk iem u i B ożenie P o tem p ie. Ich u w ag i k ry ty cz n e sp ra­
w iły, ż e książka sta ła się lep sza, ich u w a g i p o z y ty w n e - z a w s z e w p raw iały
m nie w d o b ry nastrój.
O czyw iście na p e w n o n ie je d n o da się w tej k siążc e popraw ić. Jeśli b ęd ziesz m iał
jakieś u w ag i, to p ro sz ę p rzy ślij mi je po cztą elek tro n iczn ą na a d re s:
j e r z y . g r e b o s z 0 i f j .e d u .p l
lu b p o cztą trad y cy jn ą na a d re s w y d aw n ictw a. Z gó ry w y rażam m oją w dzięcz­
ność z a n aw et n a jd ro b n iejsze przyczynki.
K od źró d ło w y p rz y k ła d o w y c h p ro g ra m ó w z tej książki m o ż n a sobie łatw o
s p ro w a d z ić z m oich stro n W W W w In ternecie. Jej obecny a d re s to:
h t t p : / / w w w .i f j . e d u .p l/~ g r e b o s z
N a w e t jeśli ten a d re s się k ied y ś zm ieni - ła tw o zn aleźć n o w ą lokalizację za
p o m o c ą intern eto w ej w y sz u k iw ark i pod ając h a sło "SYMFONIA C ++", lub moje
n azw isk o .
N a k o n iec w y p a d a mi się w ytłum aczyć z ty tu łu tego w stęp u . C hciałem tu
p o w ie d z ie ć p arę w ażn y ch , ale i trochę n u d n y c h spraw . W iedząc, ż e czytelnicy
najczęściej o p u szczają w stę p y - d ałem taki ty tu ł podejrzew ając, ż e zak azan y
ow oc najlepiej sm akuje.

1. ..za w a rte są m iędzy dw om a n aw iasam i klam row ym i: {j W naszym p rz y p a d k u w funkcji m a in jest tylko jedna instrukcja 1) ang. trzeb a pisać.Rozdz. P ro ­ gram ow ać w d a n y m języku m ożna n auczyć się tylko pisząc w nim program y. T ę sam ą zasadę m ożna zastosow ać do piszących program y.1 P ierw szy p ro g ra m t i n c l u d e < io str e a m > i n t m a in () { std ::c o u t « "Witamy na p o k ła d z ie " .główna [czytaj: „mejn"]. Startujem y! 7 Pierwszy program 1 Startujemy! by pisać.jej ciało — czyli innym i sło w y instrukcje w y k o n y w an e w ram ach tej funkcji . Dlatego b ez d alszy ch w stępów n ap iszm y nasz 1. main . ) Wykonanie tego programu spowoduje pojawienie się na ekranie tekstu: Witamy na p o k ła d z ie Przyjrzyjmy się bliżej temu programowi W każdym p ro g ram ie w języku C++ m u si być specjalna funkcja zw ana ma i nA O d tej funkcji zaczy n a się w y k o n y w an ie program u. Treść tej funkcji . .Taką ra d ę zw ykło się d a w a ć początkującym li­ A teratom ...

Dzięki temu. Ogólnie mówiąc. 2) skrót od ang. Otóż. FORTRAN'ie. z których ewentualnie można korzystać. jeśli ma to być numei etykiety . To bardzo korzystna cecha. opera­ cje w ejścia/w yjścia .8 Rozdz. Program p isze się umieszczając kolejne instru­ kcje w linijkach jedna pod drugą.czyli pc prostu na ekranie . w niektórych językach programowania (np. a następnie zapoznał się z nim. że życzym y sobie. że operacje związane z wprowadzaniem i wy­ prow adzaniem informacji na urządzenia takie. Funkcje odpowiedzial­ ne za te czynności są w jednej ze standardowych bibliotek.nie są częścią definicji języka C++. że kompilator zapoznaje się z tym i deklaracjami - może od tej pory sprawdzać nas. 1. BASICu) obowiązują ścisłe reguły określające pozycję (w linijce). Skrót c o u t 2 w ym aw ia się p o polsku Si-aut.włącz (np. czy posługujemy się tym i funkcjami poprawnie. wrócimy do tej spraioy. że tenże plik nagłówkowy biblioteki zawiera dokładne deklaracje funkcji bibliotecznych. to stawiamy go w kolumnie pierwszej. /S IO ' 1 L łłT t li ODOi y V Wolny format zapisu programu A teraz uwaga natury ogólnej. fragm ent tekstu). że nazwa co u t . która sprawia.wstaw. jak np. tylko nie: Ś i-a u ł ! ) Co oznacza s t d : : ? Na razie trudno mi to dobrze wyjaśnić. C-onsolc OUT-put 3) ang. Startujem y! Pierwszy program s t d : : c o u t << "W itam y n a p o k ł a d z i e " . Na razie niech to wystarczy.ma się pojawić tekst. jeśli chcem y umieścić znak kontynuacji z poprzedniej linijki — to um ieszczam y gc w kolumnie szóstej.czyli wyprowadzić na ekran tekst. Dla zainteresowanych dodam.Jeśli chcemy umieścić znak komentarza.jest nazwą z biblioteki standardowej. by kompilator przed przystąpieniem do pracy nad dalszym i linijkami programu w staw ił ^ w tym miejscu tak zwany plik nagłów kow y biblioteki io s tr e a r a .czyli tzw. którą ma podjąć c o u t . . zam ieszczony tu w cudzysłowie. Abyśmy m ogli z takiej biblioteki skorzystać w pro­ gramie. Operacje wejścia/wyjścia N ależy tu wyraźnie podkreślić.to do tego służą kolum ny 1-5. B iblioteką tą zajm iem y się bliżej p o d k o n iec tej książki. U m ieszczony na końcu średnik jest znakiem końca instrukcji. jest to powiedze­ nie. • Np. Znaki << oznaczają w łaśnie akcję. ż e na standardow ym urządzeniu wyjściowym c o u t . m usim y na początku umieścić linijkę # in c lu d e < io s tr e a r a > która oznacza. na której dany składnik instrukcji m oże się znaleźć. ekran . w FORTRAN'ie . mclude [czytaj: „inklud"] . w które zwykle w yposażane są kompilatory. (Błagam.

K rótko m ów iąc . Z araz. Jeśli nam n a ty m w cale nie zależy . w d o w o ln y m m iejscu in s tru k q i m ożna przejść do now ej linii i ta m k o n ty n u o w ać p isanie.owad.Rozdział. b iałe zn ak i . lecz program iście. W k o m p u te rz e e d y to r tekstu to n a rzę d zie p rzezn aczo n e w łaśn ie do p is a n ia tek stó w . czy n aw et zn ak i n o w ej linii. Są to tzw. Białe znaki W ew n ątrz in stru k c ji m ożna p o staw ić d o d a tk o w e zn ak i spacji i tabulatory. d ebuggerów )4 m a m y m ożliw ość ś le d z e n ia w y k o n y w a n ia p ro g ra m u krokow o: linijka za linijką. a n a w e t zostać ro zp isan e na 10 linijek. W języ k u C ++ je st inaczej.białe. Język C + + (p o d o b n ie jak C) jest językiem o tzw. dcbuggcr [czytaj: „debager"! .. P o s łu g u ­ jąc się ed y to rem tek stu m ożna napisać list d o kolegi. } N ik t ro z s ą d n y je d n a k tak nie robi z d w ó c h p o w o d ó w : <♦ p ro g ra m staje się w ted y niep rzejrzy sty . Znaki te n a p o tk a n e w e w n ą trz instrukcji są p raw ie zaw sze ig n o ro w a n e .. z a ra z . Z atem . stąd ang. Poza n ie licz n y m i sytuacjam i. k tóry staw iam y na końcu. te k s t a rty k u łu p o p u la rn o ­ n au k o w eg o lu b n ap isać tekst p ro g ram u C++. D o b rze je st w ięc m ieć w je d n e j linijce ty lk o jedną instrukcję. ale p rz e z śred n ik . ♦> k o rzy stając z różnych specjalnych n arzę d zi d o u ru c h a m ia n ia p ro g ra ­ m ó w (tzw . to m o żem y ró w n ie d obrze napisać p ro g ra m tak: tinclude <iostream> i n t m a in () { s t d : : c o u t « " w ita m y na p o k ł a d z i e " . b o na p ap ierze objawiają się jako n ie z a d ru k o w a n e . ż e ko n iec instrukcji okreś­ lany jest nie p r z e z koniec linii.nie ma żad n y c h p rzy m u só w . Startujem y 9 Pierwszy program • P o d o b n ie w BASIC'u . żeb y p ro g ra m w yglądał czytelnie.jakby: „odpluskw iacz" . W szystko m oże zn aleźć się w k ażdym miejscu linii. Narzędzia do edycji tekstu programu M am y zatem n a p isa n y gotow y tekst p ro g ra m u . To d latego. w o ln y m fo rm acie. biig . Z w yk le m a m y d o w yb o ru kilka różnych ed y to ró w . 1. P o m a ­ ga w ty m . n asza instru k cja rów nie d o b rz e m o głaby w y g ląd ać tak: stć::cout << "w itam y na p o k ł a d z i e ” i W staw ian ie b ia ły c h zn ak ó w służy n ie k o m p ilato ro w i.linia instrukcji m u si się zacząć od n u m e ru etykiety. C zy k a ż d y z n ich n a d a je s ię d o pisania p ro g ra m u ? 4) ang. A w łaściw ie to jak m y śm y go n ap isali? N apisaliśm y go p o słu g u jąc się tak z w a n y m ed y to re m te k stu .

c p p " . jest d la k o m p u te ra n iezro ­ zu m iały . p isania tłu sty m d ru k ie m itd. T o d latego. Startujem y! Pierwszy program N ie. Jak ro z p o z n a ć czy e d y to r nad aje się d o p is a n ia pro g ram ó w ? P ro sty m sposobem je st sp ra w d z e n ie czy tw o rz ą c d o w o ln y te k s t m o ż esz go p o tem za p isa ć na dysku z ro zszerze n iem " . a n ie in n ą czcionką (lub tłu sty m drukiem ). T akiego e d y to ra n ie w ybieraj. z edytorem tekstu zwanym Microsoft Word. n a z w ie " p r ó b a . m a on sw ój w ła s n y s ta n d a rd z ap isu . E d y to r m o ż e też d o d a w a ć na p o czątk u p lik u jakieś inform acje o rozm iarach p a p ie ru czy o d leg ło ści tek stu o d m a rg in e su stro n y . C zyli czy m o ż e sz stw o rzy ć plik o przykładow ej. P o m y ślałeś p e w n ie te ra z : "-T o m oże b y ć coś więcej?" M oże. Ten edytor został stworzony z myślą o pracy sekretarki. pliku te k sto w e g o zaw ierająceg o ty lk o te znaki. K o leg a m oże Ci p o ra d z ić coś b a rd z o d o b reg o . N ie w ła śc iw y e d y to r m ó g łb y p ró b o w a ć d o d a ć d o tekstu n aszeg o progra­ m u jakieś d o d a tk o w e z n a k i sterujące .w y b ie rz najprostszy. S k o m p ilo w a n ą. T ym czasem m y tych w szys­ tkich d o d a tk ó w nie ch cem y . który do pisania programu C++ sianie nadaje. kto na p o d o b n y m k o m p u terze. (Kod źró d ło w y ). N ajlepiej je d n a k zap y tać k o g o ś. n ie k a ż d y . Jeśli p ro g ram n a rz u c a Ci jakieś w łasn e ro zszerzen ie . w takiej postaci. a nie pracy programisty. Jak w y b rać? Jeśli n ie jesteś p ew ien . je st to te k s t źró d ło w y programu. C z y m ożna ju ż taki p ro g ram u ru ch o m ić? Nie! Kompilator P ro g ram w takiej p o staci. bo są ed y to ry specjalnie tw o rz o n e do p isa n ia p ro g ra m ó w C++. M ów im y że. że cały tekst n a p is a n y tak ą. ż e te k st naszego p ro g ram u (po zakoń­ czen iu p is a n ia go) m a zo stać z ło ż o n y na d y sku p o staci tzw . Jeśli masz jakieś doświadczenia np. . Są w n im litery i jakieś słow a w języ k u C++. k tó ry nie d aje m o żliw o ści zm ian y czcio n k i. k tó ry e d y to r w y b rać . które nap isaliśm y i nic więcej.j c h a ra k te ry sty c z n e d la tego ed y to ra . jem y sk o m p ilo w an ą w ersję naszego p ro g ra m u . u ży w ają c p o d o b n e g o sy stem u op eracy jn eg o p is z e p ro g ra m y w C++.n a p rz y k ła d m ów iące o ty m . to jest to właśnie przykład edytora. 1. T aki. M am y z a te m n a p isa n y i zło żo n y na d y sk u p lik z tek stem p ro g ra m u . jak to w łaśnie n ap isaliśm y . ale p rzec ież p rocesor n aszeg o k o m p u tera n ie zareag u je na tak ie litery.to n ajp ra w d o p o d o b n ie j o z n a c z a .10 Rozdz. czyli p rz e tłu ­ m aczo n ą na język m a szy n o w y .c p p " .

1. Z atem d o n a s z e g o p ro g ram u m u si zo stać d o łączo n a ta biblioteka. Jeśli rozszerzeniem jest c p p . Startujem y 11 Pierwszy program T aka s k o m p ilo w a n a w ersja jest. to instru k cje obliczające ten sin u s zło żo n e są w łaśn ie w b ib lio tek ach . k tó re k toś inny dla nas n ap isał. ale zw ró ć u w a g ę . Je d n a k w p ro g ra m ie . nie m a o b liczan ia sinusa. Z resztą najczęściej w cale n ie m u sisz m y śleć o lin k o w an iu . k tóry w łaśn ie n ap isaliśm y . n ie p o trze b u jem y tu ż a d n y c h m a tem a ty ­ cznych b ib lio tek . ju ż w języ k u p rocesora. a m y m o ż e m y się nim i po słu ży ć.m u si zostać p o łą czo n a z tak z w a n y m i bibliotekami. wówczas kompilator podejdzie do pracy jak do programu w języku C++. Z au w aż: P rz y łą c z e n ie funkcji b ib lio teczn y ch n a stę p u je d o p ie ro w czasie lin- k o w a n ia . P rz y k ła d o w o .jeśli w p ro g ram ie sk o rzy stasz z o b liczan ia sin u sa k ąta. Po co n am w ięc b ib lio te k i? R zeczyw iście. ż e jest w n a sz y m p ro g ra m ie instrukcja w y p isy w a n ia te k s tu na ekranie. M y u ży w ać b ę d z ie ­ m y s fo rm u ło w a n ia linkow anie w z g lę d n ie łączenie. N asza d y re k ty w a (instrukcja) # i n c l u d e z a p o z n a ła k o m p ila to r jed y n ie z s a m y m n ag łó w k iem b ib lio tek i. P o trzeb n y byl o n p o to. by ktoś n a z y w a ł to inaczej. i w C++. W ża rg o n ie p ro g ra m istó w etap te n o k reślan y jest to ja k o lin k o w a n ie. b o k o m p ilato r sam u ru c h a m ia ten p ro ces. Wówczas trzeba im powiedzieć. w jakim języku jest napisany program przedstawiony właśnie do kompilacji. ale jest jeszcze n ie p e łn a . O peracja lin k o w a n ia nie jest tru d n a .Rozdział. P o p ra w n e . które mogą kompilować programy napisane i w klasycznym C. N ie sły sza­ łem . la n so w a n e n ie g d y ś o k reślen ie „konso lid acja" i „ k o n so lid o w a n ie " . by k o m p ilato r m ó g ł s p ra w d z a ć p o p ra w n o ś ć n a sz e g o o d n o s z e n ia się d o biblioteki. ch y b a się nie p rzyjęło. Jednym ze sposobów powiedzenia tego może być rozszerzenie nazwy naszego progra­ mu. N ato m iast s a m a treść funkcji b ib lio te­ cz n y c h d o łączan a jest d o p ie ro na etap ie lin k o w a n ia . T a in stru k cja k o rzy sta z biblio tek i zaw ierającej funkcje (p ro c e d u ry ) pracy z u rz ą d z e n ia m i takim i jak ek ra n czy k law iatu ra. Czyli nasz program powinien się nazywać na przykład m o j_ p r o g r . a w n iektórych k o m p ilato rach . co p ra w d a . W te d y jest to ty lk o jed n a k o m e n d a. c p p . W p o staci ju ż sk o m p ilo w an ej.n aciśn ięcie jed n eg o ty lk o klaw isza. Uwaga: Są kompilatory. Linker Biblioteki z a w ie ra ją d o d atk o w e in stru k cje p ro g ra m u .

w którym pracował program. a w dodatku mamy w nim ikony-przyciski. . «$♦ kompilacji. Jak Twojego kompilatora używać . w jakim środowisku tworzenie programu pójdzie najsprawniej. za pomocą którego piszem y program.. które służą do tworzenia programów C++. 5) Uwaga: Niektóre systemy operacyjne. a w osobnym okienku pojawia się bliższe wyjaśnienie błędu. Jeśli pracujesz z system em operacyjnym Linuks. byś teraz spróbował uruchomić nasz program na swoim komputerze. Niestety nie m ogę Ci tu nic pomóc. W ażne tu jest byś opanował technikę kompilacji i linkowania. czytelniku. 1. Innym przykładem jest Microsoft Visual C++. A teraz do dzieła W rezultacie trzech etapów pracy nad programem: ♦♦♦ edycji.1. w ów czas możemy spróbować zm odyfikować ten program. linkowania otrzymaliśmy program w wersji nadającej się do uruchomienia. Jeśli gdzieś w tekście programu popełniliśm y błąd składni. Środowisko miał (w odległych czasach) kompilator Borland C++ 3. tuż przed klamrą kończącą funkcję m a in . Startujem y! Pierwszy program Środowisko programowania M oże być jeszcze piękniej. W tedy trudno jest zobaczyć wydruk ekranu . Istnieje bardzo w iele typów komputerów i w iele różnych typów kompilatorów. Kiedy już program zadziała poprawnie i na ekranie5 pojawi się nasz tekst Witamy. umieszczając na końcu programu. Jednak sama idea środowiska jest tak dobra.12 Rozdz. Mimo że program jest prymitywny. . Otóż specjalnie dla programistów stworzono narzę­ dzia.. Warto rozejrzeć się (lub popytać). Mamy w ięc jakby edytor.musisz przeczytać w swojej dokumentacji lub zapytać kolegę. W nim spędzam najwięcej mojego czasu. Dziś są jego nowsze wersje (Borland Builder C++) dostosowane do pracy z systemem operacyjnym W indows. to kursor podświetla miejsce błędu. Zachęcam Cię. że zaw sze będzie jakieś do dyspozycji. po naciśnięciu których odbywa się kompilacja i linkowanie naszego programu. Takie narzędzie zw ane jest śro d o w iskiem program ow ania i bardzo przyspie­ szają pracę programisty. . Możesz się przed tym ustrzec.gdyż system operacyjny od razu go likwiduje. następującą tajemniczą instrukcję: s y s te m ( " p a u s e " ) . (np. to jest tu środowisko o nazwie KDevelop. Oczywiście te wzm iankowane tutaj przeze mnie nazwy produktów mogą za jakiś czas zostać zapomniane. MS Windows) natychmiast p o zakończeniu program u zamykają także okienko.

2 Drugi p ro g ram Zobaczyliśm y w łaśnie sposoby w ypisyw ania inform acji n a ekranie.i ' . W obu sytuacjach rezultat na ek ran ie będzie ten sam: lecimy na wysokości 3500 stop Dlaczego w łaściw ie możliwe jest tak w ygodne składanie . w którym poprzednia skończyła. Dalszy ciąg tekstu w y p isyw any jest poniżej. E w entualna n astęp n a instrukcja w y p ro w ad zan ia tekstu zaczn ie go w ypisyw ać od miejsca. f 6 s *'* • .n ie m ogę Ci jeszcze teraz wyjaśnić. To się n am b ard zo szybko p rzyda. O to on: Program na przeliczanie wysokości podanej w stopach na wysokosc w metrach.. Z atem dw ie instrukcje std::cout << "Witamy \nna pokładzie". M usisz być cierpliw y i doczytać do ro zd ziału o bibliotece iostream. spow odują pojaw ienie się na ekranie tekstu Witamy na pokladzieLecimy na wysokości 3500 stop . że tekst w y p isan y na ekranie w y g ląd ał będzie następu­ jąco: Witamy na pokładzie Znak \n (n . std::cout << "wysokości 3500 stop". W środek tekstu ujętego w cudzysłów w p isz­ m y znaki \ n "Witamy \nna pokładzie" Zm iana ta spow oduje. • i r b a i r s r . A zatem p ie rw szy eksperym ent. Startujem y! 13 D rugi program D ziałania te p o zw o lą nam bliżej zap o zn ać się z techniką w ypisyw ania na ekran. .jak: new linę. ż e w trakcie w ypisyw a­ nia tekstu na ekranie następuje przejście do now ej linii. std::cout « "Lecimy na " « "wysokości 3500 stop". czy też m oże złożym y te instrukcje i zapiszem y krócej std::cout << "lecimy na " << "wysokości 3500 stop". 1.. N ato m iast z w czytyw aniem danych z k law iatu ry spotykam y się w naszym d ru g im program ie. 1. czyli: now a linia) pow oduje. •• ■’ ■ ■ N ie ma też zn aczen ia czy napiszem y std::cout << "lecimy na ".Rozdz.

Są o n e jed n ak b a r d z o p o ży teczn e dla p ro g ra m isty . // przelicznik: // stopy na metry std::cout << "Podaj wysokosc w stopach: ". co std::cout « std::endl. Komentarze Ju ż n a p ie rw sz y r z u t o k a w id ać. To zn aczy . // właściwe przeliczenie iitsj }V/ •'f • \ '< ■ ■' •l 'v iA '■ n ' ■ • •: std::cout << "\n". / / -----wypisanie w y n i k ó w --------- std::cout << stopy << " stop . Są to k o m e n ta rz e . Startujem y! D rugi program Ćwiczymy tu operacje wczytywania z klawiatury i wypisywania na ekranie tinclude <iostream> int main() int stopy. jaki sp o só b k o m e n ta rz a w d a n y m m iejscu w y b ra ć . U w aga: Kom entarze typu / * .14 Rozdz.to także w id z im y w p rzy k ład zie. Sposób ten zasto so w aliśm y n a p o czątk u p ro g ra m u . 1. //to samo.trak tu jąc je ja k o k o m en tarz. 7 nie mogą b yć w sobie zag nie żd żan e . P ierw szy sp o só b to o g ran ic zen ie jakiegoś tekstu z n a k a m i / * (z lewej o raz * / (z p raw ej). D ru g i sp o só b to z a sto so w an ie z n a k ó w / / (dw a u k o śn ik i).to jest: " << metry << " metrow\n". W języku C ++ k o m e n ta rz e m o żn a tw o rz y ć dw ojako. co w d a n y m m iejscu p ro g ra m u chcieliśm y zrobić. K o m en tarze są tek stam i z u p e łn ie ig n o ro w an y m p rz e z k o m p ilato r. std::cin >> stopy. K om entarz tak m o że się ciąg n ąć p rz e z w iele linijek . ż e n ie p o p ra w n a jest tak a fo rm a /* KOMENTARZ "ZEWNĘTRZNY" TAK SIE CIĄGNIE /* komentarz wewnętrzny */ DOKOŃCZENIE ZEWNĘTRZNEGO */ Chciałoby się powiedzieć: niestety! Możliwość zagnieżdżeń komentarzi byłaby czasem bardzo pomocna.zastosuj / / czyli d w a u k o śn ik i. Jeśli n ie w iesz. // Do przechowania danej wejściowej double metry.3. . . . że w p ro g ra m ie pojaw iły się o p isy w „lu d zk im ' ję zy k u . K o m p ilato r p o n ap o tk an iu ta k ie g o zn ak u ig n o ru je resztę zn ak ó w dc końca linijki . // Do wpisania wyniku double przelicznik = 0. bo p rz y ­ p o m in ają n am . // przyjęcie danej // z klawiatury metry = stopy * przelicznik.

Nagle chcielibyśmy zrezygnować chwilowo z 10 linijek. Usunąć je z procesu kompilacji.. W fu nkcji m a in z a u w a ż a m y linijki: . jest to jeszcze d la Ciebie jasne. g d y Ty b ęd ziesz ju ż pisał w języ k u C + + sy stem y o p erac y jn e. a p rz e d e w szy stk im szybko zniechęcisz. JeśliT w ój e d y to r n ied aje Ci takiej m ożliw ości. pięćdziesięciu linijek zn ak ó w / /. . Jeśli jednak w rzeczonym fragmencie programu są ju ż jakieś komentarze typu / * ■ . jeśli w ted y . D la sam ego siebie i d la tych.*/ cout « "Proszę zapiać pasy.. Zmienne D osyć ju ż o k o m en tarzach .T a k i e d y to r zrobi to z a nas.// niech sie modlą -------------------------------------------------------. k tó re z a ­ stosow ałeś. O pisuj p rz e d e w szystkim w sz y stk ie „ k ru c z k i" . P raca z k o m e n tarzam i jest tak p o w sz ech n a. N a koniec d o b ra rada n atu r)' ogólnej: O pisuj z n a c z e n ie każdej zm ien n ej.b o z m ę c z y s z się. Robi się to przez ujęcie tych linijek w symbole komentarza: / * oraz * / . W ted y nie grozi n am k o n ieczn o ść w p isy w a n ia w każdej z np . * / . a drugi na końcu tych 10 linijek. Jeśli m asz in stru k cję w y p isu jącą na ek ran ie liczbę 7.także s p ra w n ie u su n ie k ażd y z z az n aczo n y ch k o m e n tarzy . Naturalnym odruchem jest wtedy przerobienie tego fragmentu na komentarz.Rozdział. N ie opisuj je d n a k rzeczy oczyw istych. to kompilator (nie pozwalający na zagnieżdżanie ich) uzna to za błąd.\n". k tó rz y m o d y fik o w ać b ę d ą T w o je p ro g ram y w te d y . . shr 208). (Patrz rozdz. // opis sytuacji i cout « "Nie ma szans ratunku \n". cout << "Uwaga pasażerowie: \n”. to nie pisz k o m e n ta rz a / / w y p i s a n i e l i c z b y 7 . że ed y to ry d o p isan ia p ro g ra m ó w w C++ oferu ją często m ożliw ości u jm o w an ia w z n a k i k o m en tarza w y b ra n e g o m y szk ą fra g m e n tu tekstu. o p rep ro ceso rze. O pisuj rzeczy w ażne. /* chwilowo rezygnuje z tych dwóch linijek --------- cout « "Pali sie drugi silnik \n". o p isu j te ż to. A g d y się ro z m y ślim y . co w d a n y m fragm encie p ro g ra m u robisz. g d y to p iszesz. Startujem y! 15 D rugi program Wyobraźmy sobie kawałek większego programu. ale nie skasować zupełnie. 1. wyposażonego już w ko­ mentarze. w ró ćm y d o naszeg o d ru g ie g o p ro g ra m u . to m o ż e sz sobie p o rad zić sto su jąc tak z w a n ą kom pilację w a ru n k o w ą . opisuj funkcje i ich a rg u m e n ty . N aw et.stawiając pierwszy symbol na początku.

Te jfj sło w a k lu c z o w e to: rr\y/F fl«of asm auto bool break case catch char ciass const const cast continue default delete do double dynamie cast else enum explicit export extern false float for friend goto if inline long rautable namespace int operator private protected new public register reinterpret_ cast return short signed sizeof static static cast struct switch template this throw true typedef typeid typename try union unsigned using virtual void volatile wchart t while P oza ty m d o s ta n d a rd u C++ w p ro w a d z o n o a lte rn a ty w n e "słow ne" re p re z e n ta - cje kilku o p e ra to ró w . jeśli w y m y śla m y sw oją n azw ę. bo często kompila­ tor używa tego sposobu do swoich celów. Z m ien n y m tym n a d a ­ liśm y n a z w y : s t o p y o ra z metry. gdyby takiznakmiał wystąpić na samym końcu nazwy . double metry. by z a ich pom ocą o d n o s ić się w p ro g ra m ie d o naszych zmiennych.o g ó ln ie m ów ić b ę d z ie m y : d o o b iektó w . tak przez nas w y b ra n e . and and eq bitand bitor compl not not^_eq or or eq xor xor_eq Z atem . Jest to chyba ważne. bo przypomina cyfrę 0 (zero). Są to d e f in ic je zm iennych w y stęp u jąc y ch w p rogram ie. b y opisyw ały z a sto so w a n ie tych zm ien n y ch . bo na ekranie przypomina ona cyfrę 1. M ożna jednak zap y tać ogólniej: Co może być nazwą w języku C++ ? M oże to b y ć d o w o ln ie d łu g i ciąg liter. którzy odradzają używanie wielkiej litery O . Startujem y! D rugi program int stopy. N az w y są n a m p o trze b n e po to. M ałe i w ielkie litery w n a z w a c h są rozróżniane. by w y m y śla n e p rzez C iebie n azw y . N a z w y te są. 1. to m u sim y u n ik a ć p o w y ż sz y c h słów . cyfr o raz zn ak ó w p o d k reślen ia N azw a nie m o że się z a c z ą ć o d cyfry. Są też mądrzy ludzie.p o prostu zw ró ć tn eid u w a g ę . Odradzają także używanie małej litery l. czy stałych .16 Rozdz. N ie trzy m aj się w ięc tej ostatniej rad y k u rc z o w o . N a z w a n ie m o ż e być id e n ty czn a z ż a d n y m ze słów k lu c zo w y c h języka C++. . a nie z a g a d k ą . Odradza się też zaczynać nazwę od znaku podkreślenia.bo najczęściej tam stawia się liczby. jak w idać. były d la Ciebie w yjaś­ n ie n ie m .

jakiego typu je st to.3.inaczej: liczby zm iennoprzecinkow ej. 6) ang. Z ałó żm y . ż e konkretna n azw a oznacza obiekt ja k ieg o ś typu." D efin icja z a ś m ó w i mu: I „A teraz zarezerw uj m i w pam ięci m iejsce na o b ie k t typu calkow i- I te g o o nazw ie s to p y " N asz frag m e n t p ro g ram u zaw iera w sobie jed n o cześn ie i je d n ą i d rugą w y p o ­ w iedź. że: • nazw a stopy o k reśla zm ienną słu żącą d o przechow yw ania liczby ty p u całk o w iteg o int . Tę zło tą m y śl m ożesz napisać so b ie na ścianie. że ch odzi o naszą n azw ę s t o p y . P rzy definicji o b iek tu p r z e l i c z n i k w idzim y taki z a p is double przelicznik = 0. C hociażby d la teg o .Rozdział. » twm■U4 ! M oże być b o w ie m deklaracja. Startujem y! 17 D rugi program 5” I W języku C ++ każda nazwa m usi zostać zadeklarow ana zanim zostanie użyta. O zn ajm iam y co to za o b ie k t i od razu re z e rw u je m y mu miejsce w pam ięci. Deklaracja m ówi. 1. D ek laracja. . ale o b iek tu tego w d an y m miejscu nie d efiniujem y. ż e już jest zd efin io ­ w any w z u p e łn ie innym m od u le p ro g ram u . w te d y gdy n ap o tk a ją kom pilator. k tó ra nie jest definicją. integcr [czytaj: „intidżer"] . double [czytaj: „dabl"l od słów: double prccision . a deklaracja I Jest su b teln a ró żn ica m ięd zy ty m i d w o m a pojęciam i. że oznacza o n o I o b ie k t typu całkow itego.jeśli o tym zap o m n isz. to k o m p ilato r Ci n aty ch m ia st o tym p rz y p o m n i. Ale nie odw rotnie. Z atem : ■mmmmi . D ek laru jem y też.podwójna dokładność. M o żem y przecież ty lk o zdeklarow ać.czyli zm ien n o p rzecin k o w e podw ójnej precyzji.liczba całkowita 7) ang. że: • nazw y m e t r y o ra z p r z e l i c z n i k są n azw am i określającym i zm ienne do p rzec h o w y w an ia liczby rzeczyw istej . Definicja. W e w sp o m n ia n y m fragm encie p ro g ra m u deklarujemy. m ó w i m u: I „Jak b y ś zobaczył k ie d y ś słow o s t o p y .mm D afiniria je Definicja i s t równocześnie deklaracją. to w ie d z . Swoją d ro g ą . Z m ienne te są w naszym p ro g ram ie ty p u double^ . co nazywaliśm y daną nazwą.

kiedy podać do funkcji wczytującej ( s c a n f ) nazwę zmiennej.18 Rozdz. że na ekranie pojawiła się liczba 1050 . Z atem kolejność w ydarzeń jest taka: N ajpierw (kolejno) pow ołane są d o istnienia ob iek ty s t o p y . W naszym p ro g ram ie instrukcja std::cin » stopy. 1.. Startujem y! D rugi program Jest to nie tylko zw y k ła definicja rezerw ująca miejsce w pam ięci. Podaj wysokosc w stopach: 3500 3500 stop . W kom entarzach w yjaś­ nione są poszczególne kroki. a kiedy adres zmiennej. że to w łaśnie su g eru je kierunek strzałek >> D ygresja dla p ro g ram istó w klasycznego C. aż do ostatniej instrukcji. K ażda instrukcja zakończona jest średnikiem .. i zau w aż jak to się stało. 8) Skrót ten wymawia się po polsku jako „Si-yn". Programujących w C klasycznym. .ze standardowym urządzeniem wejściowym c i n (skrót od ang. to przeliczenie stóp na m etry i w y d ru k wyniku. □ Przykładowe wykonanie programu spowoduje wydruk na ekranie poniższego tekstu (Tłustszym d ru k iem zaznaczone jest echo tekstu w p isy w an eg o przez użytkow ­ nika p ro g ram u ). Nie trzeba tu myśleć.3 W c z y ty w a n ie d a n y c h z k la w ia tu ry P rzejdźm y dalej. jest operacją zw iąz an ą z k law iatu rą. ale taka defini­ cja. N astęp n e linijki program u. czyli od " { " klam ry otw ierającej funkcję m a in .m ówiąc inaczej .. W artość tej liczby zostaje um ieszczo n a w zm iennej s t o p y . Ten d ru g i . Z twardym „S"! . N asz pierw szy program m iał tylko jedną instrukcję. która to m iejsce w pam ięci d o d a tk o w o inicjalizuje.m a ich d u żo więcej. (Ile ich zatem mamy?) P raca tego program u polega na kolejnym w y k o n y w an iu poszcze­ gólnych instrukcji począw szy od początku. Przy odrobinie w yobraźni można pow iedzieć. w pisując tam wstępną w artość 0. p rz e lic z n ik . czyli .będąca obliczoną w artością um ieszczoną w zm iennej m e tr y .. m e tr y .: C-onsole IN -put ^). Instrukcja ta u m o żliw ia w czy tan ie z klaw iatury liczby. tej przed k lam rą zam y k ającą"} ". Jeszcze kilka tak miłych niespodzianek czeka nas w C++ . ucieszył zapewne fakt tak prostego wprowadzania danych z klawiatury.to jest: 1050 metrów •b Spójrz jeszcze raz na tekst programu.

po to. Z drugiej strony pisanie tego s t d : : tak często. Dalej d w ie instrukcje . ♦$* Dalej w id zim y instrukcję dokonującą m nożenia i w stawiającą rezultat do zm ien n ej (obiektu) m e tr y .p ro g ram kończy pracę. Jak w idzisz.. Jeśli chcem y na ekran w y p ro w ad z ić sam znak '\n '.zatem łatw o się dom yślić.czwartek e) ilosc_powtorzen_cyklu_roboczego f) zmienna g) L IC Z B A K O N W E R T E R Ó W h) okno^ekranowe i) samochod-osobowy j) auto k) kwota_zainwestowanych_$ l) wspolczynik_ (chwilowego) _przyrostu m) export_pszenicy n) export . niech przyjmie.w y p isan ie rezultatu obliczeń. Startujem y! 19 Ćwiczenia N a stę p n ie w ypisyw anie jest n a ekranie pytanie: "Podaj w ysokosc. «$♦ N a stęp n ie w czytyw ana jest z klaw iatury ilość stóp. Po kolejnym w y k onaniu tych w szystkich instrukcji . Prościej byłoby obliczyć to „ n a piechotę". W k o m en tarzu zaznaczyłem in n y sposób zapisu tego sam ego. M ówiąc szerzej: w instrukcjach sterujących. W Tak więc w y g lą d a ł nasz p ro g ram do przeliczania stó p na m etry.3 Ć w iczenia Które z poniższych nazw są poprawne. to m ożem y go zastąp ić skrótem e n d l . C u d program ow ania objaw ia się do p iero w pętlach. N o cóż . a które niepoprawne idlaczego? a) predkosc4 b) Predkosc_i_czas c) 4kola d) wielki. M asz rację.po m y ślałeś zapew ne: -T y le pracy z w p isy w a n iem tekstu p ro g ram u . // s td ::c o u t « s td ::e n d l.. iż chodzi nam o s t d : : c o u t. Mam jednak dobrą wiadomość.. że jest to nazw a czegoś z biblioteki standardow ej..'. Uporczywość s t d : : Zw róć też u w a g ę na instrukcję s td ::c o u t « " \n " . że gdy zobaczy w naszym progra­ mie nazwę c o u t.co oznacza: end of linę (koniec linii). Niedługo poznamy sposoby umówienia się z kompilatorem. n azw a endl jest tutaj tak że p o p rzed zo n a tekstem std: : . 1.Rozdz. by o trzy m ać ten wynik. przy każdym co u tm o że wydać się męczące. 1.

.... Co to są tzw.... .. ... ... .. który z pomocą jednej instrukcji c o u t napisze na ekranie następujący tekst w i t a m y na p o kładzie Napisz program pozwalający przeliczyć cale na centymetry (1 cal = 2.. ..t i t — • .. które ze znanych Ci edytorów mogą posłużyć do napisania programu w C++.. // wstępna wartość ... że w programie każda nazwa. • .. ..54 centymetra)... na początku rozdziału o typach wrócimy do tego zagadnienia i wtedy (mam nadzieje) ostatecznie rozwieją się wątpliwości... .. W naszych dotychczasowych programach wystąpiła nazwa co u t. »• ■ . ... Która? Wymień zasadnicze etapy niezbędne do stworzenia i uruchomienia programu........ . ' Napisz program. Do czego służy kompilator C++? ■v-ao Do czego służy linker? Czy w komputerze. // próba nieudana c) szerokość = 23. ... .......istnieją jakieś kompilatory C++ wyposażone 1 w tzw.... Gdzie była jej deklaracja? Zastanów się. musi zostać zdeklaro­ wana. co prawda..prt -i Jak rozpoznaje się koniec instrukcji? -i ■ ■. ale odradzana.. * ' ' " ł~ % • .. .. "białe znaki"? Wymień trzy..a może odwrotnie? (Jeśli nie jest to dla Ciebie jeszcze jasne...... .. poprawna... z którymi do tej pory się spotkaliśmy.... ......... z którym masz do czynienia .. Co określa deklaraq'a danej nazwy? Jakie znasz sposoby umieszczania w tekście programu komentarzy? Czy poprawne są poniższe komentarze? Jeśli nie..... Czy jedna instrukcja może być zapisana w trzech liniach? Czy w jednej linii programu można umieścić kilka instrukcji? ••... Powiedzieliśmy... środowisko? i- .20 Rozdz. . to dlaczego? a) / * to jest pierwszy komentarz // drugi // trzeci // czwarty a to dokończenie ★ *★ ★ •*•*★ ****★ *** +***** j b) // wysokosc = 660.... ■ •••-• • . 1.. przed jej użyciem.. Startujem y! Ćwiczenia Jedna z nich jest.......■ Czy definicja jest równocześnie deklaracją ..

. jakim edytorem (lub środowiskiem) będziesz się posługiwał . Startujem y! 21 Ćwiczenia gestosc = 12. /* wzięta z tablic */ // dalsze obliczenia ---------------*/ Jeśli wiesz już.Rozdział.sprawdź czy ma on udogodnienia związane ze stawianiem komentarzy typu li w wielu liniach równocześnie. 1. (Na przykład: zaznaczasz myszką pewien rejon i wciskasz jakąś kombinację klawiszy - w rezultacie zostają one zamienione na komentarz).55.

W in n y m miejscu chcielibyś­ m y m oże kilka instrukcji w ielokrotnie powtórzyć.w zależności od spełnienia jakiegoś w aru nku . czyli o w aru n kach W instrukcjach sterujących decyzje podejm ow ane są w zależności od sp ełn ien ia lub niesp ełn ien ia jakiegoś w aru n k u . Czy tak m usi być zaw sze? Przecież czasem . N ie m a p ro b lem u .F ałsz. Są to b ard zo przydatne polecenia służące do sterow ania przebiegiem pro g ram u .o d góry d o dołu. a co fałsz w języku C++ 2. praca tego p ro g ram u polegała na tym . że w szystkie instrukcje. w ykonyw ane były kolej­ no .Instrukcje sterujące P raw da . które um ieściliśm y funkcji ma i n .1. N ajpierw więc w yjaśnijm y sobie co to jest p raw d a.Fałsz.1 W yrażenie logiczne Z nasz z m atem atyki taki zapis nierów ności X < 18 co m ożem y przeczytać jako: "obecna w artość zm iennej x jest m niejsza o d 18 Czy ta nierów ność jest p raw d ziw a czy n iepraw dziw a (fałszyw a)? . W instrukcjach sterujących m o żem y podejm ow ać d e ­ cyzje o w y k onyw aniu tego. 2.m ożem y chcieć kilka instru kcji opuścić. 2. czyli o w arunkach 2 Instrukcje sterujące p o p rzed n im rozdziale zajm ow aliśm y się p ro g ram em do przeliczania W stóp n a m etry. Inaczej m ów iąc: od p raw dziw ości lub fałszyw ości jakiegoś w yrażenia. w tym celu w łaśnie do języku p ro g ram o w an ia w p ro w ad z o ­ no instrukcje sterujące.22 Rozdz.1 P raw da . czy innego fragm entu p ro g ram u . Jak pam iętasz.

ż e w program ie jest w iele miejsc. itiibmuu m Zmienna (obiekt) typu logicznego bool może w ystąpić jako w yrażenie f warunkowe Jak p rzy g o to w ać taką zm ienną logiczną? Oto prosta ilustracja: int bool niepełnoletni.3. s p ra w d z a . str. Poniżej w id zim y w kom entarzu w ielokropek . ż e tu m o ż e być bardzo w iele instrukcji nadających zm iennej x jakąś se n so w n ą w artość. że w tak im przy p ad k u w artością w yrażenia (x < 18) jest "prawda". a re z u lta t (prawda / fałsz) zapam iętać.1. / / <—zapamiętanie rezultatu W idzim y tu definicje dw óch obiektów . M ów im y w tedy. W p rz y p a d k u naszego w y rażen ia logicznego . 52). Ich wartość je s t obliczana w chwili. 2.. że kom p u ter. czyli o w arunkach O czyw iście: n ie w iadom o! W za le ż y to przecież od tego. gdzie s p ra w d z a się ten sam w a ru ­ nek.------. / / «—definicja obiektu // . \ W yrażenia logiczne.Instrukcje sterujące 23 P raw da . • Obiekt typu int o nazw ie x. ♦> Jeśli z a ś obecnie zm ien n a x m a wartość 200. Bliżej o tym po ro zm aw iam y w n astęp n y m rozdziale. w trakcie pracy nad instrukcją sterującą.Fałsz. *1* Jeśli x obecnie m a w artość np.czyli p rzech o w ać w jakim ś obiekcie. Jeśli w arto ści zm iennych. 2. • Obiekt typu (logicznego) bool o n a z w ie niepełnoletni. (Zdanie: ”200 jest m niejsze od 18" jest przecież zdaniem fałszyw ym ). By p rzech o w y w ać takie rezu ltaty (prawda/fałsz).czasem opłaca się to w yrażenie w aru n k o w e spraw dzić (obliczyć) raz.tak z a z n aczam .często ] używane są w instrukcjach sterujących. (P arag raf 3. których wartością jest "prawda" lub "fałsz" .sp raw d zen ie polega na tym . jaką w łaśnie w artość m a zm ien n a x. w ystępujących w tym w y rażen iu .2 Zm ienne logiczne b o o l jako warunek P oro zm aw iam y teraz o innym ro d zaj "warunku". . Załóżm y.Rozdział. Z ap am iętać .r ~i— — r. P rzecież zdanie: "6 jest m niejsze od 18" jest zd an iem praw dziw ym . niepełnoletni = (x < 18) . m am y d o dyspozycji specjalny typ zm ien n y ch zw any typem b o o l . 6. trzeba podjąć decyzje. to w y rażen ie nasze jest praw dziw e. nie zm ieniają się często . to w artością w yrażenia (x < 18) jest fałsz. •— -------. jaką w artość ma zm ien n a x i p orów nuje ją z liczbą 18.

2. Patrzy czy jego w artość jest ró w n a zero.3 Stare dobre sposoby z dawnego C++ W starszy ch w ersjach języka C ++ nie było specjalnego ty p u przeznaczonego dla zm iennych logicznych .o d p o w iad a to rezultatow i „fałsz". czyli o w arunkach W reszcie n asza ostatnia instrukcja. to w y rażen ie o d p o w iad a rezultatow i „prawda". M im o ż e w stan d ard o w ej w ersji języka C++ m am y już do d y sp o zy ­ cji specjalny ty p dla zm iennych logicznych .24 Rozdz. . O d tej p o ry ta zm ienna logiczna m a jakąś sen so w n ą w artość (prawda/fałsz). M oże to być n aw et bardziej skom plikow ane w yrażenie. Zresztą. Po p ro stu d o p rzech o w y w an ia takiej informacji logicznej nadaw ał się p raw ie k ażd y ty p zm iennej. Istota tego.czyli czy jest ono p raw dziw e.kom puter s p ra w d z a w artość teg o o b ie k tu .nie m usi to być zaw artość tylko jednego obiektu. K om puter oblicza w ięc jaką w artość m a to w yrażenie . Z am iast kazać k o m p u tero ­ wi obliczać jakieś w y rażen ie logiczne . P oznaliśm y więc trzy p rzy k ład y w yrażeń. w artość ta nie m usi być wcale liczbą. S p raw d za się w ów czas kod liczbowy złożonego tam znaku. które przyjm ują wartości: prawda / fałsz. Co ciek aw e .czyli takich. N a w e t obiekt przechow ujący znaki alfan u m ery czn e m oże być w ten sposób sp raw d zan y . a jeśli k o d jest zerow y (czyli tzw . 2. u w ag a: ta zm ienna logiczna ( n i e p e ł n o l e t n i ) może teraz w y stęp o ­ w ać w m iejscu w aru n k u w instrukcjach sterujących. K iedy to już obliczy . Z asada jest genialnie prosta: Jeśli p o słu g u jem y się w tym celu zm ienną typu i n t . Po p r a w e j stro n ie zn ak u p rzy p isan ia = w idzim y w y rażen ie (x < 1 8 ). czy różna o d z e ra . Jeśli jest różny o d z era .tę w artość "prawda" lub "fałsz" w staw ia (przypisuje) d o zm iennej logicznej o nazw ie n i e p e ł n o l e t n i .ten daw ny sposób n adal m oże być u ży w an y . U w aga.każem y m u po prostu sp raw d zić czy dan a z m ien n a logiczna p rzech o w u je w a rto ść "prawda". aby p rzek o ­ nać się jaka jest jego w artość liczbowa. które m o g ą w ystąpić jako w aru n ek w instrukcjach sterujących. czy fałszyw e. które kom pu te r m u si obliczyć. o czym tu rozm aw iam y.Fałsz. Instrukcje sterujące P raw da . P o ra zająć się instrukcjam i sterującym i.1. znak nuli) . czy "fałsz".

Stosujem y w ów czas instrukcję składaną zw a n ą in a cze 1) ang. O to p ro sty p rzy k ła d : int i. ’ else instrukcja2.. ■ . else std::cout « " zmienna i miała wartość równa 4". to ta instrukcjal nie jest w y k o n y ­ . / / d e fin ic ja o b ie k tu in t o n a z w ie i std::cout « "Podaj jakaś liczbę: std::cin » i.. ż e p o d aliśm y liczbę 15. if -jeśli [czytaj: .yf'] 2) [czytaj: „els"] . . i f (warunek) instrukcjal. W yrażenie i . <♦ Jeśli jest o n spełniony {prawda). A zatem jeśli w tej drugiej sytuacji: <♦ w a ru n e k jest spełniony {prawda). • y . to w y k o n y w a n a jest in stru k cjal. w ó w czas d o zm iennej i p o d sta w io n e zo sta ło b y 4. W yrażeniem w aru n k o w y m było t u : i —4. O bliczana je st w ięc jego w arto ść 1 5 . zo stan ie w yk o n an a instrukcja2.2 In s tru k c ja w a ru n k o w a i f Instrukcja i f 1 m o że m ieć dw ie form y: i f (warunek) instrukcjal.Instrukcje sterujące 25 Instrukcja w arunkow a i f i 2.4) std::cout << " zmienna i miała wartość inna niz 4". ' _ .4 m iałoby w arto ść 0 (czyli: fałsz) i w te d y w y k o n a n a z o stałab y instrukcja d ru g a .. ale całego bloku instrukcji. w t. 2.4 = 11 . 5p. <♦ Jeśli w a ru n e k jest n iespełniony {fałsz). a to jest ró ż n e od 0 (zatem : prawda). '. co m o żn a p rzetłu m aczy ć jako: „w p rzeciw n y m razie".Rozdz.. Jak działa taka instrukcja sterująca? N ajp ierw s p ra w d z a n y jest w aru n ek . Z ałóżm y. i f ( i .rJ .. czyli g d y w aru n e k nie by ł spełniony {fałsz). ❖ w p rzec iw n y m razie (else!). to zostanie w y k o n an a in stru k cjal. ■ C-P > ■ ĆH: ' ' y W f T3 i . ' ' W dru g iej w ersji instrukcji i f w id zim y d o d atk o w o słow o e l s e . an a. ż e chodzi nam o w y k o n an ie w a ru n k o w e n ie jednej in stru k cji. w ięc w y k o n a n a zostaje in stru k cja pierw sza. J '■ * Blok instrukcji Często się z d a rz a . G dybyśm y p o d a li liczbę 4.

punkty_karne. iinclude <iostream> j ^★ ★ ■****************1*r'*r**'****''łr*********llr*****1*’*'****r*.1 instrl. punkty_karne = 1 . za pomocą tab u lato ró w w ysunąłem n iektóre instrukcje teg o p ro g ­ ram u nieco w praw o. Są to p o p ro stu z w y k łe instrukcje ograniczone naw iasam i ( } .llr* int main() 1 int wys. else std::cout << "\nNa wysokości " « wys « " metrów jestes juz bezpieczny \n". P rzypom inam . 1 // •ocena Twoich wyników std::cout « "Masz " << punkty_karne « " punktów karnych \n". instr3. ■ . w k tó ry m stosujem y instrukcje składane. i f (punkty_karne)std::cout << "Popraw sie !". Jak w id zisz. Pomagają n ato m iast program iście. D zięki nim p ro g ram staje się bardziej czytelny. instr2. to ek ra n m o że w y glądać tak: Na jakiej wysokości lecimy ? [w metrach] : 100 100 metrów to za nisko ! . 2.26 Rozdz. Z a u w a ż ./ rfł: tełft* 4 * f b ' M . że p o klam rze n ie tizeb a staw iać śred n ik a. O to p rz y k ła d p ro g ra m u .i . // definicja dwóch zmiennych H typu int. / / ---------. że zró żn ico w an e odstępy o d lew ego m arg in esu (w ypełnione białym i z n a k a m i-s p a c ja m i lub tabulatoram i) nie mają dla kom p ilato ra żadnego znaczenia. Obie sq tego samego typu więc II wystarczy przecinek odzielający nazwy std::cout << "Na jakiej wysokości lecimy ? [w metrach]: cin » wys. Oto przykładowy wygląd ekranu po wykonaniu tego programu Na jakiej wysokości lecimy ? [w metrach] : 2500 Na wysokości 2500 metrów jestes juz bezpieczny Masz 0 punktów karnych Jeśli n a zad an e pytanie odp o w iem y inaczej. -if’ 1 . Instrukcje sterujące In stru k cja w arunkow a i f blokiem .rozważamy sytuację----------------------- i f (wys < 500) * std::cout « "\n" « wys « " metrów to za nisko !\n". punkty_karne = 0.

p o k azu ją zaciem ow ane prostokąty.Instrukcje sterujące 27 Instrukcja w arunkow a i f Masz 1 p u n k tó w k arn y ch Popraw s ie Z au w aż jak p ro s to w ypisuje się n a ekranie w artość zm ien n ej wys.. Pam iętam y je d n a k . .Rozdział.. Często zag n ież­ dżają się je d n a w ew n ątrz drugiej. czy m oże w ted y . które mam na myśli?" Jed n a in stru k cja i f m oże zaw ierać w sobie m ną instrukcje i f . to e l s e odnosi się zawsze do najbliższego poprzedzającego go i f ..elsedla w arunku pierwszego ■ . Instrukcje steru jące i f w ystępują w pro g ram ach b ard zo często. g d y b y ładniej d o d a ć tam tabulatory.. .. else //. że: t m u- Jeśli nawiasy klamrowe nie stanowią inaczej. że naw iasy k lam ro w e nie zaw sze m u szą w ystąpić. D od atk o w o podkreślają to "wcięcia" tabulatorów . 2.. 2-1 if( w a r u n e k p ie r w s z y ) ' V * ■ // < . g d y w aru n ek A jest n ie spełniony? Inaczej mówiąc: do którego i f należy to e l s e ? Z asada jest taka. Zagnieżdżanie if czyli: "Do kogo należy to else. W ygląda to tak: Rys.. else . W ystarczyła instrukcja scd::cout << wys. W ted y m oże p ow stać p roblem .. ■ C o się z a g n ie ż d ż a w czym . jak rozum ieć następującą konstrukcję: if (w a r u n e k A ) Lf (w a r u n e k _ B ) in stru k c ja 1 .. .. .. instrukcje dla else Jak sądzisz ...czy instru keje dla e 1 s e zo stan ą w y k o n an e w ted y .. w y g ląd ało b y to tak: if (w a r u n e k A ) if (u> arunek_B ) in stru k c ja !. g d y w aru n ek B jest nie sp ełn io n y . Innym i słow y.

28 Rozdz.\ Przypominam. D zięki te m u z y s k a m y m o żliw o ść w y b o ru w ielo w arian to w eg o : i f ( w a ru n e kD instrukcjal . bo przy ich użyciu.. lub ta p o w y ższa zasada. . to s p r a w d ź w aru n ek z. 2.re>?i xi -uU--. ) e l s e i f ( w arunek4 ) instrukcja4. b o b y łoby ich b a rd z o d u ż o i f {w a ru n e k D instrukcjal. b o w krótce p o z n a m y in n y sp o só b d o k o n a n ia w y b o ­ ru w ielo w a ria n to w e g o (za pom ocą jest instrukcji s w i t c h ) .j A n i r u a s -m o liw n ą i c . Z w y k le nie sto su ję w takim p r z y p a d k u ta b u lato ró w . <♦ Jeśli jest sp ełn io n y . program staje się czytelniejszy. . Wybór wielowariantowy P rz y u ż y c iu sło w a e l s e m ieliśm y w ięc m o żliw o ść d w u w a ria n to w e g o w yboru: . a le ju ż w iesz. ) e l s e i f ( w arunek3 instrukqa3. że k a ż d e z w y stęp u jący ch tu else o d n o s i się d o b e z p o śre d n io p o p rzed z ając eg o g o if. / / dalsza część programu T u n ie u ż y łe m ta b u la to ró w . Dla programisty jednak są bardzo pomocne.o : J> :. że tabulatory o niczym nie decydują. Są to białe znaki.v--jn. e l s e i f ( w arunek2 instrukcja2. O sp o so b ie z a g n ie ż d ż a n ia d ec y d u ją n a w ia sy klam ro w e. non* / / dalsza część programu T a k ą k o n stru k cję m o ż n a p rzec zy tać tak: S p ra w d ź w a r u n e k l. <$► Jeśli zaś w a ru n e k l nie jest sp ełn io n y . Instrukcje sterujące In stru k cja w arunkow a i f { . . z k tó reg o u ż y tk o w n ik p ro g ram u m ógłby w y b ra ć jak ąś opcję. J e d n a k zaczek ajm y jeszcze. <♦ Jeśli ten w a ru n e k 2 je st spełniony. *1* Jeśli zaś w aru n e k 2 n ie jest sp ełn io n y to s p r a w d ź w aru n ek 3 . / / . instrukcje dla else ) i\ « . w p rz e c iw n y m ra z ie ro b im y tamto.ro b im y to.w y konaj in stru k c ję l i p rzejd ź do d a lsz e j części p ro g ra m u (czyli z a k o ń c z pracę w tej całej konstrukcji).-i. w . Jak w id a ć . po w staje tu m o żliw o ść w y b o ru je d n e g o z w ielu w aria n tó w . . Jeśli o n jest sp ełn io n y to w y k o n aj instrukcję2 i p rzejd ź d o d alszej części p r o g r a m u . -y < 3Vi>T . które kompilator ignoruje. M o ż e m y je d n a k pójść d alej . to w y k o n a j in stru k q ę 2 i p rz e jd ź d o dalszej części p ro g ra m u . e l s e i f ( w arunek2) instrukcja2. O d ra z u się m o ż e n a su w a ć p o m y sł w y k o rzy stan ia takiej k o n stru k c ji w p ro g ra m o w a n iu m e n u .koło słow a e l s e m o żem y p o staw ić n astęp n ą in stru k c ję i f . f i l YĄ MftU &riSMa-l e l s e i f (w a ru n e k 4 ) instrukcja4. Ot bJJaliiirttlbcCj e l s e i f ( w a ru re k 3 ) instrukcja3.

Inaczej: może tam być blok instrukcji. po czy m ponow nie s p ra w d z a n y jest w aru n ek . while .3 P ętla while Instrukcja steru jąca while^ p o zw ala na realizację ta k zwanej pętli program ow ej. ♦> Jeśli nie je st spełniony. w ów czas instrukcjal nie jest w cale w ykonyw ana. w a ru n e k stanie się niespełniony.Instrukcje sterujące 29 Pętla w h i l e 2. — S? Oczywiście zamiast tego. • Jeśli w końcu. std::cout « "\n No to narysujmy wszystkie " « ile « " : // pętla while rysująca gwiazdki w h i l e (ile) { 3) ang.podczas gdy.i ta k dalej. r • Jeśli tym razem w a ru n e k ten n a d a l jest sp ełn io n y . że p e w n a instrukcja (lub *i 2fi Ł*: blok instrukcji) w y k o n y w an e są 'w kółko". za k tó ry m ś obiegiem pętli. 2. T aka pętla program ow a p o leg a na tym . może być instrukcja składana. d o p ó k i spełniony jest jakiś w aru n ek . . co oznaczyliśmy tu umownie jako in s tru k c ja l. -ji :u ♦J» Jeśli je d n a k w aru n ek jest sp ełn io n y . w ów czas p o n o w n ie w y k o n y w an a jest instrukcjal . Instrukcja steru jąca while ma formę: while (warunek) instrukcjal. dopóki [czytaj: „łajl"] . ż e pierw sze s p ra w d z e n ie w aru n k u (obliczenie jego w artości) odbyw a się p rz e d w ykonaniem instrukcjil #include <iostream> int m a i n () { int ile. Z w racam u w ag ę.k o m p u ter najp ierw sp raw d za w arunek. w ów czas w y k o n y w a n a jest instruk- Cja1. w ielokro­ tn ie dopóki (whilel) w a ru n e k jest spełniony. std::cout << "Ile gwiazdek ma mieć kapitan ? : std::cin » ile. P rzystępując d o w y k o n an ia instrukcji w h i l e .Rozdz. czyli kilka instrukcji ujętych w klamry ( }. w ów czas d o p iero p raca pętli zo stan ie p rz e rw a ­ na.

do { std::cout << "Napisz jakaś litere: std::cin » litera.4 Pętla d o . N astęp n ie sp raw d zan y jest w aru n ek . 4) [czytamy: „du. . że w aru n ek sp raw d zan y jest nie p rzed .. p o czym z n o w u sp ra w d z a n y jest w aru n ek . }w h i l e (litera != ’K'). N a p rzy k ład : #include <iostrGam> int main() { char litera.. w h i l e . . Jeśli jest o n spełniony. że instrukcjal zo stan ie w y k o n an a co najm niej raz. C zyli n aw et w tedy. .łajl"J . W ynika stąd . . Jak w id ać. g d y w a ru n e k nie będzie n ig d y spełniony. R óżnica polega tylk o na tym . ale po w y k o n an iu instrukcji-!. i tak w k ó łk o . Instrukcje sterujące Pętla d o . //n a d o w ó d ... .. s t d ::cout « ile = ile . 2. D opóki. Pętla taka m a form ę do instrukcjal while { w a r u n e k ) . . ńjSEWoW lPiuCrc n A Q jS M 7 ?('V j ' D ziałanie jej jest takie: N ajp ierw w y k o n y w an a jest in s tru k c ja l .30 Rozdz. . to w y k o n an ie instrukcji 1 zo stan ie pow tórzone.while.1.. że tn m ł p r a w o p r z e r w a ć pętlę std::cout << "\n Teraz zmienna ile ma wartość « ile. A Instrukcja ta po zw ala na realizację innego rodzaju p ętli program ow ej. Słow a te oznaczają po an g ielsk u : Rób. dopóki w aru n ek będzie spełniony. d ziałan ie tej pętli p rzy p o m in a tę o p isan ą poprzednio. std::cout << "\n Napisałeś: " << litera << " \n". n A oto przykładowy wygląd ekranu po wykonaniu tego programu Ile gwiazdek ma mieć kapitan ? : 4 No to narysujmy wszystkie 4 : **** Teraz zmienna ile ma wartość 0 2. .. C zyli jakby p o polsku rób instrukcjal dopóki ( w a r u n e k ).

2. w y k o n y w an a jednokrotnie. z a n im zostanie w y k o n an a w łaściw a p raca pętli. Z atem jeśli nie w iesz. ' W Jak w idać. i n s t r j c r o k ) treść_pętli.Instrukcje sterujące 31 Pętla f o r std::cou~ << "\n Skoro Napisałeś K to kończymy !". to w y b ierz raczej p ętlę w h i l e . Pętla w czyty­ w a n ia liter o d b y w a się dopóki nie p o d am y litery K (wielkiej).częściej robi się błędy. P rogram nasz oczekuje na napisanie (przez użytk o w n ik a) litery. k tó rą z nich się posłużyć. Tem u i in n y m op erato ­ ro m przyjrzyjm y się d o k ład n ie później. • W n aszy m p rzy k ład zie jest to p o d sta w ie n ie i = 0. i < 10 . } A oto p rz y k ła d o w y w ygląd ekranu po w ykonaniu tego programu Napisz jakaś litere: A Napisałeś: A Napisz jakaś litere: K Napisałeś: K Skoro Napisałeś K to kończymy . ❖ in strjn i . . i=i+l) ( std::cout « "Ku-ku ! ) W yjaśnijm y. ■warunek . W ted y to w ykony­ w a n ie pętli zakończy się.. że w tej p ętli . Zatem zap is while(litera != 'K') ro zu m ian y jest jako „d o p ó k i l i t e r a jest ró żn a o d K ".w m iejscu. . M a ona form ę for iiiis tr _ m i .d la ) oznacza: d l a tak ich w a ru n k ó w rób. co w przy k ład zie m oże w y g ląd ać choćby tak: for(i=0 .. Z w racam u w a g ę . W p ro g ram ie . co oznaczają poszczególne człony: <♦ f o r (ang. m am y tu d o czynienia z pętlą o nieco in n y m d ziałan iu niż p o p rzed ­ nia. for .jest to instrukcja inicjalizująca p racę p ętli.5 P ę tla for N ajp raw d o p o d o b n iej tą pętlą będziesz p o słu g iw ał się najczęściej.Rozdział.pojaw ił się w w yrażeniu niezn an y n am jeszcze d o tą d op erato r != k tó ry oznacza: „ ró ż n y od .pętla w czytująca znaki zostanie w y k o n an a p rzynajm niej raz. które o zn aczy łem jako O . Z naw cy tw ierd zą.

to w y k o n y w a n e zostają instrukcje będące treścią pętli.32 Rozdz. by obiekt i przy każdym obiegu pętli zwiększał swoją wartość o 1. • Jeśli z a ś w aru n ek jest sp ełn io n y . ja k b y stało tam w y ra ż e n ie zaw sze p ra w d z iw e (w arunek sp ełn io n y ). 2. Jeśli rzeczyw iście ow o i jest m niejsze od 10. M oże być ich k ilk a. Podobnie w p rz y p a d k u instrukcji k ro k u pętli (instrjcrok). to oczyw iście: . k tóre o bliczane jest p rzed k a ż d y m obiegiem pętli. ♦♦♦ instrjcrok . Praca tej pętli odbywa się więc jakby według takiego harmonogramu: 1) N a jp ie rw w ykonują się instrukcje inicjalizujące p racę pętli. O to kilka ciekaw ostek: in s tr jn i . Jeśli je st p raw d ziw e.nie m u si b y ć tylko jedną instrukcją. w ykony­ w an a b ezp o śred n io przed obliczeniem w y rażen ia warunek.praca pętli jest p rz e ry w a n a . In n y typ nieskończonej p ętli. a następnie wstaw ten rezultat z powrotem do obiektu i. wyraz_warun. ) l // tre ść p ę tli je s t n ie sk o ń c z o n ą p ę tlą . D o w o ln y z nich m o ż n a opuścić. .p o czy m p o w ta rz a n a jest akcja (2). zac h o w u jąc jed n ak śred n ik o d d zielający g o o d sąsiad a. w ów czas w y k o n y w a n e zos­ tają instrukcje będące treścią pętli. O p u sz c z e n ie w y ra ż e n ia w aru n k o w eg o tra k to w a n e jest tak. fc' U H . • Jeśli w aru n ek nie jest sp ełn io n y .chodzi o to. 2) O bliczan e jest w y rażen ie w arunkow e. W yszczeg ó ln io n e elem enty: in strjn i. • U n as w yrażeniem w a ru n k o w y m jest w yrażenie: i < 10 .to instrukcja kroku pętli. w ted y o d d z ie lo n e są p rzecin k am i. • U n a s jest to po prostu i = i+1 Co oznacza: do dotychczasowej wartości zmiennej i dodaj 1. Innymi słowy .n i e m u s z ą w ys­ tąp ić. w y k o n y w an a n a zakończenie każdego o b ieg u (kroku) pętli. Jest to jak b y ostatnia instrukcja. T a k w ięc zap is f°r( .j e s t to w yrażenie. 3) P o w y k o n an iu treści p ę tli w ykonana zostaje instrukcja kroku p ętli ( instjcrok) . w ó w czas w yko­ n y w a n a zostaje instrukcja b ęd ąca treścią pętli (czyli w ypisanie te k stu "Ku-kul").Instrukcje sterujące Pętla f o r ♦♦♦ warunek . instrjcrok .

ilu leci pasażerów ? inr ile. //liczba p a s a ż e r ó w std::cin >> ile. ilu leci pasażerów ?4 Pasażer nr 1 proszę zapiać pasy ! Pasażer nr 2 proszę zapiać pasy ! Pasażer nr 3 proszę zapiać pasy ! Pasażer nr 4 proszę zapiać pasy ! Skoro wszyscy juz zapieli. 2. . . .WTUT* >j. to ładujemy. to ładujemy. której p o trze b u jem y tylko na u ży te k tej pętli. i <= ile .Rozdział. } Jeśli w trakcie w y k o n y w a n ie program u s te w a rd odpow ie.-< ih >' ■■■‘ . Licznik i jest w ięc zm ienną. i = i + 1) { std::cout << "Pasażer nr " << i . w w y rażen iu inicjalizacyjnym zm iennej (obiektow i) o n azw ie i n ad ajem y w artość 1. i = i + 1) // { std::cout << "Pasażer nr " « i « ” proszę zapiać pasy ! \n". To będzie jak b y licznik o b iegów pętli. .Instrukcje sterujące 33 Instrukcja f o r while(true) { // treść p ę tli } • lilii alb o do // treść p ę tli } while(true). int i. • Przykład j f W C-M P rzy jrzy jm y się pętli for w program ie #include <iostream> int main() { std::cout << "Stewardzie. ■ s td:rcout « "Skoro wszyscy juz zapieli. i <= ile . ii r. to lepiej p o słu ży ć się następującą sk ła d n ią f o r (int i = 1 . S koro tak. ■ . //lic z n ik o b ie g ó w p ę tli f o r (i = 1 . że leci 4 p asażeró w to 3 na ekranie pojawi się: Stewardzie. . © Jak w id zisz. Krótki komentarz O D efinicja obiektu o n a z w ie i . p . p o czy m przy k ażd y m o b ieg u pętli w arto ść teg o licznika ro śn ie. .

int który. w ięc p o jego zakończeniu k o m p u ter go zlikw iduje. 2. Czyli w ramach instrukcji zawartych w naszych klamrach { }. std::cin » który. default: 5) ang. Jakie konsekwencje ma definicja w takim miejscu? Otóż: [oObiekt zdefiniowany w instrukcji inicjalizacyjnej pętli f o r istnieje (jest do dyspozycji) tylko w ramach tej instrukcji f o r . w której go napisaliśmy. który podzespół sprawdzić? \n" « "nr 10 . Instrukcje sterujące In stru k cja s w i t c h << " proszę zapiać pasy ! \n". Łatw o zauw ażyć. że teraz definicja obiektu i pojawiła się już w instrukcji f o r .tak zdefiniow any o b ie k t . a także w instrukcjach stanowiących treść pętli. switch .s łu ż y d o po dejm ow ania w ielo w arian to ­ w ych decyzji. std::cout « "Kapitanie.przełącznik [czytaj: „słicz"] . już po zak o ń czen iu pracy pętli . P rzyjrzyjm y się p rzy k ład o w em u fragm entow i p ro g ra m u . Potem . break. switch (który) < case 10: std::cout << "sprawdzamy silnik \n". który p rzed tem nazw aliśm y instrukcją inicjalizującą (instr_ini).34 Rozdz.Stery \nnr 28 .staje się niedostępny (przestaje istnieć).jak sam a n azw a s u g e r u je . break. w członie.6 In s tru k c ja switch s w i t c h **. break. case 35: std::cout << "sprawdzamy stery \n".Silnik \nnr 35 . 2. dy To znaczy w tej linii. case 28: std::cout << "sprawdzamy radar \n". Był p rzecież stw orzony do je d n eg o tylko p rzed ­ sięw zięcia (zw anego pętlą f o r ) .radar\n << "Podaj kapitanie numer: ".

przypadek. break. w ó w czas w y k o n y w an e są instrukcje p o c z ą w sz y od tego m iejsca.nie znam takiego ! ".d a lsza c zę ść p ro g ra m u ❖ Jeśli jego w artość z g a d z a się z w artością w y ra ż e n ia stałego p o d a n ą obok je d n e g o ze słów k lu czo w y ch case**.radar Podaj kapitanie numer: 35 sprawdzamy stery . który podzespół sprawdzić ? nr 10 . .d a l s z a część p ro g ra m u W p r z y p a d k u .Instrukcje sterujące 35 Instrukcja s w i t c h std::cout « "Zazadales nr " « który << " . break.Silnik nr 35 . break. • Jeśli je d n a k z aż ąd a p o d z e so p łu n r 77. * .przerwij [czytaj: „brejk" ] .. case . to 3 na ekranie będzie następujący tekst: Kapitanie. który podzespół sprawdzić ? nr 10 .. ż e n u m er 35. i • - case w rażenie_stałe2: instrB. ‘ . ja k taka instrukcja s w i t c h działa: ❖ O b liczan e jest w y ra ż e n ie um ieszczone w n aw iasie p rzy słow ie s w i t c h switch (w y r a ż e n ie w a r u n k o w e ) { case w rażenie_stałe1: instrA.. 2. ■ .radar Podaj kapitanie numer: 77 Zazadales nr 77 . } //.Stery nr 23 . break . break. N a z a p is 6) ang.Stery nr 28 . default: instrC . ' . ❖ W y k o n y w an ie ich k o ń czy się p o n ap otkaniu instrukcji b r e a k^. sytuacja [czytaj: „kejs"l 7) ang.Silnik nr 35 .czyli jakby w yjście p o za jej d o ln ą klam rę.Rozdział.. P o w o d u je to w y sk o k z instrukcji s w i t c h .nie znam takiego ! O to . g d y k a p ita n (czyli Ty!) o d p o w ie. ) //. to na ek ra n ie zobaczy: Kapitanie.

Jeśli tak przez pomyłkę zrobisz. / / . N ie może być dw óch etykiet c a s e z taką samą wartością.domniemanie [czytaj: „difolt"] .. 41). O i h . a nie sam jego wygląd Etykiety c a s e 20: oraz c a s e 19+1: wyglądają inaczej.! Instrukcji następujących po etykiecie c a s e nie musi kończyć instrukcja b rea k Jeśli jej nie um ieścimy. gdy programista sam może zadecydować czy przerwać (b r e a k ) wykony­ wanie danych instrukcji. 8) ang. Jeśli wartość wyrażenia warunkowego nie zgadza się z żadną z wartości prz> etykietach c a s e .nie jest obowiązkowe A 3. . ficess. Oto przykład: ć i . (Zaczynają sią wykonywać instrukqe następujące bezpośrednio po tym s w itc h ). Czasem więc celowo nie umieszczamy instrukcji b r e a k .. wówczas wykonują się instrukcje umieszczone po etykiecie d e f a u l t 8. (Paragraf 2.‘. Czasem się to przydaje. str. Co więcej. c a s e 2: s t d : : c o u t « c a s e 1: s t d : : c o u t « b reak . w ów czas wykonywanie programu opuszcza instrukcję s w itc h nie wykonując niczego. naw et na samym je początku. ale są etykietami z identyczną wartością. bn uf -Jjfssas Jti/ibaf flksj default Gdyby wartość wyrażenia warunkowego s w it c h nie zgadzała się z żadną z wartości podanych przy etykietach c a s e . Nie pom yl tego z prawdziwą "etykietą". default . że chodzi o wartość wyrażenia.* i i j y w K j f* f s w i tc h ( n r ) c a s e 3: s t d : :c o u t « !'* " . jednak może być w dow olnym miejscu. to zaczną się w ykonyw ać instrukcje um ieszczone pod następną etykietą c a s e . Lepiej przecież.v.36 Rozdz. U nas etykieta ta znajduje się na kon a instrukcji ś w it ch. Instrukcje sterujące In stru k cja s w i t c h c a s e wartość: mówi się czasem "etykieta case". etykiety d e f a u l t m oże nie być wcale. Nie mogą więc wystąpić w tej samej instrukji s w i t c h . o które porozmawiamy za kilka stron. że po wykonywaniu instrukcji dla c a s e 1 0 nastąpiłoby wykonywanie instrukcji z c a s e 28. break . Zwracam uwagę. Nie jest to nieudolność języka C++. kompilator Ci o tym przypomni sygnalizując błąd kompilacji. Konkretniej: w naszym ostatnim programie brak inst­ rukcji b r e a k w c a s e 10 spowodowałby. a etykiety d e f a u l t nie ma wcale. czy też kontynuować. nr. 2.9. .

! d la n r = 1 • d la in n eg o n nic się n ie w y d ru k u je . . Dla p rostoty d alszy ch ro zw ażań ten z m ien n y obiekt nazw ijm y sobie obiektem w ybierającym . k tó ra p r z e n ie s ie ste ro w a n ie w o d p o w ie d n ie m iejsce sw itch { w y b i e r a j a c y ) case 100: // <— to j e s t s ta ła w a rto ść instrukcje dla tej opcji case 200: // <—to j e s t s ta ła w a rto ść instrukcje dla te j opcji i' s ' r)^ . 2. Oto pseudo-kod ilustrujący sytuację.Instrukcje sterujące 37 Co w ybrać s w i t c h czy i f . k tó reg o w a r­ tość m u sim y p o ró w n ać z czym ś .w y k o n an ie p ro g ra m u p rzen o si się d o takich lub innych instrukcji. . . P rzy p o m n ijm y je sobie z a p o m o cą p seu d o -k o d u .a w zależności od re zu ltatu tego p o ró w n an ia .Rozdz. p r z e z co / / n a d a je o b ie k to w i w y b ie ra ją c e m u ja k ą ś ta m w a rto ść / / in s tr u k c ja sw itc h . . case 200+50: // <—to j e s t s ta ła w a rto ść instrukcje dla tej opcji Jak p am iętam y. a s w i t c h . e l s e . e l s e ? Zależnie od wartości zmiennej nr możliwe sć| następujące wydruki na ekran: d la n r = 3 *. Jedna z nich to w ielo k ro tn a instrukcja i f . // te ra z n a stę p u ją in stru k c je . najp ierw u stalm y n azew nictw o.7 C o w y b ra ć : switch c z y i f . W róćm y teraz d o różnic m ięd zy i f . W obu p rz y p a d k a c h m am y jakiś o b ie k t (zm ienną). .else? P o zn aliśm y ju ż d w ie m ożliw ości w yboru w ielo w arian to w eg o .! d la n r = 2 . w k tó r y c h u ż y tk o w n ik w y b ie r a ja k ą ś opcję. czyli tej części programu. a d ru g a to u ż y c ie instrukcji s w i t c h .. . Jaka jest różnica m ięd zy tym i d w o m a sposobam i d o k o n an ia w y b o ru w ielo w ar­ ianto w eg o ? Co w ybrać? Z an im o d p o w iem . w instrukcji s w i t c h n astęp u je sp ra w d z e n ie czy w a rto ś ć obiektu w ybierającego jest ró w n a jednej ze s ta ły c h w artości u m ie sz c z o n y c h p rzy etykietach c a s e . gdy postanowiliśmy posłużyć się instrukcją switch: i n t w y b ie r a ją c y . e l s e . . Obie mogą nam posłużyć na przykład do realizacji "menu ". gdzie użytkownik wybiera jedną z możliwości (opcji). .

. . Operator ten zapisuje się jako dw znaki równości obok siebie (bez odstępu między nimi). — • • • oznacza: Jeśli a równe jest b. e l s e obiekt wybierający porównać moż • na nawet z wyrażeniem zmiennym. •**-■.b) .typ obiektu wybierającego nie nr znaczenia. . . .. k t ó r y P ° ^ c porównaniu i w rezultacie otrzymać odpow iedź czy waruijek j spełniony czy nie (prawda czy fałsz).nwu • > i f ( a = . . 2) Co do tego. który kompilator potrafi sobie na taki typ całkowity zamienić ♦> W przypadku instrukcji i f .1 lu b l7 . e l s e . Obiekt wybierający reprezentuje kąt (w stopniach) pod jakim s w chodzi w atmosferę. z czym porównuje się (obiekt wybierający). e l s e ? Teraz chciałbym pokazać pseudo-kod ilustrujący pracę instrukc if .e ls e tn im to 8# b futbyw .' .!■ UT$9iti3 •• > 1) Co do typi* obiektu wybierającego f!iaL' s w i t ?ć h póWinien to być obiekt (lub wyrażeni typu całkow itego albo takiego. e l s e .V » » r 1* -••• ' ' . . . Instrukcje sterujące Co w ybrać s w i t c h czy i f . Chodzi tylko o^tó^by był to typ. . bo s w i t c h działa na tylko na liczbach całkowitych. to. którego bieżąc r wartość znana będzie dopiero w ted y..»r*« . e l s e i f (w y b ie r a j ą c y — wyrażenieB) . •• -. . m ożem y teraz pokazać nasz pseudo-kod: i f (w y b ie r a ją c y « wyrażenieA) •‘ ■ “V■‘W"i •i instrukcje dla tej o p cji . r. Wiedząc to. 2. .. to znaczy takim.. • --. . ti wyboru wariantu musimy dokonać za pomocą instrukcji sterując** i f . (ESI* Przykład. Kątten może byc 16. Zatem zapis: .* ••• .ale mam tu m ały problem. .v/ -Sąirzy: 'uk) a t»f iir-t-m ■' | ■...38 Rozdz. u •• (To te wartości. znanym i nam już w trakcie pisania progra mu.4 Jeśli tak...5 stopnia lubl7.i instrukcje dla tej opcji e l s e i f ( w y b ie r a ją c y =“ wyrażenieC) instrukcje dla tej opcp Tifildyw (O Zasadnicze różnice między tymi sposobami? . g d y w ykonanie programu dotrz do tej w łaśnie instrukcji. które umieściliśmy zaraz po słowach case) ♦♦♦ Natomiast w instrukcji i f . «$♦ W instrukqi s w i t c h obiekt wybierający porównywany jest wartością mi stałym i (całkowitymi). :. bo nie poznaliśmy jeszcze operatora sprawdza jącego czy dw ie wartości są sobie równe. ..

. . T rzeba zd e c y d o w a ć o w y k o n a n iu tych lu b in n y c h d ziałań przegląd techniczny: "pobieżny". e l s e . U:l„ . e l s e jest bardziej u n iw e rs a ln a . Ja wtedy wolę posłużyć się instrukcją s w i t c h .jej p o ró w n a n ie to s p ra w d z e n ie czy obiekty w y b ierający je s t ró w n y x ❖ i f . f • 1•*' ' i* • ' i ’'I J ' . Vl i' • r1 . . ’ * • ’ ***''!' ’• ?*ł| “ N a p rz y k ła d : O b iek t w ybierający re p re z e n tu je tem p eratu rę siln ik a.. k tó rą w ybrał u ży tk o w n ik . i.120) trz e b a w y k o ­ nać in n e instrukcje. T u u w ag a: o w a w artość w y m a g a n a — jest zm ien n a.trz e b a w y b o ­ ru w ielo w a ria n to w e g o d o k o n a ć za pom ocą 1 f • • • 6 XóQp 3) Co do samej operacji porównującej.Instrukcje sterujące 39 Co w ybrać s w i t c h czy i f . r. to p o słu g u je m y się in stru k c ją steru jącą if. . . L <:'■ i 03= Z a łó ż m y je d n ak . .t u p o ró w n a n ie m oże być d o w o ln y m o p e ra to re m logicz­ n y m dającym o d p o w ie d ź : prawda /fałsz. G d y m a m y dokonać tak ieg o w y b o ru . .P o c o z a te m w o g ó le używ ać s w itc h ? A jedn ak : . b o ró żn a na ró ż n y m p o zio m ie g ry . ż e o b iek t w ybierający re p re z e n tu je ilość p rzejech an y ch kilo­ m e tró w p rz e z sam o ch ó d w yścigow y. e l s e ) . 55) sto p n i C elsju sza to podjęte m ają zostać o d p o w ie d n ie kroki. 'r .else Jak w id a ć instrukcja i f . • Jeśli zaś te m p e ra tu ra jest w z a k re sie > 120 sto p n i to jeszcze inne. e l s e ? (£§=> N a p rz y k ła d : O b ie k t w y b ierający re p re z e n tu je n u m e r opcji. 2. "normalny" czy "generalny" ? w z a leżn o ści od teg o . jeśli w y b ra n a została n a p rz y k ła d opcja ó sm a . . . ale o d p rz e d z ia łu w artości... . to sto su jem y in stru k cję steru jącą i f . <♦ s w i t c h .b o jest bardziej przejrzy­ sta. S koro p o ró w n y w a ć m a m y z o biektem (w y rażen ie m ) zm ien n y m . c z y ta ilość k ilo m etró w o d p o w iad a jakiejś w artości w y m a g a n e j.f * .Rozdział. e l s e . • Jeśli ona je st w p rzed ziale (-1 0 0 .d a się zrealizo w ać w obu ro zw iąz an iac h ( s w i t c h o ra z i f . . D ecy zję o w y k o n a n iu d a n y c h działań. T eraz n a s z w y b ó r w ie lo w a ria n to w y m a p rzen ieść sterovyanie d o tych lu b innych in stru k c ji. . C zyli jeśli chcem y w y b rać w a ria n t zależnie nie ty le o d k onkretnej w arto ści. • Jeśli zaś te m p e ra tu ra jest w p rz e d z ia le (55.| J2.

w której bezpośrednio tkw i. bo zachodzi przynajm niej jedna z poniższych okoliczności: • obiekt porów nyw any nie jest typu całkow itego. b re a k . Patrząc na jej zapis od razu rozumie się logikę tej części programu. i = i -1. Instrukcja ta pow oduje natychm iastow e p rzerw an ie w ykonyw a­ nia tych pętli. Jest jeszcze inne. Poza tym .40 Rozdz. Jest to więc jakby przerw an ie z wyjściem ty lk o o jeden poziom wyżej. while. z czym porów nujem y. . choć podobne działanie b r e a k w stosunku do instrukcji pętli: for. to instrukcja break pow oduje przerw anie tylko tej p ętli.polegającym na przerw aniu w y k o n y w an ia instrukcji switch.d z ia ła ona nieco szybciej. jak instrukcja break przerw ie pętlę while: int i = 7. do. Jeśli m am y do czynienia z kilkoma pętlam i .8 In stru kcja break Zapoznaliśm y się pow yżej działaniem instrukcji break . bardziej elegancka. • to. Zapamiętaj: Do dokonyw ania w yboru w ielow ariantow ego lepiej użyć instrukcji sw itch^j chyba.pętla n ie sk o ń c zo n a ! std:rcout « "Pętla. że się nie da. while(1) II <. . nie jest w artością stałą znaną już w czasie kompilacji 2. if(i < 5) s td :rc o u t « "Przerywamy ! " .zagnieżdżonym i je d n a w ew nątrz drugiej. • operacja porów nania jest inna niż "czy a jest równe b? . Dlatego zapew ne używ ał będziesz jej częściej. Oto. 2.while. W wielu przypadkach ta instrukcja po prostu nam wystarcza. i = 7 Pętla. który na ten typ całkowity ko m p ilato r potrafi zam ienić). (ani takiego. i = " « i « "\n". □ Wykonanie tego fragmentu programu spowoduje wypisanie na ekranie Pętla. i = 6 .Instrukcje sterujące In stru k cja b r e a k Instrukcja switch jest bardziej przejrzysta.

. 2. że nie było 10 g w ia z d e k w rzędzie. « * * * f j » r . i = 5 Przerywamy ! A oto przykład z zagnieżdżonymi pętlami. i f i m > d l u g c s c _ l i n i i ibreak. Tiim iiUiniliii|ię Etykieta je s t to nazwa. int dluęosc_linii = 3. P ow ied zm y jasno: 9) ang. int i. go to . m = m + 1) s t d : :cout << . i < 4 . .*• ig ła c h r .Instrukcje sterujące 41 Instrukcja g o t o Pętla. w sty d liw a instrukcja g o t o .) scdrrcout << "NnKontynuujemy zewnętrzna petle" « " for dla i = " « i << »\n ". w której b r e a k tkw iło b e z p o ś re d n io . m < 10 . g d y b y n ie jeszcze jedna. 9 M a ona form ę: goto e ty k ie ta . po której następuje dw ukropek. e ty k ie ta : in s tr u k c je Po n a p o tk a n iu takiej instrukcji w y k o n y w a n ie p ro g ra m u p rzen o si się d o m iejs­ ca. // tu wyskok z for (m. (jakby to w y n ik ało z zap isu pętli w linii O ). 9 In s tru k c ja goto W z a sa d z ie na tym m oglibyśm y skończyć o m a w ia n ie instrukcji sterujących. g d z ie jest d an a etykieta.Rozdział.idź do [czytaj: „goł tu") .3 To in stru k cja break sp raw iła. Za pom ocą in stru k c ji b r e a k p rz e ry w a n a została ta p ętla. for(i=0 . m. f. 3 Wykonanie tego fragmentu objawi się na ekranie jako: ***** Kontynuujemy zewnętrzna petle for dla i = 0 ★ * ** K Kontynuujemy zewnętrzna petle for dla i = 1 ***** Kontynuujemy zewnętrzna petle fcr dla i = 2 * * * TT * Kontynuujemy zewnętrzna petle for dla i . .. i = i + l ) { for(m = 0 .

o zn acza tu . że program (nad-) używ ający instrukcji g o t o jest dla p ro g ram isty nieczytelny. że się jest złym p ro g ram istą.42 Rozdz._ s(.. 4_ // O if(blad_operacji)goto berlin. Instrukcje sterujące In stru k cja g o t o u ży w an ie instrukcji goto z d ra d z a . by etykieta b ard ziej rzucała się w oczy. 2. k. Ten fragment objawi się na ekranie jako: Cos piszemy Piszemy dalej P rzypom inam . k = k+4 ) ( / / . nie m a żad n eg o znaczenia d la kom pilatora. To dlatego. d o której przeskakujem y. std::cout « "Tego nie wypiszemy // <-wto miejsce aaa: std::cout << "Piszemy dalej".. Instrukcji tej praw ie zaw sze d a się uniknąć. O to przykład: int m. W języku C++ nie m o żn a sobie skoczyć z dow olnego p u nktu p ro g ra m u w do­ w olne inne. (O tym pom ów im y na stro n ie 70). .. O to przykład użycia goto std: :cout « "Cos piszemy \n". a dla kom pilatora tru d n y d o eleganckiej kom pilacji. zakresie ważności. N a zew nątrz .na ze w n ą trz tych zag n ież­ d żo n y ch pętli. k < 100 . .. . Instrukcją break p rz e rw a ć m ożem y p rzecież tylko tę najbardziej zag n ieżd żo n ą pętlę Dzięki instrukcji goto m ożem y w w yjątkow ych p rz y p a d k a c h od razti w yskoczyć na z e w n ątrz. w h i l e (m < 500) { while(i < 20) { f o r (k = 16 . N am je d n a k nie. w którym z n a n a jest etykieta).. /. że to.d goto aaa. łatwiej ją o d sz u k a ć w tekście p ro g ram u . Etykieta. // tu wyskoczymy ! _ _ _ _ u _ _ . m usi leżeć w o b o w iązu jący m w danej chwili tzw. i.. Jem u jest to w sz y sj tko jedno. iż w naszym p rzy k ła d zie etykietę w y su n ą łem bliżej lew e­ go m arginesu. W Mimo tej niesławy są sytuacje. (Z aw sze jednak tylko w ram a ch tego bloku p ro g ra m u . gdy instrukcja goto się przydaje N a p rz y k ła d dla n atychm iastow ego o p u szczen ia w ielokrotnie zag n ieżd żo n y ch pętli lub instrukcji switch. Dla nas chyba lepiej...

. Z apam iętaj. a zaczyna się w y k o n y w a n ie instrukcji kroku pętli. samkoniec: 1 czyli o d p o w ia d a skokow i d o ety k iety stojącej b e z p o śre d n io p rz e d zam y k ającą pętlę k la m rą. k = k + 1) I stel: :cout « "A". i p rzy stąp i d o w ykonyw ania n astęp n e g o obiegu. w ów czas n astąp i w y sk o k O z pętli.Instrukcje sterujące 43 Instrukcja c o n t i n u e > berlin: // etykieta O cout << 'Po opuszczeniu wszystkich pętli Jeśli w ja k iś sposób w trakcie pracy tych pętli z m ien n a blad operacji p rz y b ie rz e w arto ść niezero w ą. k < 12 . W powyższym przykładzie jest to k = k+ 1 .. jednak (w p rzeciw ieństw ie d o instrukcji brea k) sam a pętla nie zo staje p rz e rw a n a . i w y k o n y ­ w an e b ę d ą instrukcje p o cząw szy od etykiety b e r l i n & .10 In s tru k c ja continue In stru k cja c o ntinue p rz y d a je się w ew n ątrz pętli for.) { continue .Rozdz. do. while. std: :cout « "b\n" . 2. ) W rezultacie wykonania tego fragmentu programu na ekranie pojawi się: Ab Ab AAAAAAAAAA Innym i s ło w y napotkanie instru k cji continue o d p o w ia d a jakby takiem u u ż y ­ ciu in stru k cji goto for (. . że ju ż w y k o n ał treść p ętli. W rezultacie k o m p u te r „p o m y śli". if(k > 1) continue.while. . // goto sam koniec. O to p rz y k ła d : for(int k = 0 . k o n ty n u u jąc pracę pętli. P ow oduje o n a zan iech an ie w y k o n y w a n ia instrukcji będących d alszą tre śc ią pętli. c o n t i n u e p rzery w a tylko ten o b ie g pętli i p rzy g o to w u je do ro z p o c z ę c ia następnego. ż e na w id o k instrukcji c o n ­ tinue w y k o n y w a n ie bieżącego obiegu p ętli zostaje z an iech an e . że: W p rzy p ad k u pętli for oznacza to.

Oto kilka w arian tó w while(i < 4) { } while(i < 4) © { ) w h i l e ( i < 4) © i ) W szystkie trzy sp o so b y są jednakow o d o b re. sam_koniec: ) P odobnie w p rz y p a d k u pętli d o . // goto sam_koniec. sam koniec: JwhTle(warunek). ale za to je st on o jedną linijkę krótszy. D laczego nie p rz e s z k a d z a m i w spom niana w a d a zap isu O ? Z d w ó ch p ow odów : . D laczego to takie w ażn e? O tóż jednym z najczęstszych błędów jest zapomnienie o zam knięciu klam ry. Zachow anie pętli w h i l e na widok instrukcji c o n t i n u e m o żn a zilustrow ać podobnie za pom ocą instrukcji g o to while(warunek) { continue. W ynika z tego także. N am aw iam jed n ak d o przyjęcia je d n eg o stan d ard u . " '• .11 K la m ry w in s tru k c ja c h s te ru ją c y c h P am iętasz. G d y stosujem y zap is © i© to w y raźn ie w id zim y . m ów iłem kiedyś.w h i l e do { continue. Instrukcje sterujące K lam ry w instrukcjach sterujących | N astęp n ie dopiero sp raw d zan y jest warunek. // goto seun_koniec.44 Rozdz. W sposobie O tego nie w idać. że język C++ je st językiem o d o w o ln y m formacie. które k la m ry należą d o siebie. O sobiście stosuję zapis © . iż klam ry l ) w naszych instrukcjach sterujących m ożem y staw iać w różnych m iejscach. 2.l i 4 2.

W d ziałający m program ie u s u ń lu b dodaj jed n ą z zam ykających k la m e r i spróbuj to skom pilow ać. P seu d o -k o d . to dzięki tej opcji łatw o z n aleźć błąd. Na p rz y k ła d w jednym z ćw iczeń zam iast p isa ć instrukcje. by się p rzek o n ać. Łatw o o tym zapom nieć. R a d z ę Ci: spróbuj to zro b ić św iad o m ie po to.o ile tylko jeszcze p am ięta­ łem .b ę d z ie s z już w ied ział.to taki te k st p ro g ra m u . 2. która p o zw ala mi o d szu k ać d rugi naw ias: p o k azu ję k u rso rem na n aw ias lew y. szczególnie w ted y . Jeśli n aw et p o g u b ię się z tym i klam ram i w d łu g im program ie.Rozdział. To sam o w p rz y p a d k u klam er. Teraz robię tak: M im o w sz y stk o zap ew n e czasem pogubisz się w staw ian iu klam er. które m o g ły b y odw rócić Tw oją uw agę od istoty zag ad n ien ia. ż e przyczyny m o ż n a szu k ać ró w n ież w n aw iasac h k la m ro w y c h . . 2) M am sposób. D obrze to zapam iętaj. p o te m otw ierałem k lam rę i d łu g o pisałem w szy stk ie instru k cje. k tó ry p raw ie całkow icie p o zw ala mi u n ik n ą ć błędu. g d y w e w n ętrzu są zag n ieżd żo n e inne insrrukcje z klam ram i. i f (warunek). K o m u n ik a t o błędzie m o że być w stylu „zła d e k laracja funkcji" alb o coś w tym rodzaju. u ż y łe m słów : jakaś_instrukcja. jak na to za re a g u je Tw ój ko m p ilato r. 12 Ć w ic ze n ia W naszy ch ćw iczeniach często zobaczysz frag m en ty p ro g ra m u z a n o to w a n e w tak z w a n y m pseudo-kodzie.Instrukcje sterujące 45 Ćwiczenia 1) W m oim e d y to rz e jest kom enda. A lbow iem jego k o m u n ik a t o błędzie w cale nie m usi m ó w ić o b ra k u klam ry. a ed y to r o d szu k u je m i o d p o w iad ający m u praw y. bo g d y p o tem otrzym asz taki sam k o m u n ik at . ż e m a m jakąś k lam rę zam k n ąć. Dawniej robiłem mianowicie tak: P isałem n p . k tó ry zaw iera elem enty (służące ilustracji logiki p ra c y p ro g ra m u ) nie d a ją c e się skom pilow ać. p o czym klam rę u ro czy ście zam y k ałem . (S praw dź czy i w Tw oim ed y to rz e jest p o d o b n a ko m en d a).

. czy po obiegu pętli? Wewnątrz nawiasu instrukcji for są dwa średniki.4 )) ja k a ś _ in s tr u k c ja . gdzie program spodziewa się wyrażenia logicznego.Instrukcje sterujące Ćwiczenia Mamy wyrażenie logiczne (y < 0).przed czy po pojedynczym obiegu pętli? Podaj przykłady realizacji nieskończonej pętli za pomocą trzech poznanych rodzajów pętli (for. else ja k a ś _ in s tr u k c ja . gdy jej warunek jest zawsze prawdziwy. b) i f (a ) jakaś_mstrukcja.46 Rozdz.. by przerwał on pracę tej pętli.przed. Pętla jest nazywana "nieskończoną". którą roboczo nazwaliśmy instrukcją kroku pętli. Na czym polega pętla programowa? Które z trzech poznanych pętli programowych mogą sprawić. n adanie w a r to ś c i ob iekto w i a a) if(a < 6) jakaś_mstrukcja. e) i f ((a + a ) > {a . instrukcji do-while? Co z tej różnicy wynika? Kiedy w instrukcji fo r sprawdzany jest warunek . if {w a ru n c k 3 ) ja k a ś _ in s tr u k c ja .. while. c) if(a + 2) jakaś_instrukcja. więc nie ma szans. // . a j nawet takich poprzedzających ją? (Czyli jakby "wrócić"). Do którego if należą tak umieszczone słowa else? Odpowiedz podając nazwę warunku przy danym if. ł else if (w a r u n e k 4 ) if (w a r u n e k 5 ) ja k a ś _ in s tr u k c ja . else ja k a ś _ in s lr u k c ja . if (w a r u n e k l ) { i f (w a r u n e k 2 ) ja k a ś _ in s tr u k c ja . Po drugim z nich jest instrukcja.2 ) ) jakaś_instnikcja. Jakie mogą być jego wartości? Czy w miejscu. 2. W poniższym pseudo-kodzie trzykrotnie występuje słowo kluczowe else. d) if( (a + 7) < ( 1 0 . do-while). Jak można zakończyć pracę nieskończonej pętli i przejść do o wiele dalszych instrukcji. Które z następujących konstrukcji i f są dopuszczalne? int a. że zawarte w nich instruk­ cje (instrukcje będące ich treścią) nie będą wcale wykonane? Jaka jest zasadnicza różnica między pętlą programową zrealizowaną za pomocą a) instrukcji w h ile . Za pomocą jakich instrukcji można (z pozycji programu) zakończyć pracę pętli i spowodować przejście do wykonywania instrukcji po niej bezpośrednio następujących? Podaj dwa sposoby. że mamy obiekt typu in t o nazwie a. Kiedy jest ona wykonywana . b ) . można postawić na przykład obiekt (zmienną) typu całkowitego int? Jak zareaguje program napotykając taki obiekt zamiast warunku? Załóżmy.

by w ydostać się z w ielokrotnie zagnieżdżonych pętli? Co to jest etykieta? Jakie działanie w pętlach ma instrukcja c o n tin u e ? Jeśli w trakcie wykonywana treści pętli for napotkana zostanie instrukcja continue. w których obie te instrukqe się różnią. . 2. while.Rozdział. Są trzy progi podatkowe (stałe) Zależnie od w ielko­ ści oc odu (między którymi jest progami) podatek oblicza się jedną z czterech proce ur. Czy można się w tym celu posłużyć instrukcją s w itc h ? Mamy dokonać wyboru wariantu działania programu zależnie od wielkości przychodu wy rażonego w złotych (bez groszy). case 5-4: //. Mamy dokonać wy'boru wariantu działania programu zależnie od ilości próbek przeba- 19 P1262 uk*ac*pomiarowy. a jes i więcej niż 12.. Czy można sięw tym celu tu posłużyć instrukcją sterującą switch? Zadanie podobne do poprzedniego. to działaniaB. n a d a n ie w a r to ś c i o b ie k to w i m switch(m) ( case 1: // . lecz nieco zmienione. e i se. / / . czy instrukqa krokowa ? . Jeśli jest ich 6. . a w każdym innym przypadku dzialaniaC. do-while7Jak działa w przypadku. gdy te pętle są zagnieżdżone? Jaką instrukcją sterującą możemy posłużyć się. break: def a u l t : //.. jeśli jest ich 12. Jeśli jest ich 6. . } Jakie konsekwencje ma nie umieszczenie instrukcji break po instrukcjach danej etykiety VV\boru wielowariantowego można dokonać przy użyciu instrukcji s w i tc h lub _ f .. todziałaniaC. . . to co najpierw zostanie wykonane . Przypomnij trzy aspekty. to pode m ujem y działaniaA. . Mamy dokonać w yboru wariantu działania programu zależnie od ilości próbek przebadanych przez układ pomiarowy'.Instrukcje sterujące 47 Ćwiczenia Jaka jest różnica między obiektem zdefiniowanym w w yrażeniu inicjalizacyjnym pętli f o r ' a taklm samym obiektem zdefiniowanym o jedną linijkę powyżej tej pętli fo r ? Czy popraw na jest taka instrukcja s w itc h ? int m. Czy można się tu posłużyć instrukcją s w i tc h d o wybrania odpow iedniej procedury? Jakie działanie może mieć instrukcja break umieszczona w pętlach for. jeśli jest ich 12.. to działaniaB. . to podejmujemy działaniaA. break.sprawdzenie warunku. . case 5-2: // .

K M ógłbyś teraz zapytać: "To znaczy deklarujem y. W zw iązku z ty m . czy zm iennoprzecinkow ą. jak ma w p rz y p a d k u n apotkania obiektu o tej nazw ie postępow ać. II■■<■»■ ' I n»"i— «' «>!■ » * » J 5 3. 3.. m usi zostać zadeklarow ana.H ■ M — — — t l i l i ll« » l m i l lllt r H— «— m m m I M oże to być n a p rzy k ła d typ całkow ity ( i n t ) . że nazwa b oznacza obiekt typu ir. — — — — — — . że dana nazwa ta oznacza obiekt jakiegoś typu. t. a inaczej w sto su n k u d o liczt zm iennoprzecinkow ych.. że co?" — — » I II IM — m m !■■■mi Deklarujemy. Skąd to będzie 1) Z wyjątkiem nazwy użytej w etykiecie.——.kom pilator m u si więc do k ład n ie w ied zieć czy sym bol fc oznacza u n as liczbę całkow itą. itd. że kom pilator n ap o tk ał w naszym pro g ram ie w y rażen ie a + b Jest to d o d aw an ie . Na przykład deklarujemy.. zm ien n o p rzecin k o w y (d o u b le ) . * „ . ż e w kom puterze liczby całkow ite p rzec h o w y w an e są inacze niż liczby zm ien n o p rzecin ko w e . . zatem trzeba u ru ch o m ić specjalny p o d p ro g ra m zajmujący się d o d aw an ie m ..48 Rozdz. Z ałóżm y. b.o p erato r d o d aw an ia m u si inaczej postę­ pow ać w sto su n k u do liczb całkow itych. N apotykając ó w zapis .4:-: To inform uje k o m p ilato r. Typy D eklaracje typów Typy — . W yjaśnijm y to na przykładzie. (Taki p o d p ro g ram nazyw a się też czasem operatorem dodaw ania).1 D ek la ra c je ty p ó w ażd a n azw a* w C++ zanim zo stan ie użyta.

T o „na z e w n ą trz " m oże o zn aczać też jakąś funkcję b ib lio te­ czną. O czyw iście definicja jest p rzy okazji zaw sze tak że d ek laracją . bo p rzecież: jeśli rezerw u je o n a miejsce w pam ięci. Studium języków obcych Różnicę m ięd zy deklaracją a definicją łatw o z ro z u m ie ć i z a p a m ię ta ć tłu m a c z ą c sobie d o sło w n ie te słowa. N ie z a w s z e jednak ch o d zi o p o w o łan ie d o życia. Definicja ta mówi więc kompilatorowi: A teraz zarezerwuj mi w pamięci miejsce na obiekt typu całkowi­ I tego o nazwie b. p o w ie d z ie liśm y k o m p ilato ro w i tak: Jakbyś n ap o tk ał n a z w ę b. O zn acza to. lecz także żąd am y w ty m m iejscu. co oznacza nazw a b. b y zarezerw o w ał w pam ięci obszar na tę zm ie n n a . że oznacza ona zm ienną I (obiekt) ty p u i n t . 3. a tu chcem y tylko p o in fo rm o ­ w ać k o m p ila to r o jej typie. Definicja zaś . k tó ry m zajm u je się w łaśn ie ko m pilator.in fo rm u je kom pilator.czyli pow ołał ją d o życia. k tó rą dołączym y d o p ie ro na etapie lin k o w a n ia. ż e d a n a n azw a re p re z e n tu je o iekt jakiegoś ty p u . Po to p o trzeb n a m u ta d ek laracja. Typy 49 D eklaracje typów w ie d z ia ł? W łaśnie z deklaracji. ale nie rezerw u je d la n ieg o m iejsca w p a m ię c i. W trakcie k o m p ilacji n aszeg o p lik u .d o d a tk o w o rezerw u je m iejsce. na p rzy k ła d na z e w n ą trz p lik u . jak ieg o ty p u jest ta „ z e w ­ nętrzn a zm ien n a b. Deklaracja: . g d zie p o w o łu je się obiekt do życia. to w ied z. to m usi o n a p rzec ież k o m p ilato ro w i w y ja ś n ić na co rezerw u je. a definicją D eklaracja . że o b iek t ty p u i n t o n a z ­ w ie b ju ż g d zieś istnieje. kom pilator m u si ju ż jednak w ied zieć. iż infor­ m u jem y k o m p ilato r o tym . g d y z m ie n n a ta już g d zieś w p ro g ram ie istnieje. Definicja je st m iej­ scem. czy li p isząc i n t b. D efiniow ać g o (powoływać go do życia) można tylko raz. że nie tylko. T utaj d ek laracja jest ró w n o cześn ie definicją. D eklarując w cześniej zm ien n ą b jako typu inte- g er. Słow o e x t e r n (zew nętrzny) inform uje k o m p ilato r. Deklarować obiekt można w tekście programu wielokrotnie. e x te r n i n t b. M o że być przecież sytuacja. Powtórzmy więc różnicę między deklaracją.Rozdział.

co dana nazwa oznacza. Deklaracja naz­ wy N jest więc tylko wyjaśnieniem kompilatorowi. W ten sposób odbyły się narodziny obiektu o nazwie N. które są przydzielane w ten sposób obiektowi. w które język C++ jest stan d ard o w o w yposażony. które m o żesz sobie wymyślić sam em u. 3. N ato m iast ty p o m definiow anym p rzez użytkow nika pośw ięcona jest dalsza część książki. Defin iować . tu omówimy dwa P ierw szy m ożliw y podział. W prow adźm y w ięc pew ien p o rząd ek . Drugi możliwy podział. Na przykład: gdyby typem fundamentalnym było "jabłko ".3 T y p y fu n d a m e n ta ln e O to ich lista: .2 S ys te m a ty ka ty p ó w z języka C ++ W deklaracji określa się. O czyw iście w śród ty p ó w w budow anych m ożna w yróżnić typy fu n d a m e n ta ln e i złożone. De-klarować to jakby: wy-jaśniać. Typy Systematyka typów z języka C++ od łacińskiego clarus: jasny. Definicja: pochodzi od łacińskiego słowa fin is . Jakie m am y do dyspozycji typy? Jest ich dużo. tamta i jeszcze ta komórka . //d e fin icja + deklaracja extern int licznik. Możliwych jest wiele podziałów typów. Mówi się: ta. to podział na: ♦♦♦ typy fund am en taln e (jakby najbardziej podstaw ow e). Ta cecha jest chyba jednym z najlepszych pomysłów w języku C++ W tym tomie "Sym fonii” zajm iem y się ty p am i w b u d o w an y m i. to podział ze względu na autora danego typu: ♦♦♦ typy w b u d o w a n e .stają się od tej pory obiektem o danej nazwie N.to jakby zakreślać granicę.to typy. które w swej istocie w y k o rzy stu ją istnienie jakiegoś typu fundam entalnego). Zresztą po polsku też mówi się: „klarmoać coś komuś". zrozumiały. / / deklaracja (ty lk o !) 3.koniec. «$♦ typy złożone (czyli takie.50 Rozdz. że dany obiekt jest jakiegoś typu.to takie. ♦♦♦ typy zd efin io w an e p rzez użytkow nika . granica. Oto przykłady definicji i deklaracji: in t 1 ic zba. W naszym przypadku tę granicę wykreśla się wokół komórek pamięci. 3. to typem złożonym mógłby być typ "kosz jabłek".

Rozdz. u n s ig n e d . o k tó ry m p o ro zm a w iam y n ieb aw em (str. 2) ang. char Z n ak am i a lfa n u m ery cz n y m i są n a p rzy k ła d litery. ż e ch o d zi n am o ty p s ig n e d i n t a .długi !) alfanumeryczne . T y p bez zn ak u m o ż e p rz e c h o w a ć ty lk o liczbę d o d atn ią. "kar"]. i n t jest sk ró te m od an g ielsk ieg o słow a integer? Jeśli ch cielib y śm y m ieć w p ro g ra m ie zm ien n ą p rzech o w u jącą jakieś w artości całko w ite. T yp d o p rz e c h o w y w a n ia z n a k ó w alfan u m ery czn y ch 3. e d 5 np. ż e obiekt ta k ie g o ty p u m o że p rz e c h o w y w a ć liczbę u je m n ą lub d o d atn ią. ch a ra c ter (znak pisarski) i) ang.[wym. sh o rt . k tóry z nich w ybrać.z e zn ak iem i b e z zn aku. Typy 51 Typy fundam entalne T y p y p rz e z n a c z o n e d o p rzec h o w y w an ia i p racy z liczbam i całkow itym i sh o rt in t inaczej: sh o rt in t lo n g i n t inaczej: lo n g o ra z tak z w a n y ty p w y liczen io w y enum . oznacza. to w y b ie rz ty p i n t . s ig n e d i n t u n s ig n e d i n t W y p o saże n ie ty p u w zn ak s p ra w ia . „ansajnd"] . ż e zapis int a . O b iek ty ty p u c h a r * m o g ą p rz e c h o w y w a ć p o d staw o w y z e s ta w takich z n a k ó w W szystk ie p o w y ż sz e ty p y i n t i c h a r m ogą b y ć w d w ó c h w a ria n ta c h . ang.z e znakiem.krótki [czytaj: "szort"].całkowity [czytaj: "intidżer"] ang. to z m ien n a ta m o ż e b y ć jednego z tych trzech w y m ien io n y ch w yżej typów . Jest to skrót od ang. bez znaku [czytaj: „sajnd". P rzez d o m n ie m a n ie przy jm u je się. czyli ty p z e znakiem .ten termin powstał z połączenia słów: alfabetyczne + num eryczne 1) char . Do w y b ra n ia w arian tu p o słu g u je m y się p rz y d o m k a m i (specy fik ato ram i) s i g n e d lu b u n s i g r . Jeśli n ie w iesz. 3. in teger . sig n ed . l o n g . 87).

3. bo obiekty tego typu zajmują zwykle więcej komórek pamięci. Tym czasem b y w ają przecież języki.d łu g i) o zn acza w y d łu ż o n ą .*jr. u m o żliw iają p racę n a liczbach rzeczyw istych z ró żn ą d o k ład n o ścią. .[czytaj: "łajd karakter' J. Typy Typy fundam entalne N ato m iast w p rz y p a d k u ty p u c h a r sp raw a n ie jest tak prosta. <♦ d o u b l e 2 p o ch o d zi o d słów ang.p o d w ó jn a d o k ła d n o ść <♦ l o n g d o u b l e .■. czy przez d o m n iem an ie b ęd ziem y m ieli s i g n e d czy u n s i g n e d . Jak te n azw y zapam iętać? <♦ f l o a t 2 . T y p d o rep rezen tacji o b iek tó w logicznych bool 6) ang.zm ien n y p rzecin ek . ć„ Nazwa w char_ t jest jakby skrótem od angielskiego wide character (znakszeroki). long . .52 Rozdz. że zw ykły ty p c h a r m oże p rz e w a ż n ie służyć do p rzech o w y w an ia tylko z n a k ó w z p o d sta­ w o w e g o zestaw u 256 liter. doubleprecision . T yp m ogący p rzech o w y w ać rozszerzony z e sta w znaków alfan u m ery czn y ch w c h a r_ t W p ro w ad zo n y o n zo stał sto su n k o w o n ie d aw n o . o d rę b n y m typem . „ . to użyj typu d o u b l e . To. Szeroki. M ów im y krótko: zależy to od im plem entacji danego kom pilatora. - d o u b le •' / f i SVri . Na końcu nazwy tego typu jest dodatek _ t. 8) d o u b le [czytaj: „dabl"]. W C++ realizacja tego ty p u nie w y m ag ała ju ż żadnej chytrości. w id e ch a ra c te r . w k tó ry ch jest o w iele więcej liter. ulepszone w ersję ty p u o p odw ójnej precyzji. C zasem m ów i się na to rozszerzont dokładność Z ap am iętaj *«*»«*** Jeśli nie wiesz. którego z tych trzech typów zm iennoprzecinkow ych użyć w definicji swojego obiektu. niż zwykły ch a r. "V * T ypy rep rezen tu jące liczby zm ien n o p rzec in k o w e flo a t rrj fig i m J u d o l i i i . Pow odem był fak t. co jest śladem po chytrym sposobie realizacji tego typu w języku C.jest ró ż n e w różnych kom pilatorach. floating point . T y p ten jest p ełn o p ra w n y m . 7) f l o a t [czytaj: „flołt"]. >'v-' uiri g 'u v / sin fitd y w lo n g d o u b ler\ ■ .p o ch o d zi o d słów ang.«.(ang.

• . czy nie.prawdziwy. bo tak re p re z e n to w a n y jest s ta n f a l s e . Typy 53 Typy fundam entalne N a z w a te g o ty p u p o ch o d zi o n n azw isk a sły n n eg o m a tem aty k a. P rzy p o m in am : Załóżmy. Alłx> czy w grze komputerowej ma być tło muzyczne. spowoduje przypisanie obiektowi c z y g r a c wartości t r u e l u b f a l s e .fałszywy. że obiekt o nazwie x jest typu całkowitego i n d przechowuje ju ż jakąś sensowną wartość.1864). brytyjski m atem atyk i filozof. Jeśli tak zrobimy. Zatem instrukcja c z y g r a c = (x < 12). W tej s y tu a q i d o o b ie k tu c z y g r a c w s ta w io n a (p rz y p is a n a ) zo stan ie w arto ść f a l s e .^ O b iek ty ty p u b o o l m ogą p rz ec h o w y w ać jedną z d w ó c h w artości: prawda lu b fałsz.George Bool (1815 . zależnie od obecnej wartości x. G eorge'a Boola. // «—definicja obiektu czy_grac = f a l s e . • Jeśli zaś w o b iekcie x jest teraz w a rto ść w ię k s z a lu b ró w n a 12. 3. W p o p rz e d n im ro zd ziale ro zm a w ialiśm y ju ż nieco o ty p ie b o o l i tam z o b ac zy ­ łeś. M ożna je d n a k p rz y p isa ć d o ta k ie g o ob iek tu w arto ść t r u e lu b f a l s e bool c z y _ g ra c . . że w obiekcie ty p u b o o l n ie przechow uje się p o lsk ieg o w y ra z u prawda lu b p o lsk ieg o w y razu fałsz. Na przykład czy decydujemy.n a p ra w d ę i ta k w s ta w io n e tam z o stan ie zero. lu b jakąś n aszą decyzję. by próbki pomiarowe były wirowane czy n ie.i ro zm aw ialiś­ m y o niej w p o p rz e d n im ro zd ziale. W C ++ u ży w a się zresztą angielskich o k re śle ń true i false^. Z asad a jest b a rd z o p ro s ta .rue) za pom ocą w arto ści niezerow ej jaką je s t 1. jak d o o b ie k tu ty p u b o o l p rzy p isać re z u lta t s p ra w d z e n ia jakiegoś w a ru n k u . f a l s e [czytaj: "folls"] . 10) t r u e [czytaj: "truu”] . O czyw iście d o m y ś la sz się ch y b a. to w rzeczywistości w n aszy m ob iek cie c z y _ g r a c z n a jd z ie się w arto ść 1. Jed n ak n aw et te a n g ie lsk ie słow a nie są w obiekcie ty p u b o o l p rzec h o w y w an e. to w y ra ż e n ie x < 12 jest w y ra ż e n ie m p ra w d z iw y m . Z w y k le d o takich o b iek tó w w p isu jem y efekt s p ra w d z e n ia jakiegoś w aru n- ku lo g iczn eg o . Z atem w te d y o b ie k to w i c z y g r a c z o s ta n ie p rz y p is a n a w arto ść t r u e . Podobnie przypisujemy wartość t r u e . 9) b o o l [czytaj: "buul"] . to w y rażen ie x < 12 staje się w y ra ż e n ie m fa łsz y w y m .Rozdział. // przypisanie temu obiektowi wartości f a l s e Jed n ak m im o ta k ieg o p rz y p isa n ia . • Jeśli obecnie w a rto ść p rz e c h o w y w a n a w o b ie k cie x b y ła m n iej­ sz a od 12. n a to m ia s t stan prawda ( . . S ta n fałsz ( f a l s e ) p rz e c h o w y w a n y je st z a p o m o c ą w artości 0.

Jeśli ma on tylko sześć czarnych krążków z namalowanymi cyframi . ile dany kom pilator przydziela kom órek pam ięci na zapis danej liczby . astronom icznie w ielką liczbę całkowitą. O biekty d an eg o typu w pam ięci są realizo w an e za pom ocą skończonej ilości bitów.54 Rozdz. to na liczniku tym pojawi się 000000. p o co są aż trzy typy reprezentujące liczby całkow ite oraz trz y ty p y rep rezen tu jące liczby zm iennoprzecinkow e. P rzed ział liczb m ożliw ych d o przechow yw ania w obiektach różnych typów fu n d am en taln y ch . że cena tego licznika nieco wzrośnie. który dokonuje kom pilacji Twojego p ro g ram u .. tym w ięk sza jest m ożliw a wartoś< przech o w y w an a). Szerokość w bajtach . 3. C hodzi o to. Widziałeś pewnie kiedyś licznik kilometrów w samochodzie. . D otyczą o n e kom pilatorów pracujących 32 bitowo. Zależnie od tego.oznacza z a pom ocą ilu bitów zapam iętuje się w artość w obiekcie d an eg o typu. by m ożna było lepiej w ykorzystać m ożliw ości danego k o m p u tera i kom pilatora. Tyle tylko. Spójrz na kolum nę d ru g ą i trzecią: Szerokość w bitach . O gólnie m ożna o nich pow iedzieć ty p y arytmetyczne. że największą liczbą. że w obiekcie typu i n t m o żn a przechow yw ać dow olną. Bajt m a 8 bitów . U m ieściłem w niej inform acje o najczęściej s p o ty k a ­ nych w artościach.. . To tylko tak dlc ciekawości. na k tó ry m pracujesz. Z e s ta w ie n ie ty p ó w i m o ż liw y c h d o p r z e c h o w y w a n ia w n ich w a r to ś c i dla k o m p u te ró w /k o m p ila to ró w 32 b ito w y c h _ Szerokość Szerokość N ajczęściej spotykany Ti v ydy . Spójrz n a p o n iższą tabelę..zależy o d typu kom putera.to szerokość w bitach p o dzielona p rzez 8. jaką może on pokazać jest 999999. Typy Typy fundam entalne P oznaliśm y w ięc już ty p y całkow ite i typy zm iennoprzecinkow e. Jeśli przejedziemy jeszcze jeden kilometr. a także oc kom p ilato ra. Oczywiście problem ten można łatwo rozwiązać konstruując licznik 2 siedmioma krążkami.. żt większych liczb ten licznik pokazać już nie potrafi... Dlatego. bo m ożna na nich w ykonyw ać operacje arytm etyczne. Może nie każdy chce ją zapłacić. (Im w ięcej bitów .to znaczy. w bitach w bajtach zakres wartości char 8 1 -1 2 8 d o 127 . Oczywiście nie musisz się treści tej tabeli uczyć na pamięć. N ie jest bow iem tak..dysponujem y m niejszą lub w iększą precyzją obliczeń. Z astan aw iasz się zap ew n e.

Typy 55 Typy fundam entalne | -■■■ . 3.lE + 4 9 3 2 t .. l .. ■ --------- Zestawienie typów i możliwych do przechowywania w nich wartości d la kom puterów/kom pilatorów 32 bitowych T yp Szerokość Szerokość Najczęściej spotykany w bitach w baitach zakres wartości u n s i g n e d char 8 1 0 d o 255 s i g n e d char 8 1 -1 2 8 do 127 .4E-4932 d o l..Rozdział. .7E-308 d o 1. -i wchar t 16 2 0 d o 65535 1' short int 16 2 -32768 d o 32767 ' s i g n e d short int 16 2 -32768 d o 32767 u n s i g n e d short int 16 2 0 d o 65535 int 32 4 -2147483648 d o 2147483647 s i g n e d int 32 4 -2147483648 d o 2147483647 u n s i g n e d int 32 4 0 d o 4294967295 long 32 4 -2147433648 d o 2147483647 s i g n e d long 32 4 -2147483648 d o 2147483647 u n s i g n e d long 32 4 0 d o 4294967295 f loat 32 4 3. .7E+308 l o n g double 80 10 3.4E-38 d o 3..4E+38 double 64 8 1. .

dalsze obliczenia } W tym p rzy k ład zie w id zim y . nie p rz e ry w a ją c n o rm aln eg o to k u pisan ia p ro g ra m u . C o p ra w d a . O biekt m o ż n a zdefiniow ać „ w bieg u ".1 D efiniow anie obiektów „w biegu".na w sp ó łczy n n ik załam an ia. z jakim konkretnie k om pilatorem masz d o czynienia - m o żesz liczyć na to. będziesz się m ó g ł przekonać stosując operator s i z e o f (rozmiar). „w locie" Tang. Tak też jest w klasy­ czn y m C. g d zie sobie o zm iennej p rzy p o m n ieliśm y 0 . że: ♦♦♦ c h a r — ma co najm niej 8 bitów (1 bajt). lub g d z ie w y n ik ła k onieczność jej istn ie­ nia.. W naszych dotychczasow ych program ach ju ż kilkakrotnie sp o tk aliśm y się z definicjam i zm iennych. ♦> lo n g — ma co najm niej 32 bity (4 bajty). //. O tym . Ten sposób je st n aw et logiczniejszy. klasycz­ n y m stylu. jaką w arto ść p o w in ien o n w stęp n ie . N iezależn ie od tego.w tedy. W C++ zasada ta nie obow iązuje.. ♦♦♦ s h o r t i n t — m a co najmniej 16 b itó w (2 bajty). (N a str. // ® s t d : : c i n » w sp ó łc z y n n ik . jak zapisuje d a n y typ Twój kom pilator. 3. m ięd zy dw om a instrukcjam i . że p rzed instru k cjam i w y k o n y w a n y m i w funkcji m a in jest definicja obiektu typu f l o a t O .. onflight]. ż e p o trz e ­ bujem y jeszcze jednego o b iek tu f l o a t . że jest on n am w łaśnie potrzebny. O p erato r ten przed staw im y niebaw em . jed n ak w innych p rz y p a d k a c h — często w linijce. gdy u z n a m y . 3. w s p ó łc z y n n ik ma b y c: " << w s p ó łc z y n n ik . O to przykład: # in c lu d e < io stream > i n t m ainO ■ // flo a t d lu g o s c _ fa li. M ożem y w rócić d o O i tam d o p isać n astęp n ą definicję. Typy Typy fundam entalne Przykładem jest choćby typ wcha r_ t. W niektórych językach program ow ania definicje obiek­ tó w p o w inny nastąpić p rz e d w ykonyw anym i instrukcjam i. którego rozmiar jest lołaśnie zależ­ ny od implementacji. w naszym p rzy k ła d zie w arto ść w czy ty w aliśm y z k la w ia tu ry . •' v std::cout « "Podaj współczynnik załamania: f l o a t w s p ó łc z y n n ik . s t d : : c o u t « " Z rozum iałem .3. w której w y n ik ła k o n ieczn o ść istn ien ia obiektu — już d o k ła d n ie w iem y. R obim y w ięc tę definicję w biegu. 113). a le m o żem y też zro b ić to tu .56 Rozdz. Jest to definicja w sta ry m . T ym czasem w trakcie p isan ia program u d o ch o d z im y d o w n io sk u .

ż e c h o d z i o n a p r a w d ę czaso ­ chłonn e obliczenie. O to p rzy p o m n ien ie : for(int licznik = 0 . .Rozdział. je s t znany i m oże być używany tylko w ram ach tej instrukcji for . licznik < 12 . . W te d y o p ła c a się w ykon ać je jed n o k ro tn ie. M o ż e m y w ięc nie ty lk o zd efin io w ać obiekt. Dbiekty definiowane w miejscu warunku i f M ożliw e je st zd efin io w an ie ja k ieg o ś obiektu w w a ru n k u instrukcji if. 3. ) //t u o b ie k t rząd j u ż n ie j e s t d o s tę p n y Jak w id z isz . Tak zdefiniow any obiekt. że: istnieje on. a r e z u lta t schow ać w c h w ilo w y m o b ie k c ie . że m o żn a d efin io w ać o b iek t ró w n ie ż w instrukcji p ę tli for. M a to ta k ie konsekw encje. else 1 cout « "Zerowy rząd (rzad= " << rząd « " « endl. W y o b raź sobie je d n ak . T ak ie po stęp o w an ie d aje szy b szy p ro g ram (bo to m niej p ra c y n iż w a ria n t z p o w tó rn y m w racaniem d o zm ien n ej. w p o w y ższy m w y ra ż e n iu w a ru n k o w y m in stru k c ji i f jest ja k aś 'czasochłonna operacja matematyczna" (u n a s to z w y k łe d zielen ie). 34) zobaczyliśm y też.i o czyw iście w jej bloku (treści pętli). ale o d razu (w tej sam ej instrukcji). Typy 57 Typy fundam entalne zaw ierać. . o b iek t o n azw ie l i c z n i k zo stał z d e fin io w a n y w instrukcji pętli for. w jej części o d p o w ied zialn e j za inicjalizację p ra c y pętli. by jej n a d aw ać w artość). | O czyw iście tu ta j te operacje "m atem aty czn e" b y ły p ro s te (zw y k łe d z ie le n ie ). <$► a jej re z u lta t z ap isa n y z o staje w specjalnie n a te n cel p rz y g o to w a n y m o b iekcie ty p u i n t . którego nie c h ce m y w b loku i f p o w ta rz a ć . (M a o n n a z w ę r z ą d ) . . je st d o stę p ny w ew nątrz bloku i f . oraz w e w n ą trz odpow iadającego mu bloku else. Definicja na potrzeby pętli for W p o p rz e d n im ro zd ziale (na str. (T u ta k ż e m o ż n a s k o r z y s ta ć z o b ie k tu licznik) 1 // t u o b ie k t licznik je s t j u ż n i e z n a n y Jak w id z im y . w ięc k o rzy ść n ie jest d u ża. // tr e ś ć p ę tli. n a d a ć m u w artość. k tó ry . licznik++) { . N a p rzy k ład : ■ if(int rząd = ilosc / ile w rzedzie) cout << "Jesteśmy w " << rząd << " rzedzie" << endl.

m k ts n r*:.jiwoą i U&hc. p o jej zakoń­ fOaUużrr. a oczyw iście obiekt r z ą d tak że byłby d o stęp n y w bloku i f i bloku e l s e . p rzesta n ie od istnieć. ' r • *!tiG>nr.58 Rozdz. Jeśli w cale n am na tym jego d alszy m istnieniu nie z a le ż y . if(rz ą d ) { c o u t « " J e s te ś m y w " << rząd << " r z e d z ie " « e n d l . (Pm czeniu. Dzięki tem u. } e ls e { c o u t << "Zerow y r z ą d (rzad = " << rząd « " ) " << e n d l ..lepiej posłużyć się op isan y m tutaj sposobem . II tu obiekt r z ą d nadal istnieje i jest dostępny W instrukcji i f sp raw d zalib y śm y tylko w artość tego obiektu r z ą d . w h i l e ( i n t r z ą d = i l o s c / ile _ w _ rz e d z ie ) * II tu możemy korzystać z obiektu rz ą d //••• 3.. int rząd = i l o s c / ile _ w _ r z e d z ie . Takich stałych dosłow nych u żyw am y na p rzy k ła d . 3. "W itam y na pokładzie"). czyli zd efin io w ać go w w y rażen iu w aru n k o w y m instrukcji i f . m ogą to być znaki (litery) albo napisy. M ogą to też być słow a t r u e / f a l s e . ciąg i znaków przezn aczo n e d o w ypisania na ekran (np. W szy stk o od b y ło b y się p o d o b n ie . (nt. by w staw ić je d o jakichś zm ien n y ch . czy li obiekt r z ą d z d e fin io w ać jeszcze p rzed instrukcją i f i tam też w ykonać n a sz ą operację "m atem atyczną".poza jed n y m faktem: Po zak o ń c z e n iu całej in s tru k c ji i f o b ie k t r z ą d istn ia łb y nad al. 3. bo spraw a jest p odobna: Jeśli w wyrażeniu warunkowym instrukcji w h i l e zdefiniujemy ja kiś obiekt chwilowy. Obiekty definiowane w wyrażeniu warunkowym instrukcji while P ew n ie się już dom yślasz..v Oczywiście mogliśmy postąpić "po staremu". M ogą to b y ć napisane do sło w n ie liczby (np. Typy Stałe dosłowne b ę d z ie n am p rz y d a tn y tylko w tej instrukcji i f (w jej bloku i odpow iadającym jej b lo k u e l s e ) . to jest on dostępny w całym bloku (ciele) tej instrukcji w h i l e .4 S ta łe d o s ło w n e W tekście p rogram u często posługujem y się stałym i.14).

D.l Stałe będące liczbami całkow itym i Stałe takie zap isu jem y tak. 010 . W zapisie szesnastkowym można się posługiwać zarówno wielkimi literami X. . C. 3. ż e w ystępujące w zap isie szesn astk o w y m znaki a . że zasto so w aliśm y zapis liczby w system ie ósem kow ym (oktalnym ). g d y w ystępują one w w yrażeniach ary tm ety czn y ch i = i + 5. gdy dosłownie p iszem y w p ro g ram ie jakąś w artość (liczbę. g d y chcem y coś z n im i porów nać i f (rr. > 12) Z w racam uw agę. O czyw iście p o n iż sze instrukcje: in t o b ie k t. Po co więc sobie utrudniać i pisać coś w zapisach innych niż dziesiątkowy? Pytanie jest tendencyjnie p o staw io n e.czyli dziesiątk o w o 15 * 16 + 15 = 255 N ie m uszę ch y b a przypom inać. Ta dygresja je st przeznaczona d la w tajem niczonych. Z ap o zn am y się tu ze sposobam i zap isy w an ia takich stałych. c . g d y ch o d zi n am nie o liczenie typu m atem atycznego. f oznaczają w z a p isie dziesiątk o w y m o d p o w ie d n io 1 0 . 15. w ięc.czyli dziesiątk o w o 1 0 * 1 6 + 1 =161 0xff ..jeśli to jest Twoje pierwsze spotkanie z programowaniem.. to poniższe słowa mogą wydać Ci się niezrozumiałe. ż e w obiekcie znajdzie się taka sam a w artość.. // przy użyciu zapisu szesnastkowego o b ie k t = 017. jak d o tego przyw ykliśm y w szk o le 17 -3 3 0 1000 itd. to k o m p ilato r zro zu m ie.Rozdział. // przy użyciu zapisu dziesiątkowego ob i e k t = 0x f . E. jak i małymi.czyli d ziesiątk o w o 1 * 1 6 + 0 =16 0 x al . 1 4 . który ma a k u ra t taką w artość. o b ie k t = 15.czyli dziesiątk o w o 1 * 8 + 0 = 8 014 . 1 3 . 0x10 . d . B. Typy 59 Stałe dosłowne lub w ted y .. // przy użyciu zapisu ósemkowego pow odują.czyli dziesiątk o w o 1 * 8 + 4 = 1 2 091 . w zapisie ó sem k o w y m cyfra 9 jest n ied o p u szczaln a. napis). 12 . że w tym miejscu ch o d zi n a m o stałe dosłow ne. P o prostu chodzi o sytuację. / / powiększenie obiektu i o siatą 5 albo w ted y .błąd. Jeśli n ato m iast zap is stałej zaczn iem y od cyfry 0 (zero). czy li o sam zapis lic z b y (czy tekstu). 1 1 . a le o u staw ian ie b itó w w k o m ó rce pam ięci. a nie o jakiś obiekt. . Jeżeli stała z a c z y n a się o d 0x (zero i x) to k o m pilator u z n a . U . F. A. T ak się dzieje często. że w sto su n k u d o stałej zasto so w aliśm y zapis szesn astk o w y (heksadecym alny). b . e . O tóż czasem u ż y c ie innego z a p isu jest w łaśnie ułatw ien iem sobie pracy.

a gdyby m usiał to samo zapisać dziesiątkowo. którzy n ie sp o tk ali się z szesn astk o w y m i ó se m k o w y m sy ste m e m liczen ia z a p ra sz a m te ra z d o p rzeczy tan ia zam ieszczo ­ nego n a k o ń cu k siążk i d o d a tk u A (str. ch y b a że rep reze n tu ją ta k w ielkie liczby. R obi się to p rzez d o p isan ie n a k o ń cu liczby: litery L (lu b 1) • i'. ■. by to sobie przeliczyć (768). to do jakiego konkretnie typu się ona zalicza? Stałe całk o w ite tra k tu je s ię ta k jak ty p i n t . że używając tego zapisu szesnastkowego wystarczy wyobrazić sobie pozycje żądanych bitów . Sł? ?>ń) v ■'. ż e są ty p u lo n g . C z y te ln ik ó w n ie w ta je m n ic z o n y c h . że d a n a stała m a być ty p u u n s i g n e d l o n g . Gdyby chodziło o ustawienie samego bitu 9 i 10.60 Rozdz. b y d a n a sta ła była ty p u u n s i g n e d . Typy Stałe dosłowne Zatem: dlaczego dla ustawiania bitów w obiekcie . niemal automatycznie. Jeśli zapisujemy w programie stałą dosłowną typu całkowitego.programiści wolą zapis szesnastkowy? Dlatego. Jeśli ch cem y . szesnastkowo zapisać. to sp raw i to d o p is a n ie na końcu litery u 277u P rz y p ise k u m oże w y stą p ić razem z p rz y p isk ie m L 50uL w ó w c z a s oznacza to. 3. W ó w czas stała taka jest ty p u lo n g .a wtedy da się to. gdyż mała za bardzo przypomina jedynkę.'foiSzBTieast: są ty p u i n t . W O to p rz y k ła d zap isu ty ch stałych w p ro g ram ie: #include <iostream> f3$S9<f IkW int m a i n O { // definicja obiektu int i : . Z atem stałe dosłow ne: Cflórt *0 i* ..z ty p u i n t n a ty p l o n g . to potrzebowałby pewnie kartki papieru. k tó re n ie zm ieściły b y się w i n t . Osobiście zawsze używam tu wielkiej litery L.d o p is a n a na końcu litera L sp ra w ia . ‘ ‘ OL 200L M im o ż e liczby te w y starczająco d o b rze m ieszczą się w ty p ie i n t . 1228). wprawny programista od razu zapisze obiekt = 0x300. M o żn a św ia d o m ie zm ienić ty p n a w e t niew ielkiej stałej . Oczywiście trzeba do tego odrobinę wprawy.

Rozdział. czasem d r e i . Uczyli i + 8 scd::cout << "k= " « k « std::endl.4.3 3. k = i + 010.2e-3 oznacza 5. ) W wyniku wykonania na ekranie pojawi się k= 13 m+n+j= 420 Wypisujemy: 34 18 22 • • ■ Z auw aż.1416 -1000. a typ ten ma mniejszą dokładność niż d o u b le . ż e zastosow anie k tó reg o ś z zapisów (dziesiątkow ego. (M ałą lub w ielką) float x = 12. n = 0x100. W zap isie tym w y stę p u e lite ra e.4 * 108 czyli 1 040 000 000 5. A zatem: 8e2 oznacza 8 *102 czyli 800 10. czasem t h r e e . to n o rm aln y zap is liczby z kropką d ziesiętn ą 12. j = 0100. .5F. by stała dosłow na (zm ien n o p rzecin k o w a) była typu f l o a t .3 -1 2 . 3. o k taln eg o . D rugi zap is jest nazyw any notacją w ykładniczą. że stałą typ u d o u b le próbujesz wpisać do typu f l o a Ł.0052 Stałe takie trak tu je się tak. T o tak.4e8 oznacza 10.:cout << "m+n+j= " << (m+n+j) « "\n". to kompilator wypisze Ci ostrzeżenie. Pierw szy. o jaką liczbę nam chodzi. mantysa). jakby b y ły typu d o u b le . (a nie d o u b le ) . m. K om puter i tak p rzetłu m aczy to sobie na swój w łasny sp o só b (binarny).2 * 10-3 czyli 0. m = 100. heksadecym alnego) jest tylko je d n y m ze sposobów p o w iedzenia. $. std::cout « "Wypisujemy: " « 0x22 « " " « 022 « " " « 22 « "\n". j. jakbyśm y rach m istrzo w i pow iedzieli czasem t r z y . jeśli chciałbyś. n. to um ieść na jej końcu literę F. bo jeśli taka stałą będziesz próbował przypisać do obiektu typu f l o a t. i = 5.2 Stałe reprezentujące liczb y zm iennoprzecinkow e Stałe takie zap isać m ożna na d w a sposoby. Typy 61 Stałe dosłowne int k. po której następuje w ykładnik p o tęg i o p o d staw ie 10 (tzw . std. Warto o tym pamiętać.

. że k o m p u ter nie potrafi p rzech o w y w ać w swojej pam ięci żadnej litery 'A '.spotkałeś się ju ż na pewno przy programowaniu w innych znanych Ci językach programowania. (Wdodatku z możliwych 256 znaków. czyli tym. jakimi liczbami reprezentowane są jakie znaki. Typy Stałe dosłowne 3. M ożna je w ięc p rzy p isać d o obiektów (zm iennych) typu c h a r . O czyw iście w iesz n a pew no.jest to skrót od: American Standard of Codę Interchanged Information. 3.3 Stałe znakow e Stałe zn ak o w e są to stałe reprezentujące na przykład zn ak i alfanum eryczne.62 Rozdz.^ Z tabelą kodów ASCII. znak = 'A ' . tylko pierwsze 127 jest objęte standardem). Jednym z najbardziej popularnych jest chyba kod A S C II. D latego w szyst­ kie litery alfabetu angielskiego i znaki specjalne zostały p o p ro stu po n u m e­ row ane. Z apisuje się je u jm u jąc d an y znak w d w a apostrofy 'a' . To jakby najbardziej podstawowy zestaw. 1 1) [czytaj „aski"] . o zn acza literę a ' 7' .4. nie liczbę) Z naki w taki sposób zap isan e (takie znakowe stałe dosłowne) są ty p u c h a r . o zn acza cyfrę 7 (cyfrę. O to przykład: char znak. Zestaw znaków ASCII nie zawiera jednak wszystkich możliwych liter ze wszystkich języków świata. M oże jednak przechow yw ać liczby. To ten n u m e r (kod) danego zn ak u jest p rzech o w y w an y w pam ięci kom putera. Są różne sposoby numerowania (kodowania) znaków.

o d w ro tn a k resk a u k o śn a. 1/apostrof Z apis ten ro zu m iern y tak: d w a z e w n ę tr z n e ap o stro fy . carriage Return) \t . by w obiekcie o nazzuie z z znalazł się znak sterujący mogący spowodować przejście do nowej linii. a potem a p o stro f. C z y ta m y to tak: D w a najb ard ziej z e w n ę trz n e ap o stro fy m ó w ią n am . m u sim y d o d a ć k re s k ę u k o śn ą: char c = ’ . Vertical tabulator) \a . co na liście niezw y k ło ści o zn ac za litera n . z a p is re p re z e n tu je je d e n znak. że m am y d o czy n ien ia ze stałą d o s ło w n ą b ęd ącą z n a k ie m . o d w ro tn e g o u k o śn ik a [ang. Tabulator) \v . Potem o d w ro tn y u k o śn ik . ta b u la to r p o zio m y (ang. 2) backslash .słu żą bow iem d o s te ro w a n ia w y p isy w a n ie m tekstu n a e k ran ie (d ru k a rc e ). O d w ro tn y u k o ś n ik (bekslesz) je st w ty m p rz y p a d k u o strzeż en iem . \b . n o w a stro n a (ang. bo z n a k a p o s tro fu jest ju ż r a z w tej konstrukcji u ż y w a n y w in n y m z n a c z e n iu (o g ran iczn ik ). ta b u lato r. w ięc p o ja w ia się k ło p o t jak z a p is a ć stałą z n a k o w ą będącą sam y m zn a k ie m ap o stro fu ? U jąć apostrof w d w a in n e ap o stro fy ? char c = ’ " . Typy 63 Stałe dosłowne Znaki specjalne Są je d n ak ta k ie z n a k i. to p o m a g a m y so b ie w ted y za pom ocą tzw . N a p rzy k ład : przejście d o now ej s tro n y . to p a trz y m y . że nie m ają o n e fo rm y "d ru k o w a n ej" . k tó ra p rz y p o m in a zn ac zen ie d a n e g o zn ak u .Rozdział. p o w ró t k aretk i (ang. jak d o o b ie k tu o n azw ie z z p rz y p isu je m y je d n ą z p o w y ż sz y c h w artości: c h a r z z = ' \ n 1. Formfeed) \n . ta b u la to r p io n o w y (ang. Proste. P oniew aż d la z a p isu specjalnych z n a k ó w sterujących w y d r u k ie m (czy w y p is y ­ w aniem na ek ran ) p o m ag aliśm y so b ie stosując z n a k i ta k ie .o d w ro tn y u k o śn ik : aha. M im o że m ię d z y ap o stro fam i w id z im y kilka z n ak ó w . sy g n a ł d ź w ięk o w y (ang. Jeśli m u s im y je "n a p isa ć ' w p ro g ra m ie . P o tem n astęp u je np. N ajczęściej d la te g o . H<r-błąd Nie. z n a k n o w ej linii. jak a p o s tro fy . n o w a linia (ang. Backspace) \f .[czytaj: „bekslesz"!- . k tó ry ch nie d a się w p ro st u m ie śc ić m ięd zy apostrofam i. N ew linę) \r . b ę d z ie to coś n ie zw y k łeg o . backslash]12. Alarm) O to. że w naszej instrukcji chcemy. cofacz (ang. Skoro coś n ie z w y k łe g o .cz y li w e w n ą trz je st z n a k . czyli „ u w a g a !" . K o m p ilato r p o d ejrz ew ałb y b łą d . lite ra n.je st to sk ró t o d new linę (n o w a linia). 3. W śro d k u z a ś c z y ta m y \ . O b o k n ie g o staw iam y u m o w n ą literę. W sumie oznacza to.

Jest to znak o k o d zie 0 zw an y znakiem n u li N a liście w id z im y sposób jego z ap isu .podając m ię d z y ap o stro ­ fami liczbow y kod z n a k u . w kodzie ASCII litera a rep rezen to w an a je st p rzez liczbę 97. to taką sta łą w y starczy p o p rz e d z ić literą L L'a' To n ato m iast.bo nie da się ich zapisać) jest jeszcze je d e n b ard zo w yjątkow y. M oże tam znaleźć się w ięcej niż jedna litera. że można je wszystkie opisać za pomocą dwudziestu kilku znaków alfabetu angielskiego.64 Rozdz. Kod znaku m usi być liczbą w z a p isie ósem kow ym lu b szesnastkow ym . jak p o słu żen ie się ta k ą stałą znakow ą w y g lą d a w e fragm encie p ro g ra m u : wchar_t litera.to sam o. że p o d o b n ie radzim y sobie w p rzy p ad k u konieczności zapisu o d w ro tn eg o ukośnika. b y były one typu w c h a r _ t . Stałe zn ak o w e m ożna tak że zapisyw ać b ezp o śred n io . O b iek to w i o n azw ie l i t e r a n a d a w a n a jest w a rto ść o d p o w iad ająca szerokiej stałej zn ak o w ej.to me wyobrażasz sobie chyba. są ty p u c h a r . że m ożna n a nich w y k o n ać o p eracje m a tem a ty czn e . Jeśli chcielibyśm y. Typy Stałe dosłowne P oniżej w idać. O to. 'W ' -o d w ro tn y ukośnik ' \ '' -ap o stro f ' \ "' -cu d zy słó w •\ ? ' -p y tajnik ' \ 0' . co w id z im y m ięd zy dw om a ap o stro fam i znaku szero k ie g o - z a le ż y od im plem entacji. zam iast sam ego z n a k u . T o d lateg o p o n iż sz e zap isy są ró w n o w ażn e: ' a ' .("znak szeroki'). O z n acza to. czyli zn ak o kodzie 0 W śró d zn ak ó w (już niealfanum erycznych . M o że to w y d ać się zask ak u jące. chiński) ma bardzo wiele znaków . Stałe znakowe typu wchar_t S tałe zn ak o w e z a p isy w a n e tak. cu d zy sło w u i w kilku innych p rzypadkach. W d ru g ie j linijce w id zim y p rzy p isan ie. jak to w id zieliśm y w tym p arag rafie. co ó sem ko w o \ 0141 ' a ' . jeśli jakiś alfabet (np. litera = L ' a '. N p . czyli tym sam y m d o ty p ó w ary tm ety c zn y ch . co szesn astk o w o \ x 61 T ak to w y g ląd a w instrukcji: c h a r c * ' \ x 6 1 '.nuli. 3. W końcu.to sam o. ale typy p rz e z n a c z o n e do p rz e c h o w y w a n ia z n a k ó w należą d o g ru p y ty p ó w całkow itych. Z atem m o ż liw e jest takie w y ra ż e n ie •b ' + 5 .

"Pożar \n na pokładzie" Z dziw iłeś się d la czeg o nie m a teraz d w ó c h apostrofów p o o b u stro n ach z n a k u \n ? N ic w ty m d z iw n e g o . W p r z y p a d k u stały ch znakow ych p ro b lem ten m ieliśm y z ap o stro fam i. a na sa m y m końcu tego ciągu d o d a w a n y jest z n a k o k o d zie 0. N ale ż y ro zu m ieć to jako "string.Rozdział. to w ystarczy w ż ą d a n y m miejscu napisać: \ n .nie m a ta k że ap o stro fó w o b o k liter: P o z itd. który by na to „co ś" m ów ił inaczej jak: string. . jak o pisan e p rzy stałych znakow ych: Jeśli ch cem y w tekście (strin g u ) zasto so w ać zn ak nowej linii. (To litera ' g ' ). N ie zn am b o w iem program isty.4 Stałe tek stow e. w ro z u m ie n iu z języka C". co nie zaw sze b yw ało zręczne. Tak k o m p ilato r o zn ac za sobie koniec C -strin g u . 3. Typy 65 Stałe dosłowne Jak się łatw o d o m y śla ć w artością tego w y rażen ia jest litera b ęd ąca w alfabecie o 5 pozycji d alej n iż litera ' b '. N azw a ta dziesiątki razy o d m ien ian a była p rz e z w szystkie p rz y p a d k i. O to stała te k sto w a z pierw szego pro g ram u : "Witamy na pokładzie" W języku a n g ielsk im stała tekstow a n a z y w a się to krótko: strin g . W program ie o g ran iczn ik iem C -stringu są zn a k i c u d zy sło w u P o n ie w a ż cudzy słó w m a takie szczególne z n ac zen ie d la C -stringu. d la te g o nie m o ż n a ju ż g o użyć cu d zy sło w u d o d atk o w o w e w n ą trz C -stringu. w ię c obow iązują p o d o b n e zasad y . S potkaliśm y się ju ż z takim i stałym i. Do p o m o c y m am y je d n a k identyczny ch w y t z o d w ro tn y m u k o śn ik iem : std::cout « "Lecimy promem \"Columbia\" nad Oceanem Spokojnym". O to p rzy k ład y : "taki string" "Pożar na pokładzie" "Alarm 3 stopnia" P oniew aż strin g je st ciągiem znakózu. Z w an e są o n e czasem n ap isam i. 4. czasem łańcucham i znak ó w . albo po prostu stringi W językach p ro g ra m o w a n ia b ard zo często posługujem y się stały m i tekstow ym i będącym i ciąg am i zn ak ó w . czyli zn ak nuli. C -strin g i są w pam ięci p rz e c h o w y w a n e jako ciąg z n a k ó w (liter). A zatem : cudzysłów . napisy. W całej tej k siążce p ie rw o tn ie p o słu g iw ałem się nazw ą „ciąg zn ak ó w ". W reszcie zrez y g n o w ałem . O statn io p recy zu je się to bardziej m ó w ią c C-string.

p o czy m przejść w d o w o ln e miejsce n astę p n e j linii. Spójrz pon iżej: w kilku lin ijk ach zap isaliśm y tu C -strin g . T e cztery czło n y (z a p isa n e w trzech linijkach) k o m p ilato r p o tra k tu je tak. W y n ik a st^ d p ro sta rada: Jeśli p isząc C -string (jego treść) zbliżyłeś się d o p raw ej k raw ęd zi s tro n y e k ra n u w sw o im e d y to rz e . p o staw ić z n o w u cu d z y słó w (o tw ierający ciąg d a lsz y C -strin g u ) i p isać d alej p rz e rw a n y w y raz ' tek st. Jeśli k o m p ila to r zobaczył w linijce cudzysłów o tw ie ra jący C -s trin g . B e zp o śred n io . który " « "podzespół sprawdzić ? .o p ró c z białych z n ak ó w . 3. Co zrobić jeśli string jest tak długi. k tó ry k o m p ila to r p o tra k tu je ja k o jed n ą całość. Z a m ia st pisać: std::cout << "Moj drogi Kapitanie.66 Rozdz. przejść d o n a stę p n e j linii i k o n ty n u o w a ć instrukcję. k tó ry ciąg n ie się p rz e z trzy linijki. ż e w języku C ++ w p raw ie k ażd y m m iejscu instrukcji m oż­ n a p rz e rw a ć p is a n ie . to m u si w tej sa m e j lin ii znaleźć c u d z y s łó w zam ykający. niczego . "Cały ten tek" "st jest traktowa" "ny jako jeden dlu" "gi string" Jak w id ać. że "chowajc się" za prawym brzegiem ekranu. że nie mieści się w jednej linijce? Jest n a to p ro s ty sp o só b . P o szczeg ó ln e "człony są czterem a s a m o d z ie ln y m i C -strin g am i. a nie ch cesz p isać dalej bo nie lubisz jak fragmenty Twojego programu są tak szerokie. jakbyś m y z a p isa li je jako je d e n d łu g i strin g o treści: "Cały ten tekst jest traktowany jako jeden długi string" Z apam iętaj: B ezpośrednio przylegające do siebie C -stringi kom pilator p o łą czy i potraktuje jako jeden. je st tu tek st. to m o ż e sz (n aw et w ś ro d k u w łaśn ie p isa n e g o w y ra z u ) p o staw ić c u d z y s łó w zam ykający C -strin g w tej linii.to z n ac zy . że m ięd zy C -strin g a m i są ty lk o b ia łe zn ak i. M ięd zy p o szcze g ó ln y m i członam i nie m a ż a d n y c h p rz e c in k ó w . Typy Stałe dosłowne co n a e k ra n ie p o ja w i się jako Lecimy promem "Columbia" nad Oceanem Spokojnym M ó w iliśm y k ie d y ś. T o sło w o „ p r a w ie " d o ty c zy m ię d z y in nym i pisan ia C -strin g ó w . Tutaj nie m o ż n a p rz e rw a ć p isan ia. K ończysz go o czy w iście cu d zy sło w em .

więc nie przerażaj się jeśli coś jest niezrozumiałe. A by tego u n ik n ąć. Skoro p ro g ra m ista z n a to m iejsce . (N ie m ów iliśm y o ty m jeszcze. Tu m o ż e m y zad ać p o d o b n e p y ta n ie: Jeśli w p ro g ra m ie jest p o n iż szy C -strin g . to m u s i g d zieś sobie w p am ięci z a re z e rw o w a ć d ziałk ę. a le p o w in n iśm y so b ie zdefiniow ać obiekt (zm ienną) ty p u C -strin g . taki C -string je st ty p u c o n s t c h a r [5 ] . g d zie ta jego d ziałk a jest. K rótko m ó w ią c m u s im y sobie o d p o w ie d n ią d z ia łk ę b u d o w lan ą kupić. Dla wtajemniczonych: Jakiego typu jest mój C-string? Aby dobrze zrozumieć poniższych kilka linijek. Przecież obok stoją inne wille. 3.nagle zdecydować tę willę przebudować na duży lotniczy hangar. wiedzieć.i program najczęściej się zawiesi. w s ta n d a rd z ie d o d a n o p rz y d o m e k c o n s t d o ty p u stałej dosłow n ej ty p u C -strin g .mając gdzieś.zniszczy sąsiednie obszary pamięci . na której u m ieści te pięć z n a k ó w . w d r u g im sposobie nie p o trz e b n e jest p o w tó rzen ie o p e ra to ra « . ale to n a p r a w d ę proste).* • J .m ógłby chcieć te zn ak i p o zm ien iać. To jest ju ż nieszczęście.V ] tł* "AbCd" to jakiego jest on ty p u ? O tó ż w m yśl s ta n d a r d u . N ie jest to jeszcze tak trag iczn e. Skąd ta p ią tk a ? O czyw iście m a m y tu cztery z n ak i. to u zn aje. 1 . 4 To tak. jakby . C S5 Z apam iętaj Jeśli p ro g ram o w ałeś w e w cześniejszych w ersjach C ++. Fi V ’. T ym czasem w p ro g ra m ie łatw o się d o w ie d z ie ć . W s u m ie w ięc jest ich pięć. Nie mówiliśmy jeszcze o tym. p o których m u si n a stą p ić kończący te z n a k i zn ak nuli. Jeśli zaś c h ce m y m ieć C -strin g . że g d y k o m p ila to r analizuje n a s z p ro g ram .. . k tó ry b ę d z ie m y ro zb u d o w y w a li .to n ie m oże być stała dosłowna ty p u C -strin g . P o co jednak ten p rz y d o m e k c o n s t ? C h o d z i o to. małą willę na działce budowlanej . C zęsto jed n ak p rz y c h o d z i m u och o ta d o te g o C -stringu coś d o p isać. który "pcdzespol sprawdzić ? Ja k w id ać. co to jest tablica. N ie d a w n o d o w ie d z ie liśm y się. Budowa hangaru spowoduje ich zburzenie. Typy 67 Stałe dosłowne m o ż n a zapisać: std::cout << "Mej drogi Kapitanie. D zięki tem u p rz y d o m k o w i w sz e lk ie ro b o ty zie m n e na tej działce są za b ro n io n e . Gdy nieświadomy tego programista podejmie rozbudowę . to je st to d la C iebie now ość! D aw niej teg o c o n s t w tym m iejscu n ie było.Rozdział. przydałoby się.. w dzielnicy willowej. iż jest o n a ty p u i n t . że jeśli k o m p ilato r u jrzy w n aszy m p ro g ram ie s ta łą d o sło w n ą 0.

Podobnie typem złożonym jest "sokow irów ka do jabłek".. / / obiekttypu i n t i n t b [ 10 ] . których nazw a złożona jest z n azw y innego typu (prostszego). Po co nam tak ie typy? M ożem y m ieć kilka „luźnych" o b iek tó w typu int. by dany C-string był złożony w łaśnie z takich zn ak ó w . czyli łań cu ch y znaków ty p u char.taki typ o b iek tu istnieje n aw et w języku BASIC czy FORTRAN. czy w skaźnik d o ob iek tó w (jakiegoś ty p u ). A by po inform ow ać kom pilator. 3. Jest to p ro stsze niż się w ydaje. W języku C++ ty p y złożone to na p rz y k ła d tablica (obiektów jakiegoś typu).5 T y p y z ło ż o n e M ów iąc o brazow o: są to typy. k tóre zobaczym y za chwilę. czego? T yp złożony tw orzym y z nazw y ty p u p ro stszeg o (który w ykorzys­ tują) i operatora deklaracji typu złożonego. Występuje w jego nazwie słowo "jajko". o ra z z jednego z czterech operatorów . N ie m usisz się jed n ak tą całą sy stem aty k ą przejm ow ać. nie m a problem u: tablicom pośw ięcim y specjalny rozdział. Teraz w y m ien ię jeszcze inne o p e ra to ry d o tw o rzen ia obiektów typów złożonych. nc w łaśnie. L"tekst międzynarodowy" Ta stała d o sło w n a jest typu const wchar_t [21]. że chcem y..natomiast pojemnik na 6 sztuk" to jakby operator typu złożonego. w y korzystu­ jącym prostszy typ fu n d am e n taln y int. W iem y jednak. W szystkie staną się jasn e w najbliższych rozdziałach. Typy Typy złożone C-stringi ze znaków szerokich Z obaczyliśm y tu C-stringi. 3. tak jak m echanik nie m usi m yśleć czy jego tokarka jest ty p em złożonym p o ch o d zący m od. tłum aczyć chyba nie trzeba . należy poprzedzić ten C-string wielką literą L. że m ogą być też tak zw an e znaki szerokie. to "pojemnik na 6 ja jek" byłby typem złożonym. / / tablica 10 obiektów typu i n t (10-elementowa) Co to jest tablica. Jeśli je d n ak nie w iesz.68 Rozdz. Tablica obiektów typu int jest typem zło żo n y m . W spom inałem ju ż o tym wcześniej: jeśli ja jk o byłoby typem prostym. Przecież lu ź n e g o d zin y odjazdów pociągów w y g o d n iej pow iązać w tablicę zw aną ro zk ład em jazdy. czyli obiekty typu wchar_t. in t a. . ale często korzystniej jest je pow iązać w tablicę obiektów ty p u int. Jed n ak nie przerażaj się.

abyś osw oił się z d e kla ra cja m i typów złożonych. obiektu typu i n t s h o rt i n t b. Da Ci to ogrom ną sw obodę w poruszaniu się po królestw ie C ++. ♦$» R eferenqa . D zięk i referencji na tę sam ą z m ie n n ą m o ż n a m ów ić u ż y w a ją c jej d ru g iej n a z w y . tu dobrą ilustracją jest tablica godzin . które umożliwiają tworzenie obiektów typów złożonych: [] . w najbliższych ro z d z ia ła c h szczeg ó ło w o o tych c iek aw y ch s p ra w a c h p o ro zm a w iam y . Na przykład funkcja "kopanie ziem niaków". obiektu typu f l o a t O to p rz y k ła d y ty p ó w zło żo n y ch .to o b iek t. w sk a ź n ik d o p o k azy w an ia na o b ie k ty d an e g o ty p u . tablica o b ie k tó w d an eg o ty p u . // tablica 10 elementów typu i n t f l o a t *p. W sk aźn ik . // dcf. // wskaźnik mogący pokazać na jakiś // obiekt typu f l o a t c h a r f u n c () . N ie p rz e jm u j się. funkcji). że sta ją b e zrad n i. O . Typem prostym jest "ziemniak".to in aczej m acierz. // def. w y k o rz y stu ją c y c h te p ro s te typy: i n t t [1 0 ] . 11 ■ D o ćw iczeń w o d c z y ty w a n iu deklaracji je szc ze w ie lo k ro tn ie p o w ró c im y . w k tó ry m m o ż n a um ieścić a d re s jakiegoś innego obiektu w p am ięci.cz y li p o d p ro g ra m .zwana rozkładem jazdy. .to ja k b y p rzezw isk o ja k ieg o ś o b ie k tu . N ie m ó w iliśm y jeszcze o tych typach. a "kopanie" to nazwa pewnego działania (akcji. 3. // dcf. Typy 69 Typy złożone Oto lista operatorów. b ę d z ie o nich m o w a w o d p o w ied n im czasie* T u ta j w y jaśn im y w ięc k ró tk o . drogi czytelniku. // funkcja zwracająca (jako rezultat // wy Konania) obiekt typu c h a r Boję się.Rozdział. obiektu typu s h o r t f l o a t x. alb o w e k to r o b iek tó w d a n e g o ty pu. to dlatego. referen cja (przezw isko) o b iek tu d a n e g o ty p u . którzy nie lubią C i C ++. gdy zobaczą takie deklaracje. & . Funkcja . że: Tablica . B ardzo zachęcam C ię . a w p rzyszłości nauczył się je odczytyw ać. A o to p rzy k ła d y ty p ó w fu n d am e n taln y ch : i n t a. że pojęcia te n a razie m o g ą n ie być z b y t jasne. Jest to za p e w n e z n a n e C i z innych ję zy k ó w p ro g ra m o w a n ia . k tó ry w y k o n a p e w n e z a d a n ie . Jeśli są ludzie. * . funkcja zw racająca w arto ść d a n e g o typu.

a czas ż y c ia obiektu W iem y już.> •. Z am iast nazw y tego tajem niczego ty p u umieszczam y słow o v o id . do czego taki w skaźnik m ożt się przydać. .do m o m en tu .. . w której nazw a obiektu jest z n a n a . Typy Typ v o i d 3. w instrukcji: void *p. Czas życia obiektu ♦♦♦ to o k res od m om entu. że funkcja nie b ęd zie zw racać żad n e w artości. czego ty p u nie chcemy bliżej określić (nazw ać).. g d y zostaje on zd efin io w an y . ' Zakres ważności nazwy obiektu ♦♦♦ to ta część program u. ir v ■ • . '• . [Ang.6 T y p void W deklaracjach ty p ó w złożonych m oże się pojawić słow o v o id . g d y przestaje or istnieć. jak zdefiniow ać lub zad ek laro w ać obiekt jakiegoś typu. 3. (O tym. Zajmijmy się te ra z zakresem w ażności n azw y tak zd efin io w an eg o obiektu czasem jego życia.7 Z a k re s w a ż n o ś c i n azw y o b ie k tu . . gdzie norm alnie staw ia się nazw ę typu. . (definicje p rzy d ziela m u miejsce w pam ięci) . Tak n a p ra w d ę . • deklaracja ta m ów i. 3. który m o że pokazyw ać na coś. Tutaj. -. . . • tutaj oznacza to. (a jego miejsce w pam ięci zostaje zw olnione). P rzykłado­ w o dla obiektu typu i n t robi się to instrukcją: i n t m. S łow o to stoi w miejscu. pow iem y sobie w rozdziale o w skaźnikach). N ie m oże być jednał* obiektu ty p u v o i d . dek laru jem y w sk aźn ik . void próżny]. ty p v o i d jest ty p em fundam entalnym . że p jest w skaźnikiem d o pokazyw ania na obiekt nieznanego typu. czyli obiekt jes d o stę p n y (jeśli zw racam y się do niego używ ając jego nazw y).v. • . I tak: void *p. .70 Rozdz. £. void funkcja(). Słow o v o id m o że w ystąpić tylko jako ty p prosty w deklara cji typu zło żonego.

m ię d z y nim i są instrukcje składające się na tę funkcję.r. prtwess&r ** % ' . # in c lu d e < io s tre a in > i n t m ain () 1 // tu r o b im y ja kieś o b liczen ia { II < .7. . Po p ro stu poza tym blokiem n azw y te n ie są z n an e . -. k tó re tę ety k ietę poprzedzają. gdy św iad o m ie ograniczam y g o d o kilku linijek p ro g ram u . Te d w a naw iasy w y zn aczają blok funkcji . naw et w tych linijkach funkcji. ale nie b y ć dostępny. Z faktu. 3. blok. W jednym z następ­ nych rozdziałów dowiemy się. r -u i ■.j $. mówiliśmy tylko ofunkcji o nazwie ma in . jak zdefiniujem y lu b d ek laru jem y nazw ę. Z defin io w an e w ta k im bloku nazw y m ają zak res w ażności o g ran iczo n y tylko d o tego bloku.do linijki. Pisząc p ro g ra m m ożem y w d o w o ln y m m om encie z a pom ocą dw óch klam er >5Ł-. że jest ona zn an a w całej funkcji. Z ależn ie od tego. że w programie oprócz funkcji m a in — zwykle jest jeszcze wiele innych funkcji.7. zn ajd u jem y się chw ilow o p o za zakresem w ażn o ści jego nazwy. . g d y ją zd efin io w aliśm y .2 Zakres: blok funkcji Jak na razie. otwieramy lokalny blok i n t x. w y n ik a p ro sty w niosek: . To dlateg o . że np. z a k re s jej ważności m o że być ró żn eg o ro d zaju . U definiujemy jakieś zmienne // pracujemy na tych zmiennych 1 I I +. a kończy n aw ias klam ro w y }. W iem y już. ż e etykieta ma zak res w ażności funkcji. Z n a c z y to. g d z ie jest klam ra ) k o ń cząca jej lokalny blok. m a in ) o tw iera n a w ia s k lam ro w y {. Typy 71 Zakres ważności nazw y obiektu.) a! ■» ?>v.Rozdział. że funkcję (np. (Po klam rze kończącej blok nie trzeb a sta w ia ć średnika). U w aga.zamykamy lokalny blok //p o z a b lo kiem lokalne o b ie k ty sq j u ż n ie zn a n e 1 *** N azw a zm iennej x je st zn an a od m o m en tu . że w jakim ś m om encie obiekt m o że istnieć. u tw o rzy ć tzw. Z akres w ażności o g ran iczo n y do bloku funkcji m a etykieta.1 Zakres: lok alny Z ak res w ażności jest lokalny.'*6 1. a czas życia obiektu Jaka jest różnica między tymi pojęciami? T aka.

7.72 Rozdz.czyi: znanych w cały m p lik u tekstow ym . Jej zakres w ażności ogranicza się ty lk o do tego pliku. O to p rzy k ład : float fff.4 Zakres: obszar klasy To na razie tajem nica. Z zew nątrz te funkcji nie m o żn a w ięc do nich skoczyć. 3. (oraz poza tzw . Jest to b a rd z o pożyteczne n arzęd zie. to mówimy wówczas. w którym ją zd ek laro w aliśm y .7. / / nazwa fff jest globalna main() { I I .3 Zakres: obszar pliku N a razie n asze krótkie program y m ieściły się zw ykle w jed n y m pliku teksto w ym . Jeśli w d a n y m pliku. I to w d o d a tk u jedynie od m iejsca deklaracji. chcem y skorzystać i jakiejś biblioteki. Jeśli w jednym z nich. dc końca pliku. że taka nazwa jest globalna. przestrzenią nazw) zadeklarujemy jakąś nazwę. 3. 3. na zewnątrz jakiegokolwiek bloku (także bloku funkcji). 3. N a z w y elem entów tej biblioteki stały sic bow iem z n a n e w d a n y m pliku. Po tych deklaracjach (czyli w yjaśnienie k o m p ilato ro w i co zn aczy dana n azw a) m o żem y już k o rzy stać ze skarbnicy którą n iew ątp liw ie jest biblioteka.7. Typy Zakres ważności nazwy obiektu. P am iętasz. ż e p rz e d chw ilą ro zm aw ialiśm y o n azw ach globalnych .5 Zakres określony przez przestrzeń nazw P rzestrzenie n azw w p ro w ad z o n e zo stały do języka C++ sto su n k o w o n ied aw ­ no. Dzięki nim . O tym szczegółow o p o ro zm aw iam y w rozd ziale poświęć conym klasom . Ma ona zakres ważności pliku. Jakby zg ru p o w ać je w ro d z in y . o b iek tó w czy funkcji).. w którym p iszem y w łaśn ie p ro g ram . które dla w y g o d y rozm ieścim y w kilku plikach. W p rzy szło ści będziem y pisać d łuższe. .. Jednakże ta k a n azw a nie jest od ra z u autom atycznie z n a n a w innych plikach naszego p ro g ra m u . to m usim y n ajpierw zam ieścić deklaracje n a z w elem entów te biblioteki (n p . a czas życia obiektu Nie można instrukcją goto przeskoczyć z wnętrza jednej funkcji do wnętrza W szystkie ety k iety danej funkcji są ju ż poza tą funkcją n iezn an e. m o żn a w prow adzić p ew ien p o rz ą d e k w śró d nazw.

a mój k o leg a sw ó j życiorys w innym . b o przecież najczęściej nie m a m y d o stę p u d o tekstu ź ró d ło w e g o tych b ib lio tek . mój życiorys w jed n y m p o d k a ta lo g u . G d y b y Twój kolega ju tro chciał n ap isać in n y d o k u m e n t i p rz e z p rz y p a d e k d a ł m u ta k ą sam ą n azw ę. N ie m a zn aczen ia. dlaczego właściwie mamy te kłopoty P ro b lem polega na ty m . czw artej itd.u ż y w a li d łu g ich i sk o m p lik o w a n y ch n a z w . to n ie m oże g o b e z k a rn ie zap isa ć na d y s k u w g łó w n y m k atalo g u . Typy 73 Zakres ważności nazw y obiektu.w łaśn ie d la te g o na d y s k u m am y nie ty lk o jeden katalo g g łó w n y . że jeśli już d e k la ro w a liśm y ja k ąś n a z w ę np. bo w ted y sz a n s a p o w tó rzen ia się tak iej sam ej n a z w y w innej bibliotece m aleje. ro z w ią z a n ie n ie jest d o b re Z a n im w y m y ślim y jak to zrobić lepiej. K o n flik t nazw . 3. Jeśli k to ś będzie chciał w y ciąg n ąć jakieś d a n e n a m ój te m at. P oniew aż n a sz p ro g ra m u ż y w a tej n azw y w w ielu m iejscach. T ak w łaśn ie w y g lą d a ła rzeczyw istość w czasach . M o ż e m y też p o trze b o w a ć trzeciej. W y o b ra ź sobie te ra z. Co w ted y robili a u to rz y bibliotek. Jeśli zaś . w ięc trzeb a przejrzeć cały p ro g ra m .ale w ko ń cu je st to w ykonalne. g d y chcielibyśm y p o słu ży ć się in n ą b ib lio tek ą. to staw ała się o n a z n a n a i już. to ta d r u g a nazw a ró w n ież m iała po p ro s tu w ejść d o o b szaru n a z w "znanych i już". ale w y m y ślo n o też p o d k atalo g i. a potem za p isu je sz go na d y sk u w g łó w n y m k atalo g u (p o d n a z w ą na p rz y k ła d życiorys).dostarczonej nam p rz e z z u p e łn ie in n e g o a u to ra . P rzecież konflikt m o ż e się pojaw ić m ię d z y n azw am i z d w ó ch ró żn y ch bibliotek.. b y un ik ać k o n flik tu n azw ? A n o . s k o ro b ę d ą w ró żn y ch podkatalogach. T rz e b a w ięc w te d y u m ieścić w n aszy m p lik u ró w n ież deklaracje nazw z tej d ru g ie j biblioteki. n a p rz y k ła d p rz e z inną firm ę pro g ram isty czn ą.Rozdział. N ie z a w sz e je d n a k ta k ie p ro ste ro zw iąz an ie jest to m ożliw e. g d y n ie by ło n arzęd zia z w a n e g o p rz e strz e n ią nazw '.. N ie m a rad y . ale nie zn ik a. Z m ien iam y w ięc w sz y stk ie w y stąp ie­ n ia tej naszej n a z w y i n ie m a więcej ko n flik tu nazw . T ego ju ż nie da się tak łatw o n ap raw ić . p o w in ie n się o d n ieść do pliku o n a z w ie życiorys b ęd ąc y m w "m oim " k a ta lo g u . k tó rą m y sam i w y m y śliliśm y w n aszy m program ie. W d o d a tk u p ro g ra m ista k o rzy stający z d anej b ib lio tek i m u si w sw o im p ro g ram ie z a w sz e u ż y w a ć w łaśn ie tych d łu g ich i sk o m p lik o w a n y ch n azw . S zan sa maleje. Potem . m u sim y w te d y zm ienić tę n a sz ą n azw ę n a nieco inną.. W id zisz już ro zw iązan ie? A leż oczyw iście . P o w sta je p ro b lem : k o n f lik t nazw . bo tam taki d o k u m e n t ju ż jest. W ch o d ziła jak b y d o o b sz a ru n a z w "znanych". P rzy p o m in a m i to jakby tak i problem : T w o rz y sz e d y to re m jak iś d o k u m e n t te k sto w y . biblioteczną. ż e d o k u m e n ty m ają ta k ie sam e n a z w y . Ja z a p isz ę m ój d o k u m e n t. a czas życia obiektu M o ż e m y je d n a k p o trz e b o w a ć u ży ć także d ru g ie j biblioteki . Słow em .. ż e p rz e z p rz y p a d e k w jakiejś bibliotece je st u ży ta nazw a id e n ty c z n a jak n a z w a . Zastanówmy się. a b y ła w niej n a z w a id en ty czn a.

74 Rozdz. Równie d o b rz e m o g ły b y ta m być d e k la ra q e . N a p isa łe m "p o d k atalo g " . Może się zdarzyć.od lat. To jest moment zapisania życiorysu do odpowiedniego katalogu na dysku.ab y p o z n a ć jego życiorys - trzeb a p o d a ć n a z w ę jego p o d k a ta lo g u i nazw ę jego d o k u m e n tu życiorysow ego. Z o b ac zy m y tu . To w sz y stk o jest z n a n e se k re ta rk o m u ży w ający m k o m p u te ry . (Z w y k le m a o n a coś w sp ó ln e g o z n azw ą jegc biblioteki). k tó ry za c z y n a się o d sło w a k lu c z o w e g o n a m e s p a c e . pc k tó ry m n a stę p u je w y b ra n a p rz e z n a s n azw a p rz e strz e n i. ż e to d a n a nazwa m a być w p ew ien s p o s ó b "chroniona" p rzed n ie p o ro z u m ie n ia m i. Jak tę ideę przenieść do programowania w C++ ? O tóż a u to r b ib lio tek i stara się. d o k tó rej a u to r biblioteki dan e n a z w ę "zapakow ał". U jm u jem y je w b lo k . b y n az w y kilku o b ie k tó w g lo b a ln y c h zn alazły się w p rz e s trz e n i n azw o n a z w ie s y m f o n ia . Jeśli te ra z m y ch cem y się p o słu ży ć tą biblioteką o w eg o p ro g ra m isty . T ak i "podkatalog" nazyw a się p rz e s trz e n ią n azw ."w g łó w n y m k a talo g u ". to: • p o p ierw sze. że to my sami chcemy umieścić jakieś nazwy w jakiejś "naszej" przestrzeni nazw To b a rd z o ła tw e. g d zie um ieść sw oje n a z w y . a b y jego n azw y nie b y ły . Typy Zakres ważności nazwy obiektu. k tó re n azw y z jego b ib lio te k i m ają być w te p rzestrzen i. • p o d ru g ie . ż e w e w n ą trz bloku u m ie sz c z o n e są d e fin icje o b ie k tó w . ty lk o jakby w jego te a trz e w y o b raźn i. namespace symfonia { int x. to .n a z w y jej s k ła d n ik ó w p o p rz e d z a m ) specyfikacją p rz e s trz e n i n azw . N a stę p n ie a u to r biblioteki ok reśla. a czas życia obiektu ch o d zić b ęd zie o d a n e na te m at m o jeg o kolegi. b o nie jest to p o d k a ta ­ log na d y s k u .jak dotychczas . P o p ro s tu z a m ia s t d efin io w ać te o b ie k ty g lo b aln e tak: int x. g d z ie m a m j k o rzy stać z tej b ib lio tek i . tej p rz e s trz e n i nazw . ale w y m y śla sobie (tw orzy) "p o d k atalo g ".w cud zy sło w ie. w n aszej części p ro g ra m u n ajp ierw oczyw iście m u sim y zam ieścić d eklaracje n a z w p o trze b n y ch n arr sk ła d n ik ó w tej b ib lio tek i. P o d k a ta lo g o w i tem u . C h o d zi p rz e c ie ż o p o w ied zen ie k o m p ila to ro w i. . W id z im y tu . double ddd. 3. double ddd. au to i biblioteki d a je ja k ą ś tam n azw ę. jak s p ra w ić . w ty c h n aszy ch in stru k c jach . O to ilustracja.

a czas życia obiektu Jeśli w staw iliśm y n a z w ę x d o p rzestrzen i n a z w symfonia. chcem y p o s łu ż y ć się tą n a z w ą cout. 3. k tó ry n azw ali s t d . double współczynnik. s t d : :cout To w ła śn ie w id zisz w ty m n aszy m p ro g ra m ie . Dla w tajem n iczo n y ch : W bloku n a m e s p a c e może być też deklaracja lub definicja funkcji. a nawet definicja klasy. że d o p rz e s trz e n i nazw s y m f o n i a d o d a w a n e są d w ie n astęp n e n a z w y . W bloku n a m e s p a c e może być nawet dyrektyzoa ttinclude wstawiająca cały plik nagłówkowy z wieloma deklaracjami. C zy li n a w e t z a ch w ile m oże się p o w tó rzy ć: namespace symfonia { . Typy 75 Zakres ważności nazw y obiektu. to od tej pory do n a z w y x m u sim y się o d n o sić jako s y m fonia: :x. // * . że k o m p ila to ro w i p rz e d s ta w ia n e są d e k la ra c je n a z w z biblioteki iostream. . . Aby u n ik n ą ć w sz e lk ic h m o ż liw y c h k o n flik tó w n a z w . Jeśli te ra z . k tó ry jest o p e ra to re m zakresu . Z acy tu ję tu taj n asz p ie rw szy p ro g ram #include <iostream> // są d e k la ra c je n a z w z b ib lio te k i iostream int main() { std::cout « "Witamy na pokładzie". (a do n azw y ddd jako s y m f o n i a : :ddd).Rozdział. 1® “ C iek aw o stk a: T aki blok w staw iający n az w y d o p rzestrz en i n azw s y m f o n ia m o ż e sz w p ro g ram ie u ż y ć jeszcze kilk ak ro tn ie.t u u ż y w a m y n a z w y c o u t } Linijka #include p o w o d u je . 1 S p ra w ia to. to jej w y stą p ie n ie p o p rz e d z a m y n azw ą o d p o w ie d n ie j p rz e s trz e n i n a z w i d w u k r o p ­ kiem . a je d n ą z nich jest n azw a cout. A u to rzy tej b ib lio te k i w y m y ślili w ie le n a z w . char znak_zorro. . au to rz y tej b ib lio tek i zap ak o w ali te s w o je n a z w y d o p rz e s trz e n i n a z w (jakby d o pod k atalo g u "). Inaczej m ów iąc: | D aną p rz e s trz e ń nazw m ożem y "zalu d n iać" sto p n io w o . w n aszy m p ro g ra m ie . Znamy już pewne nazwy pochodzące z przestrzeni nazw O d n a s z e g o p ierw szeg o p ro g ra m u p o słu g u je m y się ju ż bib lio tek ą w e jś c ia /w y j­ ścia. .

(W tak n azw anej p rz e strz e n i nazv\ um ieszczone zo stało w iele nazw z bibliotek stan d ard o w y ch ). jak b y n ie były sch o w an e wcale. 14) ang. O czyw iście chodziło nam o to. Typy Zakres ważności nazwy obiektu. B ądźm y jednak realistam i. że n a z w y schow ane w p rzestrzeń n a z w s t d . W dodatku potem przyszła też nazw a c i n . a którą so b ie tera2 w yjaśnim y. N azy w am y ją dyrektyw ą u s in g . <♦ Teraz następuje nazw a tej przestrzeni. / / <-tu używamy nazwy cout © } Krótki komentarz do tego programu O T utaj jest instrukcja. D laczego "nie"? Z au w aż . Jest instrukcja. name space . "Tak" _ bo w ten sposób świetnie rozw iązały się konflikty nazw . Ją też m usieliśm y po p rzed zać specyfikacją std:: .o zn acza ono: przestrzeń nazw. od tej pory stają się d o stęp n e tak. 13) ang. // “ i n t m a in () ' cout « "Witamy na p o k ła d z ie " .[czytaj: "nejm spejs' 1 . O g ó ln ie w ięc cała ta d y rek ty w a pow oduje. by nie było konfliktu z innym i bibliotekam i. k tó ra rozw iązuje n am p ro b lem . w których m ogłaby istnieć nazw a cout użyta w zu p ełn ie innym zn aczen iu . W idzim y skrót std. 3. Zobaczymy teraz nasz "pierwszy" program w innej. ♦> N astęp n e słow o to n a m e sp a c e H . k tóra m oże zdjąć tę klątw ę z jednej lub wielu nazw.[czytaj: "juzing"). Po co więc teraz cała społeczność p ro g ram istó w ma w iecznie pisać to std: : cout zam iast (jak daw niej) po prostu cout ? I na to w ym yślono rozw iązanie. z której m a ona być | biblioteki. co jes zap e w n e skrótem od słow a standard. nowej formie f i n c l u d e < io stream > // są deklaracje nazw z biblioteki i o s t ream u s in g naraespace s t d . Ż aden autor biblioteki nie odw ażyłby się jej użyć w zu p e łn ie innym znaczeniu. Przecież nazw a cout jest chyba najsłynniejszą n a z w ą w całym języku C++. «$♦ A ngielskie słow o u s i n g ^ oznacza używanie. że w następnych naszych program ach używ aliśm y n a z w y cout b a rd z o często i za k ażd y m razem w ystępow ało ow o s t d : T ro ch ę jednak zaciem nia to tekst p ro g ram u . a czas życia obiektu Czy to wygodne? I tak i nie. Obecnie uży w ając danej nazw y m ożem y jasno pow iedzieć. using .76 Rozdz.

tak. int 1 i n 3 C. ż e to n ie ty lk o n azw y c o u t . O to p rz y k ła d o w y p ro g ra m : #include <iostream> using std::cout. d z ię k i k tó rej m o ż e m y osiągnąć ten s a m s k u te k je d y n ie w s to s u n k u d o w y b ra n e j n a z w y .. Istn ieje in n a form a in stru k c ji u s i n g . // using std::cin. ż e to raczej d e k la ra c ja (nazw y). In stru k c ję tę n a z y w a m y deklaracją using. ż e s k o r o au to rz y b iblioteki u m ieścili n azw y w p rz e s trz e n i n a z w . jak to p o w y ż e j p o k a z a łe m .Rozdział. bo n a sz a d y re k ty w a u s i n g s p ra w iła .n isz c z y ich w y siłe k (i m ądrość). N ie dyrektywą u s i n g . n ie z n a n a . // < . . U ży cie d y re k ty w y u s i n g .. Są je d n a k lu d zie. k tó rzy u w a ż a ją tak ie p o s tę p o w a n ie za niew łaściw e. co ro b ią. c i n stały się d o stę p n e b ez k o n ieczn o ści u ży c ia k w a lifi­ k a to ra zak re su s t d : :. © Tu w id z is z . c m .t u u ż y w a m y n a z w y c o u t © i nt. czy nie ma go w podkatalogu o nazwie s te l. 7 0 r 0 U • cin » liczba pasażerów. a le sta ło się to tak że z w s z y stk im i in n y m i n a z w a m i z p rz e s trz e n i n azw s t d .liczba_pasazerow. by ich n a z w n ie m u sieć p o p rz e d z a ć sp ecy fik a to rem s t d : :.od tej pory w program ach przykładow ych w tej książce praw ie za w sze sto s o w a ł będę już tej d yre ktyw y u s i n g pozw a lają ce j na proste od no sze n ie * się d o nazw c o u : . Jest w tej arg u m en tacji p e w n a logika.amy pasażerów?:". w ięc. Sam zo b acz. ale deklaracją u s i n g . którą w y ra ź n ie w y m ien im y .. T w ie rd z ą . // int raain() ł cout « "Ilu ir. Typy 77 Zakres ważności nazw y obiektu. 3. że n a sk u te k n aszej d y re k ty w y u s i n g m o ż liw e jest teraz u ż y w a n ie n a z w y c o u t bez k o n ieczn o ści p isan ia s t d : : c o u t . T akiej n a z w y . że jeśli nie znajdzie jakiegoś pliku w głównym katalogu.ta k a. S p o só b te n w y d aje się n a p r a w d ę d o b ry . to w ie d z ie li. Z atem jeśli ja k a ś n azw a jest ci. to - s p ra w d ź ta k ż e czy jej n azw a nie je st sch o w a na w p rz e s trz e n i n a z w s td " . k o m p ilato rze. / / *— t u u ż y w a m y n a z w y c in O . to niech sprawdzi. a czas życia obiektu Wracając do naszej analogii z żi/cia sekretarek—to jakby powiedzenie jej. D y re k ty w ą O p ro g ra m ista m ó w i w ięc k o m p ila to ro w i m niej w ięcej coś takiego: "Od tej p o ry ch ciałb y m u ż y w a ć n a z w z p rz e strz e n i n a z w s t d tak.. Jest n a to jed n ak rada.

z której to przestrzeni n a z w ona pochodzi. w ięc piszący inne b ib lio tek i znają je i u n ik ają konfliktu z nim i. Typy Zasłanianie nazw Krótki komentarz O Ta instrukcja (deklaracją using ) um ożliw ia.nie m usim y ju ż podaw ać kw alifikatora zakresu.łącznie ze specyfikacja określającą. W końcu są one z biblioteki standardow ej. to efekt d z iałan ia tej d y rek ty w y og ran icza się tylko d o tego jed n eg o pliku. z m ien n ą globalną.g d y zm ęczę się tym ż m u d n y m pisaniem .78 Rozdz. obcych bibliotek staram się raczej n ie używ ać d y re k ty w y u s i n g . O ty m . Jeśli w ty m lo k aln y m zakresie o d w o ła m ) się d o danej nazw y. Ty z a ś . w danym lo k aln y m zakresie. k —" << k << " \ n " . C zasem jednak ..------------------------------------- . że od tej pory p rz e d nazw ią c i n nie m u sim y już staw iać k w alifik ato ra zak resu przekonuje nas instrukcja oznaczona jako O . to n ie boję się ich. N ie m a w ięc dram atu. . Którego z tych sposobów używać? Ja m am taką zasadę: jeśli ch o d zi o nazw y z p rzestrz en i nazw s t d. to ko m p ilato r u zn a to za o d n iesien ie się d o zm ien n e lokalnej. To są moje zasady. ..8 Z a s ła n ia n ie n azw W p ro g ram ie m ożem y zad ek laro w ać nazw ę lo k aln ą. N ow o zd efin io w an a zm ien n a zasłan ia w ted y .... // U zm ien n a g lo b a ln a (obiekt ty p u in t) I z*************************************************************j int main() c o u t << " J e s te m w m a in .albo w ypracujesz so b ie swoje. 3. ' / / zmienna lokalna c o u t « " po l o k a l n e j d e f i n i c j i k =" « k « e n d l. int k = 33.i jeśli w jed n y m z nich u łatw ię sobie życie d y rek ty w ą using.. Przecież m ój p ro g ram składa się z w ielu plików . 3.aby o d n ie ść się do n a z w y cout (ukrytej w przestrzeni nazw std) . . W olę w program ie p isać całą nazw ę .p o d d a ję się u ż y w a m tej dy rek ty w y using. N ato m ia st w stosunku d o innych. O tym . przekonuje nas instrukcja oznaczona jako © . S pójrzm y na p ro sty przykład: #include <iostream> using namespace std. że o d tej pory . ^ i n t k = 10. © T a deklaracja using u m ożliw ia to sam o w sto su n k u do nazw y cin (um ieszczo ­ nej w p rzestrzeni nazw std). identyczną z istniejąca n a z w ą globalną. } / / <---------------------------. albo n a rz u c i Ci j< k iero w n ik dan eg o projektu program istycznego. że to możliwe...

W Mimo wszystko istnieje jednak możliwość odniesienia się do zasłoniętej nazwy globalnej. Jeszcze nie n astąp iła definicja lokalna. O to p rzy k ład : #include <iostream> using namespace std. O biekt lo k aln y k p rzestaje istnieć. © L okaln a n azw a k zasło n iła n azw ę k globalną. ' // © .Rozdział.is tn ie ją c a g d z ie ś w p ro g ra m ie . sk o ń czy ł się tak że zak res w ażn o ści jego n azw y . k = M << k << "\n”. k=33 po lokalnej definicji k =10 Poza blokiem k =33 Komentarz O D efin ic ja z m ie n n e j g lo b a ln e j k . © O d w o ła n ie się do n azw y k jest teraz ro z u m ia n e p rzez k o m p ilato r jako o d w o ła­ n ie się d o glo b aln eg o obiektu k. a jego nazw a p rzesta je być w ażn a. { int k = 10. P o słu ży nam d o tego tzw . © Z am k n ięcie lo k alnego bloku. int k = 33. że ch o d zi n am o obiekt k glo b aln y . Typy 79 Zasłanianie nazw cout << "Poza blokiem k =" << k << endl. o p erato r zak resu : : (d w a d w u k ro p k i). // O z m ie n n a g lo b a ln a (o b ie k t t y p u v t t ) Z *****************************^***#**************************/ int main{) ( cout << "Jestem w main. 3. w ięc ko m p i­ la to r uznaje. © O tw ie ra m y lo k aln y blok. © D efiniujem y obiekt lo k a ln y o nazw ie k. // © } Wykonanie tego fragmentu programu spowoduje pojawienie się na ekranie: Jestem w main. // z m ie n n a lo k a ln a 0 cout « "po lokalnej definicji k =" « k // © << "\nale obiekt globalny k =" « : :k . 0 O d w o ła n ie się d o o b iek tuk. Skończyło się życie o b ie k tu . p o z a jak ąk o lw iek funkcją (tak że poza funkcją m a in ). N a ek ran ie zostaje w ięc w y p isan a w a rto ść zm iennej lokalnej.

że teraz jest to definicja obiektu stałego. P rzy k ład em m oże być choćby program na liczenie pola koła. © O d w o łan ie się od obiektu lokalnego. wówczas nie da się do niej dotrzeć takim operatorem zakresu. to tak zw an y obiekt stały. że nigdy. 0 Definicja obiektu lokalnego. double pi = 3. □ Wykonanie objawi się na ekranie jako: Jestem w main. Jeśli jed n ak chcem y m ieć pew ność. © O d w o łan ie się w ew nątrz lokalnego bloku do zasłoniętego obiektu globalnego. Były to p o p ro stu liczby.80 Rozdz. objętości kuli i czegoś jeszcze.p rzep ad ło ! O d tej p o ry ju ż nie m o żn a p o d staw ić do ob iek tu const żadnej w artości. typu i n t ) .14.14. ale o obiekty.14 - m u sim y to zrobić w łaśnie p rz y definicji. które mają w sobie jakąś wartość. k =33 po lokalnej definicji k =10 ale obiekt globalny k =33 Poza blokiem k =33 Uwagi O Definicja obiektu globalnego. P arad o k sem byłoby pow iedzieć: chodzi o zm ien n e. W ty m celu zdefiniujem y sobie obiekt typu d o u b l e i n ad am y m u w artość o d p o w iad ającą liczbie n. S praw ia to zapis z operato rem zakresu : : k T en ch w y t możliwy jest tylko w stosunku do zasłoniętego obiektu globalnego: Jeśli nazwa lokalna zasłania inną nazwę lokalną. k tó re­ go zaw arto ści naw et p rzez nieuw agę nie chcielibyśm y zm ieniać. że ró w n o cześn ie inicjalizujemy tu taj n asze pi w arto ścią 3. Typy Specyfikator (przydomek) c o n s t cout << "\nPoza blokiem k =" « k << endl. O biekt tego ty p u . Później . 3. n a w e t p rzez nieu w ag ę nie zm ieni­ m y w artości naszej liczby pi.9 S p e c y fik a to r (p rzy d o m e k ) const C zasem chcielibyśm y w p ro g ram ie posłużyć się obiektem (np. Tutaj nie chodzi o liczby. const double pi = 3. Z a u w a ż m y . w ów czas taką definicję p o p rz e d z a m y słow em (specyfikatorem . m o d yfikatorem ) const. k tó re napisane były w tekście p ro g ram u . (N aw et takiej sa m e j!) . W ielokrotnie w takim program ie potrzebow ać będ ziem y liczby n. 3. które w p ro g ram ie m ają się nie zm ieniać. M ów iliśm y już o stałych dosłow nych. S pecyfikator ten u ściśla zw ykłą definicję tak.

m o d y fik a­ tor.Rozdział. 3. to zajrzyj sobie k ied y ś d o en cy k lo p ed ii i s p ra w d ź . co to s ło w o zn aczy . a n ie „inicjacja". . słowa O sobiście m am w stręt d o takich „m ąd ry ch '" słó w jak: sp e c y fik a to r. słowa. N asz o b iek t p i m a p rzy d o m ek c o n s t . Jeśli b ę d z ie sz u p a rc ie m ó w ił „inicjacja".tru d n o to z d a n ie zrozum ieć. Typy 81 Specyfikator (przydomek) c o n s t Słowa. bo g d y kilka takich słó w sp o tk a się o b o k sieb ie w je d n y m z d a n iu . na u w ag a językow a: M ów im y „inicjaLIZA cja". D lateg o słow a takie jak c o n s t n azy w am s o b ie p o p ro stu : przydomek.jest w ięc o b ie k te m stały m . Jest o g ro m n a ró żn ica m ięd zy ty m i słow am i.

1 Pojedynek: c o n s t contra # d e f i n e Jest to p arag raf dla p ro g ram istó w klasycznego C. jakbyśm y .9. na przestrzeni którego wykonujemy edytorem operacji zamiany znaków P I na znaki 3 .b e z p o śre d ­ nio p o zakończeniu p isan ia program u . W p ro g ram ie jest tylko k ilk ak ro tn ie u ży ta liczba 3. a k tó re są liczbą pór ro k u . N ie zaw sze jed n ak sp raw a jest ta k oczyw ista. a potem ju ż zaw sze będziesz m ó w ił tylko: „inicjalizacja". P o k ażem y jednak. W zw iązk u z tym . Nie ma to jednak nic wspólnego z zakresem ważności. N aty ch m iast po tym p rz y stę p u je m y do kom pilacji. Inicjow ać m ożna na p rzy k ła d akcję zbiórki złom u. 3. to opuść ten p a ra g ra f i przejdź do n astępnego.14 (albo liczby 4). N ie m a tu p rzec ież ż ad n e g o z a k re su w ażn o ­ ści. To tylko jakby obszar.82 Rozdz.14". ż e n azw a P I jest k o m p ilato ro w i n ie z n a n a . Jeśli nie p ro g ram o w ałeś w języ k u C. to zap ew n e p am iętasz.1 4 .14 K o m p ilato r nie skojarzy. N ig d y się n a w e t nie dom yśli. Typy Specyfikator (przydomek) c o n s t Trochę się pośm iejesz. D ziałan ie d yrektyw y # d e f i n e jest mniej w ięcej takie. #define LICZBA_SILNIKOW 4 K o m p ilato r nie zg ad n ie. co straciliśmy: ♦♦♦ N azw a P I jest k o m p ilato ro w i zu p ełn ie n iezn an a. 3. N p.14 Ta fo rm a w C++ jest ta k ż e dopuszczalna. d la czeg o jest g o rsza. W Jeżeli program ow ałeś w języku C. k tó re z w ystępujących w p ro g ram ie liczb 4 są określe­ n iem liczb y silników . ch o ciaż człow iek od ra z u b y się tu dom yślił. liczbą nóg konia ltd. ż e w k ażd y m z m iejsc ch o d zi o tę sam ą liczbę n.w y d a li edy to ro w i polecenie z a stą p ie n ia k ażdego sło w a "P I" słow em "3. Oto. t d e f i n e PI 3. że w o góle istniała.gdy takiej nie ma —do końca pliku. Są tylko lu ź n o p o ro zrzu ca n e liczby 3. Słała określona przy pomocy dyrektywy procesora łr d e fin ejest znana od linijki wystąpienia dyrektywy t t d e f i n e do linijki H u n d e f lub . że w k lasy czn y m C stałe najczęściej definiow aliśm y sobie za pom ocą d y rek ty w y p reprocesora. d lateg o k o m p ilato r nie p o tra fi sp raw d zić czy d a n a n azw a zo stała u ż y ta w ra­ m ach jej zakresu w ażn o ści.

Jeśli je d n a k zasto su jem y s p o só b o b iek tam i c o n s t const in t r o z d z i e l c z o ś ć = 8192. S am a liczba 3. ty p u d o u b l e .w d a n y m m o m en cie . nie m o żn a w ięc p o słu g iw a ć się w o b ec niej w sk a źn ik ie m . d o ty czy p o słu g iw a n ia się p ro g ra m a m i u ru c h o m ie n io w y m i. itd . P ro g ram taki p o z w a la na p racę k ro k o w ą n aszeg o p ro g ra m u . co ta m w łaściw ie jest. R obi się to p o d a ją c p o p ro stu n a z w ę d a n e g o obiektu. co w d a n y m m o m en cie tk w i w s ta ły m o b iek cie P I . p o k aza ć n a n ieg o w sk a źn i­ k iem . S k o ro je st to o b iek t. to z a p y ta n ie d eb u g g era o to . k tó ry chcę p rz e d s ta w ić .Rozdział. je st to n ie m o żliw e . co się kryje p o d n a z w ą d l u g o s c b u f jest z u p e łn ie le g aln e i w rezultacie o trz y m a m y o d p o w ied ź: 16384 . const in t c z y n n ik = ( r o z d z i e l c z o ś ć / k a n a lo w _ w _ b lo k u ). N a to m ia s t z d e fin io w a n ie o b iek tu jako c o n s t s p ra w ia . D eb u g g er o d p o w ie . g d y b y ś m y p o p ełn ili błąd. ż e ch ciało b y się zap y tać. N azw a m o ż e b y ć p rzecież z n a n a w jednej funkcji. c o . # d e fin e ROZDZIELCZOŚĆ 8192 id e fin e KANALOWWBLOKU 128 td e fin e CZYNNIK (ROZDZIELCZOŚĆ / KANAL_W_BLOKU) # d e fin e DLUGOSC_BUF (CZYNNIK*16*CZYNNIK) W tak iej sytuacji m o ż e się o k azać k o n ieczn e u p e w n ie n ie się ile w łaściw ie w y n o si DLUGOSC BCJF. KANALOW_W_BLOXU.14 nie m a a d re s u . R o z w a ż m y p o n iż sze d w a w arian ty . CZYNNIK). a n ie z n a n a w innej. (U życie m a ły c h lu b w ielk ich liter w notacji n a z w w y n ik a tylko z trad y cji). czyli z a n g ie ls k a . P r z y tym sp o so b ie d e fin io w a n ia stałej. D o d a tk o w o o b iek t ten m a n a le p k ę : „N ie Z m ien iać P o d Ż a d n y m P o zo rem !". const in t d lu g o s c _ b u f = (c z y n n ik * 4 * c z y n n i k ) . const in t k an alo w _ w _ b lo k u = 128.tk w i w jak im ś o b iek cie n a sz e g o p ro g ra m u . Typy 83 Specyfikator (przydomek) c o n s t Czy dużo straciliśmy? R aczej tak. ż e p o w staje n am w p a ­ m ięci n o rm a ln y o b iek t (n p . O sta tn i z a rg u m e n tó w . to m o ż n a p o zn ać jego a d re s .d e b u g g e ra m i. to czę sto się z d a rz a . je d n a k jeśli m asz stałą l i c z b a _ s i l n i k ó w . G d y b y śm y p o słu ż y li się d y re k ty w ą # d e f i n e . S traciliśm y m o ż liw o ść św ia d o m e g o w y b o ru zasięg u n azw y . że n ic m u nie w ia d o m o o n a z w ie t>LUGCSC_BUF (P o d o b n ie jak nic nie w ie o n a z w a c h ROZDZIELCZOŚĆ. M o ż e C i się w y d a ć ś m ie sz n e p y ta n ie d e b u g g e ra . 3. a w d o d a tk u sp ra w d z e n ie . P o s łu ż e n ie się # d e f i n e w n aszy m p rz y p a d k u jest jak b y za m ia n ą n azw y na liczb ę (stałą d o sło w n ą). K om p ilato r nie m o ż e te ra z n as o strzec w p rz y p a d k u . b ęd ącą je d n ą z w ie lu stały ch w ty m p ro g ra m ie . to m ielib y śm y w p ro g ra m ie d o c zy n ien ia z k ilk o m a stały m i d o sło w n y m i. lu b i n t ) .

to nie m ożem y starać się u z y sk a ć jej a d re su . 3. p a ra g ra f o zm ien n y ch autom atycznych . (Por.10 O b ie k ty register r e g i s t e r to jeszcze jed en typ przydom ka (specyfikatora). ż e b ard zo za le ż y nam na szybkim dostępie do tego obiektu (bo np. jest to tylko pobożne ży czen ie. O tó ż załóżm y. g d zie m o że n am o k reślić (i podać) jego ad res. W yjaśnijm y to. k tó ry m ów i kom pilatorow i. Rejestr to nie jest kaw ałek pam ięci. tylko za k ażd y m razem . register int i. że d ek laru jem y z m ie n n ą określającą sło w o stan u j a k i e g o ś z e w n ętrzn eg o u rząd zen ia. zm iennej autom atycznej typu całkow itego. int stan miernika. W tym p rzy p ad k u m ożna ten p rz y d o m e k zastosow ać do tzw. do której ma bardzo szybki. Słow o to ostrzega. V o la tile 15.11 S p e c y fik a to r voiatiie Jest to przydom ek. k o m p ilato r um ieści ten obiekt w zw ykłej pam ięci. W iększość zn an y ch mi k o m p ilato ró w .84 Rozdz. w ięc nie adresuje się g o w zw y k ły sp o só b . takie su g estie bierze pod u w a g ę i program w ykonuje się nieco szybciej. Jak pow iedziałem . że tak będzie w istocie. że o b ie k t m o że się w jak iś niezau w ażaln y d la kom pilatora sposób zm ieniać. zaraz b ęd ziem y u ż y w a ć takiego obiektu tysiące razy). D opisując ten p rzydom ek dajem y kom pilatorow i d o zrozum ienia. k tóre k o m p ilato r m oże spełnić lub nie. N ie m a jednak gw arancji na to. Typy Obiekty r e g i s t e r 3. N iektóre k o m p ilato ry nie są a ż tak sprytne. niem al natychm iastow y dostęp. że m a być o stro żn y w k o n ta k tach z d anym obiektem . K om pilator m oże u w zg lę d n ić n aszą su g estię i przechow yw ać ten obiekt w rejestrze. N a przyk­ ład u rz ą d z e n ia m ierzącego tem p eratu rę oleju w silnikach. D la naszego d o b ra tak. 163). 15) [czytaj: „woletaili .k o m p ilato r m a rzeczyw iście zw rócić się d o p rzy d zielo n y ch te m u obiektow i kom órek pam ięci. czyli tam . volatile int ra. 3. K om pilator w ięc me p o w in ie n u p raszczać so b ie sp raw y . który m o że zostać d o d a n y w definicji obiektu. g d y o d w o ła m y się d o te g o obiektu .str. Jeśli więc m im o w szystko spróbujem y d o w iad y w ać się o te n adres.znaczy po angielsku: ulotny. Z ap y tasz: —A czy kied y k o lw iek byw a inaczej? Tak. Jeśli deklarujem y zm ien n ą jako r e g i s t e r . czyli specjalnej kom órce.

a te ra z zn o w u m am w y p isać na ek ran z m ien n ą temperatura. k tó ra rep rezen tu je u k ła d sprzęgający (interface) kom puter z m iern ik iem te m p e ra tu ry . © ) . P rzy k ład o w o instrukcja typedef int cena. 3. że m ożliw a staje się taka deklaracja . że ten specjalny o b iek t został u tw o rzo n y w tej części p am ięci k o m p u tera. że d o k o m p u te ra d o ch o d zą p rzew o d y z zew n ętrzn y ch układów p o m ia ru te m p e ra tu ry . Typy 85 Instrukcja t y p e d e f T o sło w o m o że się zm ien iać sam o z siebie (bez w ied zy kom pilatora). w y ­ m ykający się czasem sp o d k o n tro li k o m p ilato ra. że ten u k ła d sprzęgający o b sługiw any jest p rz e z taki frag m en t p ro g ram u : int a = 5. to p o prostu w y p iszę tę w artość. D o m y ślasz się już p e w n ie . Z ałóżm y. bow iem . b = 6. b = 0. S pecyfikator -/olatile (czyli: u lo tn y ) o zn ac za. S koro w ięc jej o d tamtej p o ry nie zm ieniałem . P o tem zajm ow ałem się jakim iś n ie zw iązan y m i z te m p e ra tu rą zm ien n y m i a o ra z b . a nie p o le g ać na tym . volatile int temperatura. że o b ie k t tak o k reślo n y m o ż e się zm ien iać w sp o só b rzeczy w iście u lo tn y . 12 In s tru k c ja typedef Instru k cja t y p e d e f p o z w a la na n ad an ie d o d a tk o w e j n a z w y ju ż istniejącem u ty p o w i. O Z a ra z . p ra w d z iw a w artość o b ie k tu temperatura zm ieniła się bez w ie d z y k o m p ilato ra i p rzek ro czy ła w a rto ść krytyczną. a = b + 8. a tu w ybuch! P rzez ten czas. cout « "Biezaca temperatura = « temperatura << endl. sp ra w ia . co so b ie zap isał „n a b o k u ". S łow o volatile p rz e strz e g a k o m p ilato r p rz e d takim w ła śn ie sp ry tem . bo p rz y p u ś ć m y . cout << "Biezaca temperatura = << temperatura « endl. zaraz. m iałem ją p rz e c ie ż g d zieś tu z a p isa n ą na boku (czytaj: w rejestrze). Jest ryzyko. ( © . K o m p ilato r w y p isu je. że k o m p ilato r m ógłby „p o m y śleć" sobie tak: P o b rałem z kom órki temperatura jej w a rto ść i w ypisałem ją na ek ran ie O . Za k a ż d y m razem m usi o n rzeczyw iście sięg n ąć d o kom ó rk i temperatura.Rozdział. nie m u s z ę tracić czasu na o d czy ty w a n ie jej z pam ięci.

O to k ilk a p r z y k ła d ó w : typedef int * wskaznik_do_int. wsk c w. P o n i ż s z a in s tr u k c ja d e f i n i u j e w ię c e j n a z w t y p ó w typedef int calk. * wskc. b. b. d e k l a r u j e m y o b ie k ty t y p u c e n a —z a je d n y m z a m a c h e m z m ie n ia ją s i ę w e w ła ś c iw y sp o só b . typedef char * napis. //c z y l i int * wl. natur. w ię c z a s t o s o w a l i ś m y tę i n s t r u k c j ę typedef. T o z a s t o s o w a n i e in s tr u k c ji t y p e d e f r a d z ę z a p a m i ę t a ć . napis komunikat. a je d y n ie s y n o n im n a z w y ty p u ju ż is tn ie ją c e g o . 3. cena a. P e w n e g o d n ia d e c y d u j e m y . T e ra z cena x. m i m o w s z y s t k o . //o d p o w ia d a : double a. IggggglgggBIMMHNNMMMMHMMMMnMMMMMMIMMMlIMMMMMNMMMNMftlNMNMIMMMIMMMIMMMNI1****?’' : *• ' le s z c z e je d n o . n i e m u s i b y ć w c a le ty p e m f u n d a m e n t a l n y m . N i e k t ó r e z n ic h m a ją o k r e ś la ć c e n ę . ż e z a p i s T w o ic h p r o g r a m ó w b ę d z i e . k t ó r a ju : s t n i e j e w b ie ż ą c y m z a k r e s i e w a ż n o ś c i. //czyli: char * komunikat. je s t to b a r d z o w y g o d n e . W y o b r a ź s o b ie p r o g r a m . T y p . b. w k t ó r y m w i e l o k r o t n i e w y s t ę p u j ą z m i e n n e ty p u int. // co odpow iada: int x. c. g d z i e u ż y w a m y n a z w y t y p u - n p . R ó w n ie d o b r z e m o ż e b y ć to t y p p o c h o d n y . //o d p o w ia d a : double x. / / c zy li: int n. że in s tr u k c ja typedef n ie w p r o w a d z a n o w e g o ty p u . C o w te d y r o b im y ? O d s z u k u je m y w p r o g r a m i e tę i n s t r u k c j ę t y p e d e f i z a m i e n i a m y ją n a ta k ą typedef double cena. K o n k r e tn ie : je ś li m a m y ju ż d e k l a r o w a n i . c. Typy In stru k cja t y p e d e f cena x. b. na t u r n. wskaznik_do_int wl. P o c o r o b ić t a k i e s z tu c z k i? D la c z e g o n ie n a p is a ć p o p r o s tu int? O tó ż t a k a m o ż liw o ś ć je s t b a r d z o p r z y d a t n a . J a k w i d a ć .i c h c ie lib y ś m y b y c e n y r e p r e ­ z e n t o w a n e b y ły ty p e m double. J e ś li w p r z y s z ł o ś c i b ę d z i e s z m u s i a ł p o s ł u g i w a ć s ię s k o m p li k o w a n y m i w s k a ź n i k a m i . T y m s p o s o b e m w s z y s t k i e m ie js c a w p r o g r a m ie . // c z y li: int * w. to ta in s tr u k c ji z a p e w n i C i. Z w r ó ć u w a g ę ja k u m i e s z c z o n a je s t g w ia z d k a w s k a ź n i k a . k t ó r y o k r e ś la m y w in s tr u k c ji typedef. ż e d o k ł a d n o ś ć lic z b c a ł k o w i ty c h n a s n ie z a d o w a l a .86 Rozdz. I n s tr u k c ją t y p e d e f n ie m o ż e m y r e d e f i n i o w a ć n a z w y . // c zy li: int a . N a le ż y p a m ię ta ć . co u m o ż l i w i a t a k i e k o n s tr u k c je : calk a. c z y t e l n y . //co odpow iada: int a. cena a.

Jak definiuje się taki ty p w yliczeniow y? Z o b aczm y to od razu na przykładzie. że co_robic jest zm ienną.to nie m ożem y u ż y ć instrukcji typedef int calk. zniszczenie_probki = 5 5 }.np. Z definiow aliśm y n o w y ty p o n azw ie akeja. cal k określającą funkcję w ykonującą całkow anie . . C zęsto z d a rz a się. zmiana_probki = 54. C o w naszym p rzy p ad k u w y g ląd ać m oże tak: enum akcja { start_pomiaru = 0. W tedy w arto sk o rzy stać z typu w yliczeniow ego. C hcem y za pom ocą liczb określać jakieś d z iałan ie u k ład u pom iaro w eg o . b o n azw a calk jest ju ż zajęta. je st to osobny ty p dla w y b ran eg o p rzez n as zestaw u stały ch całkow itych. że w obiekcie typu całk o w iteg o chcem y p rzech o w ać nie tyle liczbę. co_robic = start_pomiaru. a nied o p u szczaln e są o p e ra q e co_robic = 1. O czyw iście m u sim y uczynić to w p isu jąc tam liczbę. 3. ale liczba ta m a dla n as szczególne znaczenie. . a p rzy d aje się on w w ielu sytuacjach. jak te akcje sobie pon u m eru jem y : 0 start_ p o m iaru 1 o d c z y tp o m ia r u 54 zm ian a_ p ró b k i 55 zniszczenie_próbki T y p w yliczeniow y d efin iu je się w ed łu g sch em atu enum n a zw a _ typ u { lista w yliczen iow a }. Chce­ m y m ieć jakąś zm ienną o n azw ie co robic. odczyt_pomiaru = 1. To zn aczy m ożliw e są tak ie operacje: co_robic = zmiana_probki. co robie = 4. d o której m o żn a p o d staw ić tylko jedną z określonych na liście w yliczeniow ej akej a w artości. O znacza to.Rozdział. Typy 87 Typy wyliczeniowe enum n a z w ę . O to.A o to definicja zm ien n ej tego typu: akcja co_robic. Do niej będ ziem y w staw iali liczbę określającą żąd an ą akcję. co raczej p ew ien rodzaj informacji.13 T y p y w y lic z e n io w e enum To b a rd z o ciekaw a rzecz.

przeskocz_blok = 5. ♦♦♦ przewin: 7. (Jak widać. zapisz_naglowek.zn o w u n ie b y ło ży czeń .to takie w łaśn ie lic z b y byłyby p o d s ta w io n e tam p rz e z d o m n ie m a n ie . ż e m a być to s a m o .16 T o b a r d z o w a ż n a cecha. k o le jn e p o zy cje na tej liście m ają n astęp u jące r e p r e z e n ta q e liczbow e ♦♦♦ czytaj blok: 0 . to te. ♦♦♦ przeskocz_blok: 5 . przeskocz_znacznik. by b y ła to liczbę 5. m im o lic z b y 1 n ie m o g liśm y w s ta w ić d o zm iennej ty p u a k c j a . Na liścieI nie m oże z o s ta ć p o d sta w io n e d o zm ien n ej tego typu akej a.re p re z e n to w a n y p rzez liczb ę 1. L ista w y l i c z e n io w a R e p re z e n ta c ja liczb o w a e le m e n tó w listy m o że b y ć p rz e z nas w y b ie ra n a w tedy. g d z ie rep rezen tacje liczb o w e sa inne: enum operacja_dyskowa { czytaj_blok. g d y b y to coś p rz y p a d k o w o p aso ­ w a ło . g d y b y ś m y w n a ­ s z y m p rz y k ła d z ie n ie n a p isa li tych liczb 0.ja k o w arto ść liczb o w a. Tylko te n a z w y . copowrot_do_poczat- ku. odczyt pomiaru jest . zgadzają się na wstawianie liczb do zmiennej typu enum. c z y li 1. w ięc k o m p ila to i b ie rz e n astęp n ą liczbę.z n o w u nie było określenia. zapiszzakonczenie = zapisz_naglowek + 3 1. wolno nam posłużyć się przed chwilą zdefiniowaną nazwą)- 16) Niektóre starsze kompilatory. mimo wszystko. to w y licza n ie za­ czyna się od 0. g d y d e fin iu je m y d a n y ty p w y liczen io w y . Jednak. w ięc z w yliczanki w ynik a. przewin = powrót_do _poczatku. D zięk i te m u n aw et p r z e z n ie u w ag ę nie w p is z e m y dc z m ie n n e j co_robic c z e g o ś inn eg o . powrot_do_poczatku. ♦♦♦ przeskocz_znacznik: 6 . pisz_blok. że będzie to liczba następna.tu w id z im y w y r a ź n e ży czenie. 3. bo to n a s tę p n a liczba. N aw et. O to p r z y k ła d in n eg o ty p u w y liczen io w eg o .88 Rozdz. N a w ia s e m m ów iąc. ♦♦♦ powrot_do_poczatku: 7. 1 . co nie je st n a liście w y liczen io w ej tego ty p u w y liczen io w eg o .bo jeśli nie określiliśm y inaczej. czyli 6 . ♦♦♦ pisz blok: 1 . . w y lic zen io w ej zauw ażam y liczby. Typy Typy wyliczeniowe enum N ic. które że są n a liście. bo m ó w im y .jak w id z im y .

. enum jest typem arytmetycznym To z n ac zy . zapis z_za kończenie: 11 . Jed en n azy w ał się a k c j a. a fakt. s t a l a P .Rozdział.nie m u si n a s w cale obchodzić. to zn aczy nie m ająca n a z w y ty p u . O czyw iście robim y to celo w o . Ta p ro stsza form a jest je d n a k jakby nieco u b o ż s z a . czy li 8. s t a l a N . sta la C . tylko zn o w u z elem en tam i tej listy. Są to jakieś w arto ści. m o ż liw e jest w ięc ta k ie w y rażen ie p r z e s k o c z _ b lo k + 1000 i m a o n o w artość 1005. Typy 89 Typy wyliczeniowe enum •X* z a p i s z n a a l o w e k : 8 . sta la B . to po d o d a n iu liczby 3 o trzy m u jem y w a rto ś ć 11. Jaka je st ró żn ica? ❖ Jeśli m am y z d efin io w an y typ w y lic z e n io w y z n a z w ą . Jest to w artość ty p u int. . k tó re b ę d ą m iały tę s a m ą rep rezen tację.. N aw iązu jąc d o p o p rz e d n ie g o p rzy k ła d u . Jeśli g d z ie ś w p ro g ra m ie trze b a p o d ać jak ąś z n azw z listy w y liczen io w ej typu a k c j a . ż e w arto ść ta p o w stała p rz y u ży ciu jakiegoś tam enum.w d a n y m z a k re s ie w a ż n o ś c i.. W tak iej sytuacji n a stę p u je zam ian a (k o n w ersja) w arto ści d a n e g o o b iek tu ty p u e n u m n a w artość ty p u int. a d ru g i ope r a c j a d y s kowa. k tóry o d p o w ia d a z a pracę z d y sk iem . N ie p o trz e b u ję ch y b a d o d a w a ć . }. }. n — tĄMl D z ię k i ta k ie j s k ła d n i m a m y w y g o d n y s p o s o b z d e fin io w a n ia k ilk u s ta ły c h (c a łk o w ity c h ) . To.' •*. m oże u cze stn iczy ć operacjach ary tm ety czn y ch .z n o w u n ie b y ło życzeń. Jak zau w aży łeś. . . 3. ja k ie są rep rezen tacje liczbow e . W p o d p ro g ra m ie .. w ięc k o m p ilato r bierze n astęp n ą liczbę. ż ą d a n ą akcję p o ró w n u je m y nie z liczbam i. . M ogą być na p rz y k ła d na liście d w a elem en ty o n azw ie p r z e w i n tasme o ra z r o z l a d u j tasme. S koro zapisz n a g ł ó w e k m iało w a rto ść 8. enum { stalaM . że o b iek t ty p u enurr. to m o ż e m y tw o ­ rzyć sobie jakieś o b ie k ty takiego (n a z w a n e g o ) ty p u . Nawzajem się nie znają. i ł d . ż e te d w a ty p y n ie m ają ze sobą nic w spólnego. to p ró b a p o d a n ia jakiejś n az w y z listy w yliczeniow ej ty p u operacja d y s k o w a b ęd zie p rz e z k o m p ilato r o d rzu co n a . nie m a zn a c z e n ia .. ild. r M t* ■ (*> * « * < •> 4 P M T . te rep rezen tacje liczbow e n ie m u szą koniecznie się różnić.jest tu w y ra ż e n ie (zapisz jiaglowek + 3). Typ wyliczeniowy nie musi mieć nazwy Z obaczyliśm y d o tej p o ry ta k ą form ę definicji ty p u w y liczen io w eg o enum n a z w a _ ty p u { sta la A . M oże być form a jeszcze p ro stsza. g d y chcem y u m o ż liw ić n ad a n ie d w u n a z w tej sam ej akcji. Z o b aczy liśm y tu d w a p rz y k ła d y ty p ó w w y liczen io w y ch .

a d o teg o d o ło ż y m y Tw ój "sp ry t". Typy Typy wyliczeniowe enum Obiekty te będą mogły przyjmować jedną z wartości z właściwej sobie listy wyliczeniowej. ale w sz y stk ie razem . Jest to jeszcze je d e n a r­ g u m e n t za ty m .7 str. operatora s i z e o f (zob. ♦> N ato m iast ten ty p b e z n a z w y . jak na o b ie k t jed n o b ajto w y .m ożliw ości tw o rzen ia ob iek tó w tak ieg o ty p u n am nie daje.. lu b n a w e t cztery bajty. Tak. ta k na siłę. A le. k tó re robią to sprytniej. O b iek ty tak ie . 3. Jeśli na p rz y k ła d są ta m ty lk o w artości: 0 . N ie m ożem y przecież s tw o rz y ć obiektu. W sz y stk ie te w a rto ś c i zm ieszczą się p rz e c ie ż w jed n y m bajcie. Jakie to m a d la nas zn ac zen ie (o p ró cz o szczę d n o ści p am ięci)? I C o n as o b c h o d z ą ta k ie sp raw y ? M o że to m ieć zn aczen ie. danny). bo tak ie w a rto śc i m ieszczą się w je d n y m bajcie. .tak n a p ra w d ę . g d y w niedalekiej p rz y sz ło śc i.90 Rozdz. T a k też to zrealizu je. Jeśli w ięc. b ę d z ie sz ch ciał w takim o b ie k cie u m ieścić liczbę 5. jeśli b ę d z ie s z ch ciał tam "w epchać" liczb ę 44000 . N a to m ia s t. 113) s p ró b u je s z się d o w ied zieć o jego ro zm iar .1 . lu b 102 . k tó re w y stęp u ją n a jego liście w y liczen io w ej. k ło p o t m o ż e w y stąp ić ty lk o w te d y .u d a C i się to. ale m o g ą być kom p ilato ry . k tó re g o typ n ie m a nazw y. N a czy m p o le g a ich sp ry t? Po p ro stu s p ra w d z a ją o n e jakie w arto ści u m ieściłeś n a liście w yliczen io w ej. C ie k a w a rzecz: jeśli z d efin iu je sz swój ty p w y lic z e n io w y (o n azw ie np.to ta k a liczba je st za d u ż a . C zasem je d n a k w cale teg o nie chcem y. ja k p o w ia d a m . najczęściej k o m p ila to r zrealizu je ten T w ó j ty p danny po p ro s tu za p o m o c ą ty p u int. O b iek ty tw o je g o ty p u w y lic zen io w eg o o n azw ie danny b ę d ą m iały w te d y ro z m ia r je d n e g o b ajtu . § 4. o d k ry jesz s p o so b y u m ie s z c z a n ia w o b iek tach sw o jeg o ty p u danny w arto ści sp o za je g o listy w y lic zen io w ej. K ażd a z tych stałych m a sw o ją w łasn ą nazw ę .. tak . 6 —to taki s p r y tn y k o m p ila to r u z n a .realizu je o n za p o m o c ą je d n e g o z ty p ó w całkow itych. E fekt w te d y jest n ie z d e fin io w a n y .tę. Teraz coś tylko dla dociekliwych: Jaki rozmiar mają obiekty enum? T o z a le ż y o d k o m p ilato ra. a n a s tę p n ie za pomocą tzw. że ro zrzu tn o śc ią b y ło b y takie w arto ści p rz e c h o ­ w y w a ć w obiekcie o ro z m ia rz e d w a.nie m ają żad n ej w sp ó ln e j n a z w y sw ojego ty p u . byś d o o b ie k tu ty p u w y lic z e n io w e g o p rz y p is y w a ł ty lk o te n a z w y . g d y k o m p ila to r b ę d z ie rz e c z y w iśc ie sp ry tn y . O tó ż: co p ra w d a . którą w id z im y na liście w yliczen io w ej. p o trze b n y ch jest n am tylko kilk a stałych c a łk o w ity ch i już.m o ż e sz być zaskoczony.są i n a to sposoby.

Instrukcja ta (jak już wiemy) nie tworzy nowego typu. Jeśli przy deklaracji obiektu typu i n t nie zaznaczyliśmy czy chodzi o wersję "ze znakiem" czy "bez znaku" . to wyjaśniamy. Jego deklaracja. Czy możliwe jest powtórzenie tej samej deklaracji w danym zakresie ważności? Czy możliwe jest powtórzenie tej samej definicji w danym zakresie ważności? Co powołuje do życia obiekt o nazwie nnn. Czy są to pojęcia rozłączne. a typami fundamentalnymi? VII Wymień typy przeznaczone do pracy z liczbami całkowitymi. czy może stworzonym przez typedef? . W mojej praktyce chyba najczęściej przy w y sy łan iu argum entów d o funkcji. Potrafisz to przypomnieć?). to można naioet dla niego przeładować operatory. czy też jedno jest szczególnym rodzajem drugiego? Jeśli tak. k o l o r ) . globalnych) 3. a deklaracją. Funkcja m oże spodziew ać się a rg u m e n tu typu w yliczeniow ego (np.który wariant wybierze kompilator? IX Co to są znaki alfanumeryczne? Podaj nazwę typu mogącego przechowywać znaki alfanumeryczne . to które jest rodzajem którego? (W mnemotechnicznym zrozumieniu tego zagadnienia może bardzo Ci pomóc łacińskie pochodzenie słów deklaracja i definicja. Typ wyliczeniowy jest typem definiowanym przez użytkownika. ale nadaje nową. Pon ieważ jednak typ enum nie ma funkcji składowych. c p e r a c j a dysKowa) i kom pilator b ę d z ie pilnow ał.który wariant wybierze kompilator? Podaj nazwę typu przeznaczonego do przechowywania rozszerzonego zestawu znaków alfanumerycznych. że co? Wyjaśnij jaka jest różnica między definicją.w ów czas k o m p ilato r od razu zn ajd zie nam ten b łąd .14 Ć w ic z e n ia Deklaracja jest wyjaśnieniem czegoś kompilatorowi na temat naszego programu. Typy 91 Ćwiczenia Dla wtajemniczonych T y p y w yliczeniow e n a p ra w d ę bardzo się p rzydają. a skoro tak. d o w olną liczbę i n t lub inny typ w yliczen io w y np. więc takie operatory realizuje się w postaci funkcji nie-składowych (np. Podaj ich nazwy w war­ iantach "ze znakiem" i "bez znaku”. W języku C typ przeznaczony do przechowywania rozszerzonego zestawu znaków alfanumerycznych uzyskany jest dzięki instrukcji typedef . czy jego definicja? Jaka jest relacja między typami złożonymi. aby ty lk o argum ent tego ty p u został tam w ysłany.jedynie z podstawowego zestawu (np. czy "bez znaku” . Jeśli się p o m y lim y id o funkcji w yślem y coś innego (np. ASCII) Jeśli w powyższym typie nie zaznaczyliśmy czy chodzi o wersję "ze znakiem".Rozdział. Czy w C++ typ ten jest odrębnym typem. 3. Jeśli deklarujemy nazwę nnn. dodatkową nazwę jakiemuś już istniejącemu).

by nie próbować tam wpisać za dużej liczby. Zapisz liczbę 15. to czy w instrukcji postawionej bezpośrednio po zakończeniu pętli możemy zdefiniować nowy obiekt o nazwie "i"? W wyrażeniu warunkowym instrukcji i f można zdefiniować obiekt. Typy Ćwiczenia Wymień trzy typy przeznaczone do pracy z liczbami zmiennoprzecinkowymi. Ile różnych wartości może przyjmować obiekt takiego typu? Jakie to wartości? Jakie naprawdę wartości liczbowe reprezentują możliwe "stany" obiektu typu logicznego. jeśli jakaś ujemna liczba nie mieści się obiekcie typu short int? Jakim innym typem można wtedy się posłużyć? Gdzie definiować można obiekty w języku C++: a) jedynie powyżej instrukcji wykonywalnych. (To dobrze jest pamiętać. Czy można dokończyć jej pisanie w linii następnej? Jak to zrobić. by ostatecznie uzyskać i tak jeden długi C-string? Jaka jest relacja między typami złożonymi. Czy do typu bool można zastosować specyfikator signed? Jeśli dany kompilator rezerwuje dla typu short int dwa bajty pamięci (czyli 16 bitów) to liczbę z jakiego przedziału można w nim zapisać? Podaj w przybliżeniu. tak by owa stała była typu wchar_t Zapisz w postaci stałej dosłownej typu C-string (ciąg znaków) swoje imię i nazwisko. Mogą być tylko dwie stałe dosłowne typu bool.14 . Podaj je. jeśli stała dosłowna typu C-string jest tak długa. w której instrukcji inicjalizującej jest definicja obiektu o nazwie "i”. XXVIII Jakiego typu jest następująca stała znakowa 'w' ? XXI) Zapisz stałe dosłowne reprezentujące następujące znaki specjalne: tabulator. w zaokrągleniu do tysięcy. znak nowej linii. Zapisz wartość 10 w postaci stałej dosłownej typu: int. float. Jaki zakres ważności ma ten obiekt? Odpowiedz na to samo pytanie w przypadku Co to jest stała dosłowna? Czy obiekt stały mieszczący sobie wartość 3. b) nawet wśród instrukcji wykonywalnych Jeśli mamy pętlę for. 17 w postaci stałej dosłownej w zapisie dziesiątkowym. 3. Co zrobić. Co zrobić. un- signed long. long. Czy stosuje się do nich specyfikatory signed/unsigned? Wymień nazwę typu przeznaczonego do pracy ze zmiennymi logicznymi. a typami fundamentalnymi? . sygnał dźwiękowy ? Zapisz jako stałą dosłowną znak o kodzie (szesnastkowym) 2f(|6j Zapisz jako stałą dosłowną znak o kodzie (ósemkowym) 10(g) Zapisz jako stałą dosłowną literę m. ósemkowym i szesnastkowym. Użyj najpierw zapisu dziesiętnego (zwykłego). unsigned in t.92 Rozdz. że nie możemy jej zmieścić w jednej linii tekstu programu.6 w postaci stałej dosłownej typu double oraz float. a następnie wykładniczego.to jest stała dosłowna ? Zapisz tę samą wartość np. odwrotny ukośnik. Następnie między imię i nazwisko wstaw znak nowej linii. double.

Jeśli w drugim z nich jest nazwa yyy. w którym globalna nazwa została zasłonięta przez nazwę lokalną . Jaki zakres ma ta nazwa. to jaką wartość otrzyma ona przez domniemanie? Jeśli na liście wyliczeniowej jednej z kolejnych nazw nie przypiszemy żadnej wartości. Czy za pomocą instrukcji goto można przeskoczyć do wnętrza innej funkcji? Jaki zakres ma etykieta. definiujemy gdzieś obiekt o nazwie m. a przypisaniem? Czy można przypisać jakąś wartość do przed chwilą utworzonego obiektu z przydomkiem "const'7 Co daje przydomek "register"? LI Jaki jest cel stosowania przydomka " v o la t ile ”. to jaką wartość otrzyma ona przez domniemanie? Czy typ wytworzony przez enum jest typem zmiennoprzecinkowym. Jeśli na program składa się z kilka plików źródłowych. 3. by móc odnosić się do nazwy cout bez konieczności używania kwalifikatora zakresu (std: : cout). O czym informuje on kompilator? Do czego służy instrukcja typedef? Czy dzięki niej tworzymy nowy typ? Czy instrukcja enum tworzy nowy typ.14? Mamy dwa typy wyliczeniowe. Podaj dwa sposoby. a w tym głębiej zagnieżdżonym .to jak możemy odnieść się to tej zasłoniętej nazwy lokalnej? XLVII! Jaka jest różnica między inicjalizacją. czy złożony? XXXVI Czy można zdefiniować obiekt typu void? XXXVIII Co to jest czas życia obiektu? Co to jest zakres ważności nazwy obiektu? Jaka jest różnica między powyższymi dwoma pojęciami? W tzw. Co to znaczy. czyli od jakiego miejsca w programie ta nazwa jest znana i kiedy przestaje być znana.wiedzących. która także reprezentuje wartość . Tak się składa. że w jednym nazwa xxx reprezentuje stałą wartość 89. Czy do takiej nazwy można się do niej odnieść spoza tego bloku? X To pytanie jest dla wtajemniczonych . czyli od jakiego miejsca w programie ta nazwa jest znana i kiedy przestaje być znana. czy może całkowitym? Czy na liście wyliczeniowej możemy umieścić stałą dosłowną 3. Typy 93 Ćwiczenia Czy v oid to typ fundamentalny. co to jest funkcja. bloku. to czy nazwa globalna z jednego z nich jest znana w pozostałych ? W danym programie posłużyliśmy się dyrektywą #in clu d e <iostream > Co zrobić. Na czym polega zasłonięcie nazwy globalnej przez nazwę lokalną? Jak z lokalnego bloku.Rozdział. czyli fragmencie programu ujętym w znaki klamry { }. czy może jej rezultat jest wariantem innego fundamentalnego typu? Jeśli na liście wyliczeniowej pierwszej nazwie nie przypiszemy żadnej wartości.odnieść się do zasłoniętej nazwy globalnej? XLVII Jeśli mamy zagnieżdżone dwa bloki. że nazwa jest globalna.lokalna nazwa zasłania inną lokalną .

94 Rozdz. 3. Typy Ćwiczenia .

/ i dzielenia nie w y m ag ają chyba ż a d n y c h w yjaśnień. * < > Tak je d n a k dalej nie m o żn a. // dodawanie a = b . O peratory 95 O peratory arytm etyczne Operatory w ró ciłeś m oże u w a g ę . c. . O tych i innych o p e ra to ra c h m u sim y p o ro z m a w ia ć te ra z bliżej. 4. O to p rz y k ła d y w y ra ż e ń . // mnożenie a = b / c. iż w iesz. // odejmowanie a = b * c. że d o tej p o ry n a s z e p ro g ra m y b y ły b a rd z o Z p ry m ity w n e . * m nożenia. I O p e ra to ry a ry tm e ty c z n e O p erato ry : + d o d aw an ia . P rz y s tą p m y z a te m d o rzeczy. To m ię d z y innym i dlateg o . ż e m ilcząco zało ży łe m . b o p rz e w a ż n ie o k reślają o n e p o d s ta w o w e o p eracje a ry tm e ty c z n e i logiczne. o d ejm o w an ia. co o zn ac zają sym bole: + . O p e ra to ró w jest w iele ro d zajó w . w k tó ry c h w y stę p u ją te operatory: a = b + c. Ich o p a n o w a n ie n ie w y m a g a jed n ak w ię k sz e g o w ysiłku. z n a n e nam p rzecież ze szk o ły . // dzielenie .Rozdział.

Te m ianow icie. 1 * (12.32) / c . albo d w ie zm ien n t jakiegoś typu. zmiennej). Z atem dodaw anie: a + 7 d ziała tu na dw óch argumentach: 1) obiekcie a (np. 4. . Skoro jest to operator. 4.3 (a + b + 0. n = 5. 2) na liczbie 7 (stałej dosłownej) Praktyczna uwaga: Z ap is Tw oich p ro g ram ó w będzie dla Ciebie i in n y ch czytelniejszy. N a dowó< p o ró w n aj dw a identyczne w yrażenia: (a+b+0. dzięki k tó rem u o trzy m u jem y resztę d zielen ia.czyli reszta z d zielenia (modulo) T ak że d w u a rg u m e n to w y m operatorem jest o p e ra to r reszty z d zielen ia % (sym boi p rocentu).g d y ż taka jest reszta z d zielen ia 10 p rzez 3. Po p ro stu dodają do siebie d w ie liczby. O peratory O peratory arytmetyczne O p erato ry te w ykonują działania na dwóch obiektach i dlatego n a z y w a m y j< dwuargumentowymi.4 + x) + 75. by k ażd y o perator po obu stro n ach m iał spacje. g d y przyj m iesz zasadę. że 8 dzielone p rz e z 5 daje resztę z d zielen ia ró w n ą 3. N a p rz y k ła d p< w y k o n a n iu takiego frag m en tu program u: int x = 8.1 Operator %. I O perator ten sto su je się tylko dla a rg u m e n tó w całkow itych. O p e ra to r ten m oże się p rz y d a ć często w takich n ie -m a te m a ty c z n y c h sytuacjac jak poniżej: #include <iostream> using namespace std. int m a i n () ( int i. cout « "wynik = " << (* % n) « endl. na ekranie pojawi się wynik = 3 a to dlatego).4+x)+75. to w yrażenie: 10 % 3 m a w arto ść 1 . tak I jest przecież sen s dzielenia z resztą.32)/c-7.96 Rozdz.1*(12. które stoją po o b u stronach sym bolu o p erato ra. Ty je d n ak czasem pom yśl te ż o sobie.1.3 K om pilatorow i jest tu w szy stk o jedno.7 .

Jest to w y p isa n ie na ekranie zn ak u n o w ej linii. co a + ( (b % C ) * d) . jak d o tego p rz y w y k liś m y w m atem aty ce. C zyli zap is a + b % c * d .f oznacza to sam o. O peratory 97 O peratory arytm etyczne 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 * Uwagi O To m iejsce..Rozdział. g d z ie działa n asz o p e ra to r m o d u lo % . W zależn o ści czy w y n ik jego d zia ła n ia jest zerow y. W arto ść w yrażenia ■i % 8 ) jest n iezero w a. n a przy k ład . czy n ie zero w y . n a p rz y k ła d .f .p o d ejm o w an a je st później o d p o w ie d n ia akcja. © Tę akcję p o d ejm u je się. w sytu acjach : 0 % 8 8 i 8 16 % 8 24 % 8 © Tę akcję po d ejm u je się. g d y w a rto ść w yrażenia w a ru n k o w e g o jest n iezero w a.. 4. O To jest m iejsce. w sytuacjach: 1 * 8 2 % 8 3 % 8 . 7 % 8 n a to m ia st w y n ik jest zero w y . Czyli po p ro s tu przejście d o n o w ej linii. Jest to w y p isa n ie na ek ran ie tabu lato ra. gdzie o d b y w a się w y p isan ie liczby n a ek ran ie ' W ' P rio ry tet o m aw ianych o p e ra to ró w jest taki sam . g d y w arto ść w yrażenia w a ru n k o w e g o jest zero w a.

4. O to przykład: + 1 2 .jes d ziałan iem tak często sp o ty k an y m w p ro g ram o w an iu . cout « "\nA teraz: " « -(-(-(i+1))). natom iast jed n o arg u m en to w y o p erato r . O to one: / / c z y li to sa m o co: i = i + 1 i++ / / c z y li to sa m o co: k = k . O p erato ry te są jed n o arg u m en to w e.3 Operatory inkrementacji i dekrementacji Inaczej m ów iąc: o p erato ry zw iększenia o jeden i zm niejszenia o jeden. które zo stało p o d d an e tej operacji. g d y w czasach archaicznych język B ro z w in ą ł się w język C. W p ętlach b ard zo często w y k o n y w aliśm y d ziałan ia w rodzaju: // zwiększenie o 1 // zmniejszenie o 1 Z w ięk szen ie o 1 (inkrem entacja) lub zm niejszenie o 1 (dekrem entacja) . P roroctw a były.1 k— D ygresja: Teraz m ożesz ju ż rozw ikłać zag a d k ę dlaczego C++ n a z y w a si{ w łaśn ie C++.1. bo działają na tylko jednym arg u m en cie (tym stojącym bezp o śred n io p o praw ej stronie znaku). . tylko tw o rzen ie liczby przeciw nej w stosunku d o w y rażen ia. ża rto w a n o jak b ęd zie się n azy w ał jego n a stę p c a j P roroctw a m ó w iły .7 -x .98 Rozdz.(a*b) Tednoargumentowy o p e ra to r + (plus) w łaściw ie nie robi nic. to także zn am y ze szkoły. ż e w języku C ++ mam'* dla w y g o d y specjalne o p erato ry . 4. że pew nie: Język D. O peratory O peratory arytmetyczne In n y m i słow y m nożenie i dzielenie w ykonyw ane jest przed d o daw aniem lub odejm ow aniem .2 Jednoargumentowe operatory + i - Plus i m in u s m ogą też w y stąp ić jako operatory jednoargum entow e. 4. O tó ż. że nie m a tu żadnego odejm ow ania. jak w idać. W rezultacie wykonania tego fragmentu na ekranie pojawi się oto dwa wydruki: 5 oraz -5 A teraz: -6 Z w racam uw agę.(m inus) zam ienia w arto ść danego w y rażen ia na liczbę przeciw ną. intCout << "Oto dwa wydruki: " « i « " oraz « -i.1. N ic w tym d ziw n eg o .

. Zobaczm y to na przykładzie: #include <iostream> using namespace std. same "zmienne maja wartości\n" « "a = " « a « endl « "b = " « b << endl « "c = " « c « endl . . g d y operator stoi z lewej strony argum entu. d = 5. 4. ❖ W przypadku. O peratory 99 O peratory arytm etyczne chybione. jest jednak bardzo proste. gdy operator inkrementacji stoi za zm ienną.f i l L ’--... M oże brzmi to bardzo zaw ile. to • najpierw jest ona zwiększana o 1. co jest obecnie w zmiennych cout « "Po obliczeniu tych wyrażeń. . co należy rozumieć jako „lepsza wersja C " Operatory inkrementacji ++ i dekrementacji — są jednoargum entowe.jakby na pożegnanie pracy z obiektem - zw iększany jest on o 1.Rozdział. bardzo sprytna różnica. int m a i n () { int a = 5.p (czyli przed argumentem) • końców kow ą (postfbc). Oba m ogą m ieć d w ie formy: • przedrostkową (prefix) czyli w ted y . bo następca C nazywa się C + + . R ozw ażm y to na przykładzie operatora inkrementacji (zw iększania). p — (po prostu po argumencie) Jest w tym pew na.: a + + . Z w ięk szenie to nie w p łyn ęło w ięc jeszcze na w artość sam ego w yrażenia. r» * // teraz sprawdzamy. to • najpierw brana jest stara wartość tej zm iennej i ona staje się wartością w yrażenia. g d y operator stoi po pra­ wej stronie argumentu np. c = 5. • następnie ta zw iększona już w artość staje się wartością wyrażenia. np: ++a. cout << "A oto wartość poszczególnych wyrazen\n" << "(nie mylić ze zmiennymi)\n”. czyli w ted y. b = 5. • a następnie . ❖ Jeśli operator inkrementacji (zwiększania) stoi przed zm ienną. cout « "-n-a = " << ++a << endl « "b++ = " « b++ « endl « c = " << — c « endl « "d— = " « d— « endl.

Z atem w zm iennej m zn ajd zie się liczba 34. 4. ) W rezultacie zobaczymy na ekranie: A oto wartość poszczególnych wyrażeń (nie mylić ze zmiennymi) ++a “ 6 b++ = 5 — c = 4 d— = 5 Po obliczeniu tych wyrażeń. Z au w aż int a. m ów im y o operatorach pre- dekrementacji i postdekrementacji. Pow oduje on.4 Operator przypisania = To jest chyba najbardziej oczyw iste.21 jako całości . w p rzypadku o peratorów zm niejszania. . N atom iast stojący za argum entem n azy w a się op era torem postinkremen ta cji. W rezultacie na ekranie pojawi się napis: Wart. Do tej pory w ielokrotnie posługiw aliśm y się ty m operatorem m = 34. ale jeszcze sam o m a w arto ść rów ną tem u . x = 4. że każde p rzy p isan ie sam o w sobie jest także w y rażen iem m ającym taką w artość.1. P odobnie. cout << "Wart. wyrażenia przypisania: " « (a = x) . że w y k o n u je podstaw ienie.jest także 2. że d o obiektu stojącego po jego lewej stronie p rzypisana (podstaw iona) zostaje w arto ść w yrażenia stojącego po prawej.88 Jest to o p erato r d w u arg u m en to w y . jaka jest p rzy p isy w an a. wyrażenia przypisania: 4 Bow iem w y rażen ie (a=x) nie tylko.88.100 Rozdz. D obrze w iedzieć i pam iętać. Z atem w arto ść w yrażenia: (x . same zmienne maja wartości a = 6 b = 6 c = 4 d . gdyż p racu je na dw óch arg u m en tach stojących po jego obu stronach.4 O p erato r inkrem entacji stojący przed arg u m en tem nazyw a się często operato rem preinkrementacji. 4. co podstaw ia. O peratory O peratory arytmetyczne « "d = " << d << endl.

co stoi p o lew ej stronie. O tych in n y ch operatorach p rzy p isan ia b ędziem y m ów ić w je d n y m z dalszych parag rafó w . najlepszy d o w ó d . . U ży w an ie tych o p erato ró w nie przy sp arza żadnych kłopotów . Jest ich kilka rodzajów .2. N astąp i w ów czas niejaw na z am ian a ty p u wartości p rzy p isy w an ej na ty p zgadzający się typem tego.porozmawiamy kilka stron dalej (str. ż e rezu ltat ich pracy jest ty p u b o o l (prawda lu b fałsz). P rzy k ład o w o : int a. O peratory 101 O peratory logiczne M o że się zd arz y ć.14 — czy li 3 — i to też zo b aczy m y na ekranie. O p e ra to ry lo g ic zn e Po operatorach arytm etycznych pora na o p erato ry logiczne. a = 3. w trakcie kompilacji tej instrukcji.Rozdział. może jednak dobrotliwie wypisać nam ostrzeżenie.14. przypominające o utracie części danych (przecież gubimy tu 0. że naprawdę zależy nam na tym "obcięciu" kawałka liczby . n a stą p i tu zam ian a (m ów im y konwersja) typu zm ien n o p rzecin k o w eg o na typ i n t .14). 114). Łączy je to. Troskliioy kompilator. cout << a. 760). O konw ersjach b ęd ziem y jeszcze m ów ić w osobnym rozdziale (str. ż e obchodzi się b ez nich m atem atyka. O to p rzy k ład : i f (a > 5) { . Jak to zrobić jawnie.1 Operatory relacji O p erato ry < m niejszy niż <= m niejszy lu b rów ny > w iększy niż >= w iększy lub rów ny są o p eratoram i relacji. Po prostu zo stan ie w zięta pod u w a g ę tylko część całkow ita liczby 3. ż e p o obu stro n ach o p erato ra p rz y p isa n ia stać będą a rg u m e n ty ró żn eg o ty p u . M o żn a się bez nich obejść. 4. w w yniku których otrzym ujem y o d p o w ie d ź typu: prawda lub fałsz. że istnieją jeszcze inne o p erato ry p rzy p isan ia specyficzne d la języków C i C++. Konwersja taka nastąpi niejawnie (bo nie wyraziliśmy takiego życzenia). czyli jak powiedzieć kompilatorowi. W arto w spom nieć. Z drugiej strony jednak b ard zo u łatw iają życie.

zam iast d w ó ch znaków = = . . czyli p rz e z instrukcję i f trak to w a n e jest jak o w y n ik „ prawda“ i tym sam ym w y k o n y w an a jest instrukcja 0 .. cout << "Sprawdzam ze: a= " << a << " b= " << b. // © Po wykonaniu tego fragmentu programu na ekranie ujrzymy Dane sa: a= 5 b. Z d ru g iej jednak stro n y nie został p o p ełn io n y żad e n błąd sk ład n io w y . cout « "Dane sa: a= " << a << ” b= " « b.102 Rozdz. że p rzy p isan ie to nie tylk o p rzy p isan ie.. else cout << "\nNie zachodzi równość \n".. b = 100. R ezultat takiej pomyłki m ożem y prześledzić na następu­ jącym przykładzie int a = 5. W iem y już z poprzednich p arag rafó w . Po p ro stu zam iast d z ia ła n ia i f (a == b ) .. (Nie ma tam w środku spacji).. ż e zam iast p o ró w n a n ia nastąpiło p rzy p isan ie (podstaw ienie) p rzek o n u je nas re z u lta t w y­ p isa n y n a ek ran instrukcją © . Z n iszczy liśm y sobie p rzez n ieu w ag ę w artość zm ien n ej a. ale w d o d a tk u sam o w y rażen ie przy p isan ia m a w artość ró w n ą w artości będącej p rzed m io tem przypisania . o d p o w ia d a zapisow i i f (100). O tym . iż o p erato r == składa się z dw óch stojących obok siebie zn a k ó w ' = '. //tu n a stę p u je fa ta ln a lin ijka if (a = b) cout << "\nZachodzi równość \n". N astęp n y m i operatoram i tego typu są operatory == jest rów ny != jest różny od Z au w aży ć należy.100 Zachodzi równość Sprawdzam ze: a= 100 b= 100 Dlaczego tak się stało ? O tó ż w instrukcji if O z am iast porów nania (o p erato r = = ) zap isaliśm y p rzy p i­ san ie (op erato r = ) . O peratory O peratory logiczne cout << " a jest wieksze od 5".czyli w naszym p rz y p a d k u zap is if(a = b ) . Jest b ard zo częstym błędem om yłkow e postaw ienie tylko jednego . 100 je st ró żn e od zera.. 4.

że najczęściej kompilatory mają wtedy rację.czyli operację logiczną I (koniunkcja) N a przykład: int k = 2.su m ę logiczną . 4... Jeśli jednak naprawdę chcesz w takiej instrukcji dokonać przypisania (a nie porównania). Tak na w szelki w y p ad ek .2 Operatory sum y logicznej | | i iloczynu logicznego && O p erato ry te realizują II . co chcieliśmy.iloczyn logiczny . to w tedy. if((x = y ) ) .. i f (a).2. O peratory 103 O peratory logiczne w y k o n aliśm y a = b. . g d y p rz y sp raw d zan iu w aru n k u i f znajdą tam operację przypisa­ nia. if( (m > 10) && (k > 0) ) I jk o n iu n k c ja { ■ cout << "Hurra! m jest wieksze od 10 " << "i równocześnie k jest " « "wieksze od zera ! \n". że obliczanie wartości w yrażenia logicznego o d b y w a się w ten sposób. jed n ak troskliw e ko m p ilato ry ostrzegają p ro g ram istę.czyli operację logiczną LUB (altern aty w a) && .. Przekonasz się. J e d n a k są sytuacje.Rozdział. Z a te m w naszym p rz y k ła d z ie zrobiliśm y nie to. . to unikniesz tych ostrzeżeń kompilatora umieszczając swoje przypisanie w dodatkowym nawiasie. ) W P rzy p o m in am . C h cem y bow iem zyskać na czasie w ykonania sto su jąc zam iast d w ó c h instrukcji jedną. Jest to sk ładniow o p o p raw n e. P rzy k ład na koniu nkcję: int m = 22. k =77. a n ie p o ró w n an ia. g d z ie chcem y w instrukcji i f takiego w łaśnie przypisania. . że w ynik „ prawda" daje rezultat 1. a w y n ik „fałsz" d aje re z u lta t 0. if ( (k == 10) || (k == 2) ) H a lte r n a ty w a { cout « "Hurra! k jest równe 2 lub 10 ! 1 co czytam y: jeśli k ró w n e jest 10 lub k rów ne jest 2. .

że chciałeś być taki sprytny i upiec p arę pieczeni na jed n y m ogniu: int i = 6. O to p rz y k ła d y jak u żyw am y takiego operatora: int i = 0.. 4. Jeśli w w yrażeniu: i f ( i II (k > 4) ) { // .co by tam dalej nie zostało obliczone . 4. bool gotowe. D obrze pam iętać. W y d aw ać by się mogło. Kompilator oszczędza sobie więc pracy. na co m oże tak liczyliśmy. że wykonujesz operacje logiczne. 1 p ie rw szy człon alternatyw y (zm ienna i ) jest ró żn y od 0 (czyli „prawda").czyli operator negacji O p e ra to r negacji jest operatorem jed noargum entow ym . dopóki na p ew n o nie wie..zw iększyć go o 1. a jeśli pierw szy czynnik koniu n- kcji nie będzie praw dziw y. by p rz y okazji p racy na obiekcie d . N ie m a bo­ w iem dalszej potrzeby: . if (! i) cout << "Uwaga. P o d o b n ie jest w przypadku alternatyw y.2. bo i jest równe zeroNn". Już w tym m om encie w iad o m o . O perator ten ma postać ! (w y krzyknik) !i P o w y ż sz e w yrażenie ma w ted y w artość „praioda". dalsze obliczanie zostanie przerw ane. to ko m p ilato r uzna już. to d alsze obliczenia nie są ju ż konieczne. jaki będzie wynik. g d y i jest rów ne zero.3 W ykrzyknik ! .. Jego a rg u m e n t stoi p o p raw ej jego stronie. że altern aty w a ta jest spełniona. że nie opłaca się zajm ow ać dalszym i. O znacza to. . d = 4. A jednak przy d aje się to. że nie m usim y o tym w szystkim w iedzieć.104 Rozdz. O tó ż jest to pułapka.. to jeszcze chciałbyś.. bo jeśli pierw szy człon koniu nkcji nie będzie p ra w d z iw y . i f ( (i > 0) && (d++) ) { cout << "warunek spełniony !" ) N ie dość. W yobraź sobie. że kompilator oblicza wartość w yrażenia dotąd. W ten sposób nie d o jd zie do w ykonania w yrażenia d++. że w w yrażeniu (a == 0) && (m == 5) && (x > 32) kom pilator obliczał będzie od lewej do prawej.. O peratory O peratory logiczne W yrażenia logiczne tego typu obliczane są od lewej do praw ej.i tak koniu nkcja nie m oże być już praw dziw a.

że słowo bił jest skrótem od angielskiego binary digit (cyfra dwójkowa K o m p u ter nie o d n o si się d o każdego z takich bitów osobno. Jak po w szech n ie w iad o m o . Inni mówią. O to lista operatorów bitow ych: « p rzesunięcie w lewo » p rzesunięcie w praw o & bitow y iloczyn logiczny (bitow a koniunkcja) I bitow a su m a logiczna (bitow a alternatyw a) A bitow a różnica sym etryczna (bitow e exclusive OR) ~ bitow a negacja W nazw ach tych o p erato ró w przewijają się słow a „bitow y".w k o m p u terze inform acje (liczby i znaki) zak o d o ­ w a n e są w poszczególnych kom órkach p am ięci za pom ocą ró żn y ch kombinacji z e r i jedynek. 4. b it- kaw ałek). G ru p u je je w w ięk sze jednostki zw a n e słow am i. i f (! gotowe) { cout « "jeszcze nie gotowe !\n". Z ak ład am . które są ch arakterystyczne d la tego specyficznego sposobu prze­ ch o w y w an ia inform acji w ko m p u terze .m am y też inform acje logiczne: podwozie schowane lub nie. jak w kokpicie sam olotu oprócz inform acji liczbowych o w ysokości.jak im jest zapis b in arn y . O św ietlenie sam o lo tu włączone lub nie. ró żn e m ogą być ro zm iary takich słów . To tak. W . Te elem en tarn e jednostki inform acji nazy w an e są b itam i (ang. operatorach logicznych. Jednak nie w szystko w k o m p u terze m usi oznaczać liczby. prędkości. Do p racy na tak um ieszczonej inform acji słu żą nam w łaśnie o p erato ry bitowe. K o m p u ter p rzetw a rz a cale słow a. Z ależnie o d kom putera. w znoszeniu itd. czas teraz na op erato ry . gdzie o b iek t typu s h o r t i n t k o d o w an y jest na 16 bitach. D latego w przykładach ilustrujących zastosow anie tych o peratorów b ę d z ie m y p o k azy ­ w ali jak działają one n a poszczególne bity. „ b ito w a ". Słow o jest jed n o stk ą informacji p rz e tw a rz a n ą p rzez ko m p uter. . W ko m p u terze inform acje takie m ożna zeb ra ć i um ieścić raze m na poszcze­ gólnych bitach jed n eg o słow a pamięci. w których zw y k le zap isan e są liczby. C zyli z szesnastu z e r lu b jedynek. że m am y d o czynienia z kom puterem . ) L3 O p e ra to ry b ito w e M ów iliśm y o o p erato rach arytm etycznych. Przykładow o: słow o w k om puterze k la sy IBM P C /A T sk ład ało się z kom binacji szesnastu bitów. O peratory 105 O peratory bitowe gotowe = false.Rozdział.

to są rzeczyw iście te sam e sym bole. short int w. zm ienna « ile_miejsc Bierze on w zór bitów z a p isa n y w danej zm iennej. C zęsto ch o d zi nam o to. Bity z p raw eg o brzegu słow a u zu p ełn io n e zostają zeram i. w = a << 3. b y p rzesu n ąć bity d an ej zm iennej. P rzy k ład o w o na skutek takiej instrukcji short int a = 0x40f2. W ro zd ziale o tzw. a re z u lta t m a się z n aleźć z pow rotem w tej zm iennej. gdy p o obu stronach sym bolu « lub » stoją arg u m en ty typu całkow itego.3. n astęp u je przesunięcie o trz y miejsca w lewo. 4. To nic tru d n eg o : a = a << 3. jak w yglądają po szczeg ó ln e obiekty. O p erato ry przesunięcia są rzeczyw iście op erato ram i przesunięcia w sytu acjach. O peratory O peratory bitowe Dygresja: operator« (wypisujący na ekran) oraz operator» (wczytujący z klawiatury) Sym bole operatorów przesunięcia w lewo i w p raw o przypom inają n am p o zn a­ ne w cześniej operatory. to operatory te oznaczają przesy łan ie informacji z klaw iatu ry . przesu w a go o ż ą d a n ą ilość m iejsc w lew o i jako re z u lta t zw raca ten n o w y w zór. O to . a 0100 000011110010 w 0000 0111 10010000 Sam o b ie k t a nie został zm ien io n y .106 Rozdz. 4. którym i posługujem y się do w ypisyw ania na ekran i w czytyw ania z klaw iatury. o którą chodzi. (N awet tak ie rzeczy da się robić w C++ !) N ie m a jednak ryzyka nieporozum ień. Bity z lew eg o brzegu zostają zg u b io n e. R e z u lta t został złożony w zm iennej w. Ta pożyczka nastąpiła dlate­ go. lub na ekran. Z g a d z a się. ż e w ygląd o p erato ró w « i » dobrze su g eru je akcję. Posłużył on ty lk o jako w artość p o czątk o w a. Dla łatwiejszej orientacji poszczególne bity słow a z g ru p o w a łe m w czw órki. p rzeład o w an iu operatorów d o w iesz się jak łatw o sam em u dla sw oich w łasnych celów robić takie pożyczki. P rzez bibliotekę w ejścia/w y jś­ cia zo stały one tylko w ypożyczone.1 Przesunięcie w lew o « Jest to d w u arg u m en to w y op erato r pracujący n a argum entach (operandach) typ u całkow itego. cout << "podaj liczbę: cin >> x. . Jeśli arg u m en tem z lew ej stro n y jest c i n lub c o u t .

unsigned short int d = 0x0ff0.jako się rzekło . na k tó ry m p racu jem y . signed short int d = 0xff00. by ograniczyć się do wypisywania tu 16 bitów. jak w ted y w y g ląd a rozkład bitów: d 0000 1111 U l i 0000 r 0000 0001 1111 1110 Je d n a k jeśli pracuje o n na danej ty p u s i g n e d (ze znakiem ) i je st ta m liczba u je m n a.p o k azu jem y tu d w a w a ria n ty : . signed short int r. Gdybym użył w tych przykładach obiektów typu i n t . co o d ró ż n ia go od o p isan eg o wcześniej kolegi: zachow anie p rz y u zu p ełn ian iu b itó w z lewej strony. To jest g w a ra n to w a n e . ale d a n a zm ien n a m ieści w so b ie ak u rat liczbę nieujem ną . Bity z p ra w e g o brzegu w y ch o d zące p o za z a k re s słow a są gubione. r = d » 3.w ó w czas bity z lew eg o brzegu są u zu p e łn ia n e zeram i. Jest tu jednak coś. to rezu ltat m o ż e zależeć od typu k o m p u tera. p rzesu w a g o o żą d a n ą ilość m iejsc w p raw o i jako re z u lta t zw raca ten n o w y w zór. jak w tedy w y g ląd a rozkład bitów . r = d >> 3. O peratory 107 O peratory bitowe (N ieb aw em p o zn am y jeszcze lepszy sp o só b na to: operator <<= ). M o że nastąpić u z u p e łn ia n ie brakujących z lew ej stro n y bitów z e ra m i. unsigned short int r. a m o ż e jed y n k am i.Rozdział. To . O tóż: jeśli n asz op erato r p ra c u je na danej • u n s i g n e d (bez znaku) lu b • s i g n e d (zeznakiem ). że pokazuję tu działanie tego operatora na przykładzie obiektów typu s h o r t i n t po to. O to . 4.musiałbym tu pisać 32 bity. Przesunięcie w prawo » Jest to dw u a rg u m e n to w y operator pracujący na arg u m en tach (operandach) ty p u całkow itego zm ienna » ile_m iejsc B ierze on w zó r bitów zap isa n y w danej zm ien n ej. O to.zależy ju ż o d ty p u k o m p u tera. a działo się to w komputerze 32 bitowym . Przypominam.

d. c.108 Rozdz. różnicy sym etrycznej Te d w u a rg u m e n to w e o p erato ry także działają na arg u m en tach całkow itych.VJX$ : short int m 0x0fOf. gdzie poszczególne bity mają dla nas jakie.0 postąpi tak. jak to pokazuje linijka z r '.3. jak wyglądają poszczególne obiekty.3 B itow e operatory sum y. przechowuje się ją w obiektach typu u n s ig n e d . Dane wejściowe i wartość wyrażeń: m oooo n u oooo n u k 0000 1111 1111 0000 m & k 00001111 0000 0000 bitow a k o n iu nkcja m | k 0000 1111 1111 HU bitow a a lte rn a ty w a 1111 0000 1111 0000 bitow a negacja m A k 0000 00001111 1111 bitow e exclusive or W z a s a d z ie sp raw a jest jasn a i n ie w y m ag a k o m e n ta rz a . // iloczyn bitowy b = m |k. (Znow u d la upro szczen ia o g ran iczy m y s it d o 16 bitow ych obiektów s h o r t i n t ) . / / negacja bitów d = m A k. / / różnica symetryczna (XO R) b itów A oto. O peratory O peratory bitowe d 1111 11110000 0000 r 0001 1111 1110 0000 r' 1111 1111 1110 0000 N a p rzy k ład kom pilator Yisual C++ 6. 4. Czyli nie jest to informacja "arytmetyczna". b. K3P U w aga: Nw musisz się tego wszystkiego uczyć na pamięć z prostego powodu przesuwanie bitów raczej nie jest stosowane do pracy z obiektami typu s ig n e d Stosuje się je raczej do obiektów. jfT&wotn short int a. Il iA t short int k 0x0ff0. Ich d z iałan ie zilu stru jem y poniżej. / / s u m a bitowa c = ~m. iloczynu. P o d k reślić należ] je d n ak . 4. a = m 4 k. Skoro tak. ie. specjalne znaczenie. a z nimisprawa jes\ prosta. niezależna od implementacji: bity z lewej uzupełniane są zerami już. negacji. jaka jest: .

y Natomiast operatory bitow e np. W przypadku operacji logicznych.4 R ó ż n ic a m ię d z y o p e ra to ra m i lo g ic z n y m i. czyli np. logiczne O p erato ry bitow e && & 11 1 P am iętajm y .Rozdział. R ezultatem jest 0 lub 1 i ten re z u lta t w staw iają d o p ie rw szeg o bitu zm ien n ej w ynikow ej. p rzy g o to w ałem d w a ry su n ­ k i jeszcze raz ilustrujące różnicę m iędzy o p erato ram i logicznym i. otrzym ujem y w ięc w ynik będący słowem o specyficznym układzie bitów. m & k z a g ląd ają d o w n ętrza d a n e g o słow a. S p ra w d z a o n tylko czy jest tam w artość ró w n a zero. W reszcie na tych d w ó ch w artościach ty p u „prawda" lub „fałsz" dokonuje k o n iu nkcji. W n aszy m ostatnim p rzy k ła d zie w y rażen ie m & k m ożna z in te rp re to w a ć jako liczbę 3840 M o żesz się o tym p rzek o n a ć w ypisując w arto ść w yrażenia: cout « (m & k ) . a o p e ra to ra m i b ito w y m i i d ru g iej k o lu m n y p o n iższej tabeli O p erato ry . ko n iu n kcja logiczna) jest w ynik „p ra w d a t “ lub J a łs ź '. . że w yn ikie m d z ia ła n ia zw ykłe g o o p e ra to ra logicznego (np.i n a tych bitach w y k o n u ją operacji koniunkcji. N a stęp n ie to sam o z d ru g im bitem i w szy stk im i dalszym i. W rezultacie działania operatora bitowego. d la teg o te bitow e o p e ra to ry p rzy p o m in ają o p erato ry arytm etyczne. m && k k o m p ilato ra nie in teresu je rozkład bitów w zm iennej m czy w zm iennej k. W ynikiem jest 1 lubO (czyli „prawda" lu b „fałsz" ). To sam o z d ru g im arg u m e n tem . N a p o szcze g ó ln y ch p o je d y n c z y c h bitach ty c h słó w d o k o n u ją o p e ra c ji k o n iu n k c ji. T ak i w y nikow y u k ła d b itó w m ożna in terp reto w ać jako liczbę. czyli wynikiem jest słow o z zapisaną tam wartością 1 lub 0. W D la czytelników . 4. czy ró żn a od zera. a b ito w y m i. O peratory 109 Różnica między operatoram i logicznymi a operatoram i bitowymi . Czyli biorą p ie rw szy b it z jednej zm ien n ej i p ierw szy b it z drugiej zm iennej . k tó rzy są bardziej w zrokow cam i.

128). XI. G dybym był asystentem p ro w ad zący m zajęcia z C++. 4-2 16 operacji na poszczególnych bitach ▼tftłttttTfttttt & k |olo|o|o|ili|i|i|o|o|o~[oio o|o|o Rezultat (typu s h o r t in t) Jest b ard zo w ażne. czy to zagadnienie o p an o w ałeś (Ćwicz. byś d o b rze zrozum iał różnicę m ięd zy o p erato ram i b ito w y mi. jednak d la w y g o d y m am y jeszcze dq dyspozycji następujące operatory: T= x— >>= << . Zajrzyj d o ćw iczeń na ko ń cu teg< ro zd ziału .5 P o zo s ta łe o p erato ry przypisan ia Z p arag rafe m tym czekałem d o tej pory. 4. m im o że jest banalnie prosty. str. O peratory Pozostałe operatory przypisania Tak zatem w ygląda schem atycznie operacja logiczna m && k Rys. 4. t< byłoby to jedno z p y tań na kolokw ium . jak schem atycznie w y g ląd a to przy operacji bitowej m & k Rys.jest tam zad an ie spraw dzające.110 Rozdz. 4-1 ________ 1) Zamiana na wartość logiczną i|i|tli!o|o|o[ą 2) Operacja logiczna Rezultat (typu b o o l) A oto. P oznaliśm y już wcześniej o p erato r przypisania (p o d staw ien ia) = W za sa d z ie m oże on nam w ystarczyć. a logicznym i.

jeśli w yrażenie to m a jakieś d ziałan ie uboczne (np. to tak. mm■■mmmmmm . . 4. 1 C iekaw ostka: W system ie d zie sią tk o w y m jeśli zapis liczby całkowitej p rzesu n ie m y o jedno m iejsce w lewo. Kto zrozum ie z a sa d ę w pierw szej linijce. inkrem entacja). Jeśli się p o m y lisz i napiszesz odw rotnie i =-2. jakbyśm y pom nożyli tę liczbę przez 10. a czasem na inną. O peratory 111 W yrażenie w arunkowe Ich d ziałan ie jest b a rd z o proste . bo analogie narzucają się sam e.i s. I tak: i += 2 oznacza i i + 2 i -= 2 oznacza i = i . O to jego forma: warunek ? w artości wartość2 Przykładow o: . więc przesu nięcie o jedno m iejsce (jeden bit) w lewo . to zrobisz postaw ienie liczby -2 do zm iennej i . N a przykład: 12 <— o ry g in a ln a liczba 120 <. 2 i 1= 2 oznacza i —i 1 2 i A= 2 oznacza i = i A 2 A n alo g ia ta n ie je st je d n a k zupełna: jeśli i jest w yrażeniem . a nie instrukcja. nie m usi się trudzić z zap am ięty w an iem .i * 2 i /= 2 oznacza i = i / 2 i %= 2 oznacza i ss i %2 i »= 2 oznacza i = i » 2 i «= 2 oznacza i “ i « 2 i &= 2 oznacza i . to w naszym now ym zap isie jest ono obliczane ty lk o jednokrotnie (w starym .2 i *= 2 oznacza i .6 W y ra ż e n ie w a ru n k o w e Pow tarzam : wyrażenie. Jest to w yrażenie.oznacza pom nożenie przez 2. Przesunięcie o 5 b itó w w lew o oznacza (szybkie) pom nożenie przez 32 (bo 32 = 2 * 2 * 2 * 2 * 2). iż znak ró w n o ści następuje jak o drugi.Rozdział. Zwracam też uwagę.p r z e s u n ię c ie o jed n o m iejsce w lew o 1200 <— p r z e s u n ię c ie o d w a m iejsca w lew o P oniew aż w pam ięci k o m p u tera liczby przechow yw ane są nie w zap isie d zie­ siątkow ym .dw a razy). M oże to mieć znaczenie. ale w zap isie dwójkowym. które o bliczane jest czasem na taką w artość. że te operatory w yglądają tak. // c z y li i = -2.po k ażem y to na przykładzie.

gdy a jest różne od 0 "N IE " . a liczba 12. albo in n y m C -stringiem (jeśli w olisz: stalą tekstow ą). do zm iennej c zostanie podstaw iona liczba 5. w y rażen ie to jako całość m a w artość "tak" . ♦> Jeśli w arunek jest spełniony — to w artość w yrażenia wynosi 15 ♦> Jeśli zaś nie spełniony — wartość tego całego w yrażenia w ynosi 10 Jak zauważyłeś. prawda ? Komentarz O Tutaj tk w i to w yrażenie w aru n k o w e. O to in n y prosty przykład: #include <iostream> using namespace std. czy z m ien n a ajest zero w a czy niezerow a. jeśli x nie jest większe od y . . to napisz 1 \n" « "jeśli NIE to napisz 0 \n" « " Rozumiesz ? Odpowiedz: Musisz odpowiedzieć TAK lub NIE jeśli TAK. W yrażenie w arunkow e jest bardzo w ygodne. jeśli rzeczyw iście x jest w iększe od y. c * (x > y) ? 5 : 12. O peratory W yrażenie w arunkowe w y rażen ie to (jako całość) w zależności od spełnienia lub niespełnienia w aru n k u ( i >4) przyjm uje różną wartość.gdy a jest równe 0 Z au w aż . ż e w naszym p rz y p a d k u w artość w y ra ż e n ia nie jest tu w cale liczbą. W zależności od tego. ten w a r u n e k umieściłem w nawiasie (mimo że nie jest to wymagane). to napisz 1 jeśli NIE to napisz 0 Rozumiesz ? Odpowiedz: 1 Odpowiedziałeś: TAK. bo daje się "zapakować" d o w n ętrza innych w yrażeń np. 4. Z/***************************'************ ★ **★ ***★ **★ **★ **★ * int main() { int a. cout << "Musisz odpowiedzieć TAK lub NIE \n" « "jeśli TAK.112 Rozdz. tylko alb o takim .

jaką p rzestrzeń rezer­ w uje k o m p ilato r na danej m aszy n ie dla obiektu typu int dow iedzieć się m ożem y używ ając w łaśnie teg o operatora. o d p o w ied ział 33. to nie m a problem u - sp raw d zan y jest p rzec ież w arunek czy a jest równe. C++ p o zw ala użytkow nikow i na w ym yślanie sobie w łasnych typów obiektów . O to przykład zastosow ania: #include <iostream> using namespace std. b y w iedzieć ile pam ięci m aszyny zajm uje obiekt takiego now o w y m y ślo n eg o typu.7 O p e ra to r sizeof O perato r sizeof jest to w ygodny o p erato r. Często w ażne jest. z a m ia s t odpow iedzieć 1. ł. 4.Rozdział. że w k ró tce bardzo je polubisz. Jest to w ażne z d w ó ch pow odów : ♦> Te sam e ty p y obiektów (np. P rzykładow o: o tym .zapisane jest w pliku nagłówkowym <cstddef> . W M oże na p ierw szy r z u t oka om ów ione w y rażen ie w aru n k o w e w ydaje się trochę m ało czytelne. O peratory 113 O perator s i z e o f 0 G dybyś tutaj. czy różne o d zera. R ezultat będ zie taki sam jak b y ś odpow iedział: 1. W tym komputerze " << "poszczególne typy\n" 1) ang. (B ędziem y o tym m ów ić w późniejszych rozdziałach). s i z e o f I s o tn e th i n g ] . cout << "Godzina prawdy. który p ozw ala nam rozpoznać zachow ania k o m p ilato ra i kom putera.Co to oznacza w Twoim kompilatorze . O perato r ten stosuje się w ten sposób sizeof (nazwa J y p u ) albo sizeo f (nazwa_obiektu ] t 2 w rezultacie o trzy m u jem y rozm iar obiektu danego typu p o d a n y w bajtach.rozmiar (czegoś) [czytaj: „sajz of") 2) Dla wtajemniczonych: Rezultat operatora sizeof jest stałą ("bezznakowego”) typu s ize t. z k tórym i przyszło n am pracować. zm iennych) m ogą mieć w różnych im ple­ m entacjach ró ż n e wielkości. g d y ż zaoszczę­ d zi Ci pisania. int main() { int mm. Jed n ak zobaczysz.

jed n ak m o­ żesz się z nim i spotkać analizując cudze p ro g ram y . typ i1 typ int: 4 typ short: 2 typ long: 4 typ float: 4 typ double: 8 typ long double: 8 Nasz obiekt lokalny mm ma rozmiar: 4 4 . W łaściw ie w ięc o tych tradycyjnych p o w in n iśm y zapom nieć. W d a w n e j w ersji języka C++ m ieliśm y już do dyspozycji o p eratory rzu to w an ia.3 2 bity) na ekranie ujrzymy tekst: Godzina prawdy. W rezultacie wykonania tego programu na komputerze z kompilatorem pracującym "32-bitowo" (rezerwującym dla obiektu i n t .jaw nego p rzekształcania typu.114 Rozdz. cout << "typ long: \t" << sizeof(long) << endl.8 O p e ra to ry rzu tow an ia P ozn am y teraz operatory rzu to w an ia. « ena cout << "typ long double: \t"« sizeof(long double) « endl. Wystąpi tu parę pojęć. cout << "typ float: \t" « sizeof(float) « endl. To jest w zasadzie końcówka tego rozdziału. W tym. D latego m usim y o nich porozm aw iać. Nie przejmuj się jeśli nie wszystko tutaj potrafisz sobie jeszcze wyobrazić. więc możemy zatrzymać się nieco nad tym zagadnieniem. Są to operatory jednoargum entow e. bardziej su b teln e o p era­ tory. O peratory O peratory rzutow ania « "maja następujące rozmiary w bajtach: \n". komputerze poszczególne typy maja następujące rozmiary w bajtach: ___ char:. . ż e biorą w y rażen ie (lub obiekt) jakiegoś typu i jako re z u lta t zw racają w y rażen ie (lub obiekt) in n eg o typu. cout « "typ char: \t" << sizeof(char) << endl. P ozw alają one rzutow ać w łaściw ie "wszystko n a w szystko". wy rażenie typu c h a r na d o u b le itp. 4. w ięc stan d ard do d ał tu now e. albo inaczej . cout << "typ short: \t" « sizeof(short) << endl. O k azało się to jednak z b y t drastyczne. D ziałają one w ten sposób. cout « "Nasz obiekt lokalny mm ma rozmiar: << sizeof(mm) << endl. Innymi słowy operatorami takimi możemy przekształcić na przykład wyra zenie typu f l o a t na i n t . cout << "typ int: \t" << sizeof(int) << endl.siłą rzeczy do tych spraw musiel będziemy wrócić w stosowniejszych miejscach. o których zasadni­ czo rozmawiać będziemy nieco później . cout << \t" « "typ double: \t << sizeof(double) << endl.

Rozdział. Była w nim już okrojona zaw artość o b iek tu du ży.8. 782). że w danej instrukcji nastę­ p u je ryzyko u traty p ew n ej części informacji pow inien nas ostrzec. Jeden jest ty p u i n t . O strzeżenia w tedy nie będzie. d lateg o w rezultacie w obiekcie m a ły znajdzie się następ u jąca wartość: O xff . C o zrobił operator rzu to w an ia ( c h a r ) ? «$♦ W ziął w y rażen ie d u ż y (czyli obiekt typu i n t o n azw ie d u ż y ) i jako rezu ltat zw ró cił obiekt chw ilow y ty p u c h a r . m am y tu d w a obiekty różnego ty pu. Po co więc tu operator rzutowania? O d p o w ied ź jest prosta: D obry kom pilator w idząc. T en (chwilowy) o b iek t typu c h a r p rzy p isan y zostaje do (stojącego po lewej stro n ie operatora p rzypisania) innego obiektu c h a r o n azw ie m a ły . d rugi typu c h a r . Gdybyśmy nie zastosowali operatora rzutowania. mały = (char) duży. Kompilator widzi przecież.napotykając go . O strzeżenie tak ie pow inno pojaw ić się w trakcie kom pilacji tej instrukcji pro g ram u . 4. że zamierzamy tu przelać zawartość wielkiego garnka do małego. Jeśli n ato m iast jawnie zastosujem y w tym miejscu o p erato r rzuto­ w ania. W trzeciej lin ii następuje operacja przy p isan ia (rzutow anej) w artości obiektu i n t do o b iek tu c h a r . (Czyliprzypisać wartość obiektu intdoobiektu char). char mały. Jak w idać.uzna. . Z obaczm y to na p rzy k ła d zie int duży = Oxffff. na razie lepiej jako zasad ę p rzy jąć stosow anie fo rm y pierwszej. O krojona d o rozm iaru c h a r . kiedy której z tych dw óch form użyć. to kom pilator . to owo przypisanie także by nastąpiło (także ze stratą). T akie przypisanie zaw artości obiektu ty p u i n t do obiektu typu c h a r m usi spo w o d o w ać u tratę b ardziej znaczących bitów .1 R zutowanie w ed łu g tradycyjnych (nie zalecanych) sp osobów O p erato r rz u to w a n ia (na inny typ) m oże m ieć d w ie form y (nazwa_innego_typu) wyrażenie w zg lęd n ie nazwa_innego_typu (wyrażenie) O tym . P oniew aż obiekt typu c h a r nie pom ieści całej inform acji zaw artej w obiekcie typu i n t . Inform acja zostaje okrojona do m niej znaczących 8 b itó w (tyle bitów m a d o dyspozycji obiekt typu c h a r ). że zap ew n e posta­ wiliśm y g o tam św iadom ie (czyli św iadom i jesteśm y u traty bitów). O peratory 115 O peratory rzutow ania 4. p o ro zm aw iam y w przyszłości (str.

to naprawdę jest coś innego. jeśli o g arn ie Cię gorączka rzu to w an ia. N ie poznam y teraz o nich całej p ra w d y . na jaki in n y ty p m a nastąpić rz u to w a n ie d an eg o w yrażenia. Aby złagodzić tę broń m asow ego rażen ia. O peratory O peratory rzutow ania O peracja rzutow ania (czyli jawnej konwersji typu) to b ard zo drastyczna o p era­ cja. k tó re w y stąp ią d o p ie ro w dalszych ro zdziałach. Do nich w p isu jem y .116 Rozdz. jak m o żn a dokonyw ać rzu to w a n ia w ed łu g tradycyjnych sposobów . Jest bardzo niew iele takich sytuacji. P oro zm aw iajm y kolejno o tych operatorach rz u to w a n ia . że obiekt jest jakiegoś typu. 4. a rzutow aniem polecam y kom pilatorow i m im o w szy stk o potraktow ać d a n y obiekt inaczej. n ajp raw d o p o d o b ­ niej po p ełn iłeś jakieś zasad n icze błędy w w ym yślaniu sw ego p ro g ram u . W tak ich miejscach program iści robią najwięcej błędów . jako ro d zaj u w e rtu ry . s t a t i c _ c a s t <nazwa_innegojtypu > ( wyrażeńie) c o n s t _ c a s t < nazwa_in negojtypu > (uryrażeń ie) _ - d y n a m i c _ c a s t <nazwaJnnego_typu> (wyrażenie) r e i n t e r p r e t _cast<nazwa_innegoJypu> (wyrażenie) W p o w y ższy ch zapisach w id zisz tak zw ane ostre nawiasy (czyli zn ak i w ięk szo ­ ści i m niejszości).2 R zutowanie za pomocą nowych operatorów rzutowania P o k azan e pow yżej operatory rzu to w an ia m ogą w łaściw ie rzutow ać "w szystko na w sz y stk o ”. bo często o pow ieść w ym agałaby w ie d z y o zag ad n ien iach .8. P o trak tu jm y w ięc opis tych o p erato ró w . R zu to w an ia używ a się rzad k o . C oś jakby rodzaj oszustw a. . że to. co widzi. a nagle każemy mu tego zaniechać i wmawiamy mu. 4. Przecież w deklaracji obiektu m ów im y. bo (na ich w łasną prośbę) czujne oko kom pilatora nad nimi chw ilow o nie czuw a. Z obaczyliśm y więc. Do tej pory kompilator skrupulatnie sprawdzał nasze instrukcje. g d y trzeb a je zastosow ać. Zatem . Teraz rzu to w an ie zaleca się robić inaczej. now y s ta n d a rd daje nam d o ręki specjalne operatory.

a jeśli m am y troskliw y kom pilator. takie konw ersje mają jakiś sens m atem atyczny. to pracując nad tą linijką. gdy konw ersja i tak by nastąpiła.jak om aw iana w łaśnie konw ersja liczby zm iennoprzecinkow ej na liczbę całkowitą. m = pi. gdyż taka jest część całkow ita liczby 3. ♦♦♦ Są w śród nich takie "bezpieczne" konw ersje .Rozdział. W n aszy m p rzy p ad k u . ż e rzutow anie łączy się zaw sze z p rzy p isan iem . w ypisze on nam ostrzeżenie o "stratności" tej konwersji.9. ż e w łaśnie o konw ersję n am chodziło. ale najpierw p o d d ajem y ją rzu to w an iu na typ int. . Robim y to pisząc jaw nie o p erato r rzutow ania m = static cast<int>(pi). 0 Żebyś nie m yślał. M ożem y jednak u p ew n ić go.14 O pisany tu o p erato r służy w łaściwie do pozbycia się ostrzeżeń kom pilatora. O statnia z tych instrukcji pow oduje p rzy p isan ie w artości obiektu zm iennoprze­ cinkow ego d o o b iek tu całkowitego. Oto co pojawi się na ekranie: obcięta do części całkowitej wartość pi = 3 oryginalna wartość pi = 3. Do takich konwersji należą tak zw an e konw ersje standardow e.8. int m.14 N astąpi tu tak z w a n a niejaw na konw ersja. 4. że w łaśn ie o to obcięcie części ułam kow ej nam chodzi. (Będziemy o nich bliżej mówić w paragrafie 9. R ezultat tego rzutow ania zostaje d o p ie ro p rzek azan y stru m ien io w i cout do w ypisania na ekran. w sytuacjach. N ie w ypisujem y jednak tej w artości tak po prostu. C h odzi tu o pokazanie na ekranie w artości o b ie k tu .jak zam ian a liczby całko­ witej 1 na liczbę zm iennoprzecinkow ą 1. (bo jest m ożliw a). O peratory 117 O peratory rzutow ania 4.14. kom pilator rozum ie. na stronie 408). w obiekcie m znajdzie się liczba 3. O czyw iście najczęściej łączy się to z u tratą informacji.spójrz na tę instrukcję. M im o tej "stratności". O W idząc ten zapis. //O cout « "obcięta do części całkowitej wartość pi = " « stafcie_cast<int> (pi) // © « "\noryginalna wartość pi = " « pi « endl.0 ♦♦♦ Są też takie konwersje "stratne” .3 Operator static_cast M ów iliśm y n ie d a w n o o takiej sytuacji double pi = 3. (a nie że po prostu p rz e z zapom nienie p rzypisujem y zaw arto ść obiektu d o u b le do i n t ) .4.

X x. y = static cast<Y>(x). ż e tu w łaśn ie do k o n u jem y konw ersji. że na razie jeszcze nie rozmawialiśmy o tym. Tak jak typ samochód jest rodzajem typu pojazd.k o m p ilato r nie p o zw o liłb y na niejaw ną konw ersję x = y. D latego k o m p ila to r pow inien na w id o k takiej in stru k cji zaprotestow ać. piszącym p ro g ram . © W p r z y p a d k u tej sy tu a c ji o czy w iste j (X »-> Y). I I z a m ia s t " n ie le g a ln e g o " x = y. to d o o b u tych sytuacji konw ersji nadaje się o p e ra to r rzu to w an ia sta- tic cast. 4. Do obu . ale rzeczywiście samochód. na uspokojenie Przepraszam . że w tym konkretnym miejscu programu pod hasłem pojazd kryje się nie rowerek. że niektóre typy mogą być rodza­ jami innych. Jeśli jednak w iem y. x = static cast<X> (y) . Po prostu ten o p e ra to r p rz y p o m in a n am potem . Do tego nie potrzebna jest jawna konwersja.czyli i d o tej oczywistej i d o tej ryzykow nej. Natomiast dowolnego pojazdu nie możemy potraktować jako samochód.to aby takiej ko n w ersji d o k o n ać. że ta konwersja jest robiona na naszą wyłączną odpowiedzialność. To dlatego. to używając operatora s t a t i c _ c a s t zapewniamy kompilator. / / za m ia st le g a ln e g o y = x. z pewnych źródeł. Jeślijednakwietny.wiem. O peratory O peratory rzutow ania O g ó ln ie mówiąc: • Jeśli m am y jakieś dw a typy X o raz V • i m oże niejaw nie nastąpić konw ersja (standardow a) je d n eg o typu na d ru g i (X »-> Y). . O W p rz y p a d k u tej sytuacji ry zy k o w n ej.118 Rozdz. że n a p ew n o taka k o n w ersja m a se n s (bo zn a m y d ziałan ie n aszeg o p ro g ram u ) . Dla niewtajemniczonych. Dowolny obiekt typu samochód standardowo traktujemy jako pojazd. ale niekoniecznie odw rotnie .czyli ry zy k o w n a jest ko n w ersja (Y ~ X ). m u sim y zrobić to jaw n ie. czyli k o n w ersji (Y X) . p o sta w ie n ie o p e r a to r a s t a t i c _ c a s t służy tylko n am . a czasem nie. bo może akurat tym razem ten pojazd to rowerek "Bobo". Y y. czyli użyć o p e ra to ra static_cast. bo c z a se m m a o n a sens. że to wszystko brzmi trochę niejasno.

czyli przypisanie ad resu znajdującego się w łaśnie w e w sk aźn ik u do pojazdu . czyli używ ając operatora rzu to w an ia s t a t i c _ c a s t wsk_sam = static_cast<Samochod*>(wsk_poj). wsk_poj = wsk_sam. O peratory 119 O peratory rzutow ania K rótkie p r z y p o m n i e n i e d la w ta je m n ic z o n y c h Jak w iesz . wsk_sam = wsk_poj. ale jawnie. to oczyw iste jest. 4. ż e dokładnie w iem y. iż w tym miejscu p ro g ram u w e w skaźni­ ku w sk _ p o j n ap raw d ę jest zaw sze ad res sam ochodu. Może przecież właśnie w tej chwili w programie wskaźnik do pojazdu ustawiony jest na obiekt typu rower. niektóre obiekty mogą mieć przydom ek c o n s t . Dlatego na w szelki w ypadek kom pilator na takie p rzy p isan ie w skaźników nie pozw ala. Samochód s. Pojazd p. // błąd kompilacji! M ożliwe jednak. //o c z y w is te bo.Rozdział. 4. sam ochód to ro d za j pojazdu N atom iast o d w ro tn e przypisanie. Jeśli jesteśmy o tym przekonani.4 Operator const_cast Jak wiesz.d o w skaźnika d o sam o ch o d u . Dokładniej o takich konwersjach rozm aw iam y na str. Pojazd *wsk_poj. Jeśli m a m y hipotetyczny klasę (typ) . nie zaw sze ma sens. 935.P o ja z d i pochodzący od niego typ (klasę) S am o ch ó d . .d zięk i zw iązkom dziedziczenia . że w skaźnik d o obiektu klasy Sam ochód m o ż e zostać przypisany d o w skaźnika klasy P o ja z d .p ew n e typy m ogą być rodzajem innych. to n a w łasn e ryzyko m ożem y dokonać teg o przypisania. Samochód *wsk_sam = &s.8.

P rzecież stałą 15. że M onika u d a się d o d y re k to ra P ań stw o ­ w y ch Z b io ró w S ztuki n a W aw elu . M o n ik a z n a jakiś sekret. bo najczęściej tego o p e ra to ra u ż y w a się w obec w sk a ź n ik ó w . czyli obiektach p rzech o w u jący ch adresy.120 Rozdz.o d b ie ra jąc ten ad res - nic nie m ó w i o g w aran cji niety k aln o ści? N ie. ż e to tro ch ę niejasne . Bywają je d n ak in n e obiekty. C zy M onika m o g łab y p o w ierzy ć ten a d re s k o m u ś. T akie rz u to w a n ie m a n astęp u jącą fo rm ę c o n s t _cast<typ_bez_const> (wyrażenie o typie z const) N ie p o k a ż ę tutaj p rz y k ła d u . 321. K om u M onika p o d a te n ad res? Tylko oso­ bie. D o ch o d zim y teraz d o p o trzeb y istn ien ia o p erato ra c o n s t _ c a s t . D zięki te m u o p erato ro w i m o ż liw e jest p o d a n ie a d re s u n aw et o b iektow i. P rzek azu jąc m u a d re s tej k o ro n y . . a dba o to k o m p ilato r (p rzep raszam : z d ro w y ro zsąd ek M oniki). S p raw a je st o czy w ista .g łó w n ie d latego.1 6 . k o m p ilato r z ap ro testu je . M o n ik a trak tu je ją jak n ie ty k a ln ą św iętość.takiego.6. p rzy to czę ta k i obrazek. a o nich jeszcze nie ro zm aw ialiśm y . Z atem w ró c im y d o tego w § 8 . ale a d re s liczby stałej. że n ie rozm aw ialiśm y o w sk a źn ik ac h . d o tego nie trz e b a robić żad n e g o rz u to w a n ia . k tó ry p rzech o w u je zw y k łe ad resy . w którym p rzec h o w u je się nie stałą liczbę. A b y je d n ak coś z tego p ara g ra fu C ię p rz e k o n a ło . k tó ra obiekt b ęd ący p o d ty m ad resem ta k ż e trak to w ać będzie jak n ie ty k aln ą św iętość ( c o n s t ) . O tó ż m o ż e się zd arzy ć. const double stały = 15. kto . że tej k o ro n y nie p rzeto p isz n a z ło te zęby". N a p rzy k ła d w ie (zna a d res). g d zie u k ry ta jest zło ta k o ro n a B olesław a K rzyw oustego. czyli osobie. o tym sw o im p o stan o w ien iu in fo rm u je k o m p ila­ to r za p o m o cą o p erato ra c o n s t _ c a s t . double zwykły. ż e jem u m o żn a zau fać. czyli d la niej p o d tym a d re s e m jest obiekt z p rz y d o m k ie m c o n s t . W n o rm aln y ch w a ru n k a c h takiego ad resu n ie m o ż n a przepisać d o in n eg o "adresow ego" o b ie k tu . T ak je st w norm alnej sytuacji. W y o b raź sobie o b iek t. Do takich lu d z i n ie m ów i się: "-P rzy sięg n ij. k tó ra tej k orony nie p rz e to p i na złoto d en ty sty czn e. W iem . O peratory O peratory rzutow ania O czy w iście nie m a p ro b lem u z p rz y p isa n ie m w artości o b iek tu stałego d o obiek tu z w y k łe g o (niestałego). 4. Proste. k tóry stałości ( c o n s t ) by nie g w a ra n to w a ł. M onika p o p ro s tu p o stan aw ia. zwykły = stały. na str.6 m o ż e m y przypisać też zw ykłej zmiennej ty p u d o u b le .

k tóry (zam iast zw ykłej w artości) przecho­ w uje adres jakiegoś innego obiektu. O p erato r d y n a m ie c a s t zrobi rzutow anie tylko pod w arunkiem . ale tylko na w łasn ą odpow iedzialność. ale o dw rotna jest ryzykow na. 4. jego rolę spełnia c o n s t c a s t . by nie było to "wyłącznie na n aszą w łasną odpow iedzialność". O perator rzu to w an ia d y n a m ic _ c a s t jest w łaśnie p o to. bonie każdy pojazd jest samochodem. w ięc silą rzeczy w yjaśnienia będą ogólnikow e. więc .5 Operator dynam i c _ c a s t W paragrafie pośw ięconym s t a t i c _ c a s t zobaczyliśm y p ew n ą "niesymetry­ czną" s y tu a c ję . A co z p rzy d o m k iem v o l a t i l e ? Spraw a jest bardzo prosta: Omawiany tutaj operator rzutowania c o n s t _ c a s t ma. W pam ięci kom putera adres w ygląda nieco inaczej niż w życiu . P oniew aż jeszcze o tym nie m ów iliśm y. a p rz y okazji rzutow ać na zupełnie inny ty p . 1 mmmmmmmmmmBiMMmmmmmMmimmmmmimmmmmmmmmmmimmmimmtmmmmmmmmmmmmmmmmmmmmammmmmmMfimMmmm Zatem nie istnieje operator volatile_cast. b y ś już w iedział. zaraz p o te m drugie. W skaźnik to taki obiekt. w ystarczy to zrobić w dw óch etapach. ż e u su w a ć c o n s t . O pow iedziałem tutaj długą historię jak pozbyć się p rzy d o m k a c o n s t .nie m a miast. To taki num er m oże przechow yw ać w skaźnik.8.5 na stronie 261. 4. N ie m o ż n a próbow ać u p ie c dw óch całkiem ró żn y ch pieczeni p rz y jednym o g niu . że w języku C++ istnieje w sp an iałe narzędzie zw ane w skaźnikiem . Przepraszam : num ery komórek pam ięci. . to d y ­ n a m ie c a s t sp raw d za nas już w trakcie pracy programu. na stronie 1011. ale może posłużyć tak sam o do usunięcia przydom ka v o l a t i l e . b ardzo odległej chw ili. Tutaj więc w yjaśnim y sobie tylko ogólnie sens tego operatora. co to są wskaźniki.m ożem y ją jaw nie dokonać. O ile s t a t i c _ c a s t spraw dza nas tylko w trakcie pracy kompilatora. N ajp ierw jedno. Bliżej porozm aw ia­ my o tym d o p iero w § 8. Otóż niebaw em dow iesz się. Jeśli nie jest możliw e - poinform uje nas o tym (już w trakcie w y k o n y w an ia program u). Jeśli tego b y śm y chcieli.to znaczy konw ersja z typu Sam ochód na ty p Po j a zd ma sens. O peratory 121 O peratory rzutow ania O p erato r ten m o że służyć jedynie d o pozbycia się (lub n adania) przydom ka c o n s t . Do spraw y tej w rócim y w stosownej. każdy samochód jest pojazdem. Są tylko num ery dom ów .6 Operator reinterpret_cast Dobrze by było. co prawda. Twój notes z ad resam i krew nych i znajom ych jest jakby zb io rem takich w skaź­ ników.8. 4.Rozdział.czyli nie tylko.co praw da . ulic i n u m eró w domów. w nazwie c o n s t . że w danej konkretnej chw ili ma to sens.

by n ak ło n ić k o m p ilato r d o p o z w o le n ia nam na ta k k ark o ło m n ą operacje. a o b ie k t adr w a l e c n ad a je się (jedynie) d o p rz e c h o w y w a n ia a d re s ó w obiektów ty p u w a l e c drogowy. ż e nie chciałbyś a d re s ó w tak różnych o b ie k tó w m ieć w ty m sam y m notesie. jeśli by istniał w naszym programie typ (klasa) walec drogowy. 4. Są różne typy wskaźników Ju ż w iesz p ra w ie w sz y stk o o w sk a źn ik ac h . m o ż e sz pokazać na coś n a m apie. O peratory O peratory rzutow ania Ja często m ó w ię. P rzyznaj sam . D zięki tem u u n ik a się zam ieszania. Zobaczmy działanie tego operatora na przykładzie pseudo kodu Z a łó ż m y . albo o k i e n k o ekranowe. Zatem. to dzięki operatorowi r e i n t e r p r e t _ c a s t m oglibyśm y do takiego wskaźnika wpisać adres Cioci Leonii. jak to m ogły ro b ić d o tej p o ry te trad y cy jn e. byś p rzez p o m y łk ę nie u m ie śc ił ad resu obiektu ty p u d o u b l e w e w sk a ź n ik u d o pokazy­ w a n ia n a ty p w a l e c drogowy. N a przykład ty p u double. ż e w o b iek cie o n azw ie a d r _ c h a r m a m y ad res o b ie k tu ty p u char. In n e są więc dla p o k a z y w a n ia na obiekty ty p u double. p o k a z a n e p rz e d te m sp o so b y rz u to w a n ia . K om pilator n ie d o p u ś c i d o takiej in stru k cji: adr walec = adr char. Tym czasem w pam ięci k o m p u te ra m ogą być o b iek ty b a rd z o różnych ty p ó w . alb o typu d e t e k t o r _ p r o m i e n i o w a n i a _ g a m m a . ż e wskaźnik po ka zu je na inny obiekt. O p e ra to r r e i n t e r p r e t cast p o stę p u je z e w sk a ź n ik a m i ta k . Dotarliśmy wreszcie do sensu istnienia operatora reinterpret_cast O p e ra to r ten jest w ła ś n ie po to. K o m p ilato r będzie strz e g ł.jeszcze tylko je d n a spraw a: otóż w T w o im n o tesie są a d re s y jakichś o b ie k tó w ty p u (klasy) "człow iek”. jak w skaźnikiem na lekcji geo g rafii. inne d la ob iek tó w typu char. Tak. a jeszcze inne d la p o k azy w an ia n a obiekty typu dane o krewnym_lub_znajornym. Z atem w języku C++ m o ż e sz zd efin io w ać o so b n e ty p y w skaźni­ k ó w d o p o k azy w an ia na ró ż n e typy obiektów . .122 Rozdz.

(i ty m sam ym całego teg o w yrażenia w naw iasie) jest 600. że to z pow odu zb y t śm iałych konw ersji . Jeśli p ro g ram źle działa. Zestaw iam y w ięc teraz operatory w tabeli. m im o to taką tabelę d o b rz e jest oglądać w całości. N adm ieniłem tylko. O peratory 123 O perator: przecinek Jest w ięc tak sa m o niebezpieczny. w której na sam ej gó rze są operatory o najw yższym priorytecie.10 Priorytety operatorów Na zakończenie spójrzm y na o p erato ry zestaw ione w tabeli. ..Rozdział. a podejrzew am y. 4. Poszczególne w yrażenia obliczane są od lewej do praw ej. najlepiej tego o p erato ra nie używ aj. których nie rozum iesz. to do funkcji były wysyłany tylko ten argument najbardziej z prawej. y = 100 * x) W artością y.: (x = 6. jest 79.w ystarczy p o szu k ać ed ytorem w tekście program u słó w ''reinterpret_cast". Do tej pory unikaliśm y ro zm ó w o priorytecie różnych operatorów . Nie przeraź się. 3) Uwaga dla wtajemniczonych: W wywołaniu funkcji mamy argumenty oddzielone przecinkiem. Zatem w y ra ż ę nie z praw ej stro n y przecinka m oże już skorzystać z rezu ltatu w yrażenia z lewej. Pod w zg lęd em priorytetów o p erato ry dzielą się na 18 grup. Np. że m nożenie ma p ierw szeństw o przed dodaw aniem . 4. N ie m ów iliśm y jeszcze o wszystkich. jak te stare sposoby.. to nie jest ten operator. Jest jednak różnica - łatw o go zn aleźć w program ie. Zapamiętaj: tamten przecinek. Gdyby tak było. Jeśli jesteś początkującym program istą. jeśli w tabeli zobaczysz operatory. o którym rozma­ wiamy teraz.

wyrażenie jednoargumentowy plus +wyrażeriic 16 adres czegoś &Iwartość odniesienie się wskaźnikiem * wyrażenie stwórz (rezerwuj nowy obiekt) new typ stw órz obiekt i inicjalizuj go n e v typ (lista wyrażeń) stwórz w określ. w trakcie kompilacji) s t a t i c _ c a s t < t y p > (wyrażenie ) rzutowanie nie sprawdzane r e i n t e r p r e t cast<typ> (wyrażenie) konwersja const/volatile c o n s t c a s t < t y p > (wyrażeriic) rozmiar obiektu s i z e o f (wyrażenie) rozmiar typu s i z e o f (typ) pre inkrementacja ++lwartość pre dekrementacja . w trakcie wykonania) dynam i c cast<typ> (wyrażenie) rzutowanie (spr. składnik wybranie składnika wskaźnik -> składnik element tablicy wskaźnik [ wyrażenie ] wywołanie funkcji funkcja ( lista_argurnentów ) rzutowanie typ ( wyrażenie) post inkrementacja Iwartość ++ 17 post dekrementaq'a Iwartość — identyfikacja typu wg nazwy. ..— wybranie składnika obiekt .. "..■•■<. miejscu new adrjniejsca typ stwórz w określ. O N azw a Z asto so w an ie ry- tet . . v . „ /. * wsk_do_składnika : 15 wsk ->* wsk_do_składnika .124 Rozdz. ------- *" ** •“ s określenie zakresu nazwa_klasy:: składnik nazwa_przcstrzeni_nazw: : składnik lo :: nazwaglobalna nazwa globalna :: nazwaJęwalifikowana _ f—. --— : j . 4.... t y p e i d ( typ) identyfikacja typu wyrażenia t y p e i d (wyrażenie) rzutowanie (spr. — —■— ..i nazw ą obiektu obiekt . miejscu i inicjalizuj new adrjniejsca typ (lista wyrażeń) zlikwiduj (anuluj rezerwację) d e l e t e wskaźnik zlikwiduj tablicę (macierz) d e l e t e [ ] wskaźnik rzutowanie (konwersja typu) (typ) wyrażenie Wybór składnika wskaźnikiem: ... • . ' Operatory Pri •■v ■Ą t ■ ....Iwartość dopełnienie do 2 ~ wyrażenie negacja ! wyrażenie jednoargumentowy minus . ..i wskaźnikiem do obiektu ■ . ■ •. . . O peratory Priorytety operatorów I .

Rozdział.wyrażenie odejmij (minus) — przesunięcie w lewo wyrażenie « wyrażenie 12 wyrażenie » wyrażenie przesunięcie w prawo mniejsze niż wyrażenie < wyrażenie mniejsze lub równe wyrażenie <. O- N azw a ry- tet mnożenie wyrażenie * wyrażenie .4 dzielenie wyrażenie / wyrażenie reszta z dzielenia (modulo) wyrażenie * wyrażenie — dodaj (plus) wyrażenie + wyrażenie 13 wyrażenie . O peratory 125 Priorytety operatorów O p e ra to ry --------------—— ——--------------------------- . 4.wyrażenie 11 wyrażenie > wyrażenie większe od większe lub równe wyrażenie >= wyrażenie równe wyrażenie == wyrażenie 10 wyrażenie != wyrażenie nie równe 9 iloczyn bitowy wyrażenie & wyrażenie 8 bitowa różnica symetryczna wyrażenie * wyrażenie — I 7 bitowa suma wyrażenie | wyrażenie 6 koniunkcja (AND) wyrażenie S6 wyrażenie 5 alternatywa (OR) wyrażenie \ | wyrażenie 4 wyrażenie warunkowe wyrażenie ? wyrażenie : wyrażenie zwykłe przypisanie Iwartość = wyrażenie mnóż i przypisz Iwartość *= wyrażenie I dziel i przypisz Iwartość /= wyrażenie modulo i przypisz Iwartość %=wyrażenie dodaj i przypisz Iwartość += wyrażenie 3 odejmij i przypisz Iwartość -= wyrażenie przesuń w lewo i przypisz Iwartość « = wyrażenie przesuń w prawo i przypisz Iwartość » = wyrażenie koniunkcja i przypisanie Iwartość s= wyrażenie alternatywa i przypisanie Iwartość | = wyrażenie exclusive or i przypisanie Iwartość *= wyrażenie .

Inaczej będziesz produkow ał zapisy w rodzaju i c b & s s II a == n nad którym i zaw sze trzeba się zastanowić. N ie ty Iko dlatego. w szczególności w yższy niz tajem niczy jed n o arg u m en to w y operator * (czyli odniesienie się do obiektu pokazyw anego przez w skaźnik). nie będziesz m usiał u ży w ać nawiasów w tak banalnych sytuacjach.oznaczające w yw ołanie funkcji oraz klam ry f ] . 4. dodaw anie.odniesienie się od elem entu tablicy . 4. O peratory Łączność operatorów Operatory 2 rzucenie wyjątku th io w wyrażenie 1 przecinek w yra żen ie . a ry zy k o popełnienia błędu jest kolosalne. dzielenie. M ów im y. że: 1) M nożenie. 3) Z apam iętaj też. 2) Skom plikow ane w yrażenia logiczne lepiej zaopatryw ać w n aw iasy. W iedząc o tym. że &&jest mocniejsze niż I I. Nie m usisz w cale uczyć się tych priorytetów . odejmowanie m ają w zględem siebie takie sam e priorytety. że naw iasy okrągłe ( ) . że d ziała na arg u m en t stojący p o jego praw ej stronie !x .126 Rozdz. że w yrażenia takie stają się czytelniejsze. Zapamiętaj tylko. Także dlatego. jak to pam iętam y ze szkoły.co oznacza. że jednoargum entow y o p erato r ! (negacja) jest: p raw o stro n n ie łączn y .m ają b ard zo w ysoki priorytet. w y r a ż e n ie Chciałbym Cię też uspokoić p o raz drugi. Bez tego m ożna sobie doskonale d ać rad ę posługując się naw iasam i.11 Ł ąc zn o ść o p erato ró w Z obaczm y to na przykładach.

w jaki sposób g ru p o w an e je st w ykonyw anie w y rażen ia. który bedzie wypisywał na ekranie kolejne litery alfabetu. Wskazówka: kolejne litery alfabetu możesz uzyskiwać w ten sposób. Używając operatora "reszta z dzielenia" .Rozdział. O to przykład tego w yłam yw ania się: p raw o stro n n a łączność (dw uargum ento- w ego) o peratora p rzy p isan ia = oznacza.. Na przykład: lewostronna łączność operatora + oznacza. W ten sposób treścią obiektu znak będzie kolejno litera B. Wyjaśnij to na przykładzie dwóch operatorów: dwuargumentowego (minus) i jednoargumentowego (minus). a operatorem postinkre mentacji (x++)? . a z tej zasady wyła­ mują się tylko operatory przypisania (które są prawostronnie łączne). Posługując się operatorem "reszta z dzielenia" napisz program. Są to dwa różne operatory oznaczane tym samym symbolem. Pierwszych osiem (A-H) ma być wypisywanych po dwie litery w jednym rzędzie. 4. . że do obiektu typu c h a r (o nazwie np.D itd. Jaka jest różnica między operatorem preinkrementacji (++x). C . Zależnie od tej odpowiedzi następne litery mają być wypisywane według nowej zasady. a*£> ui mm* 1 « W p rz y p a d k u operatorów d w u arg u m en to w y ch łączność określa. O peratory 127 Ćwiczenia Z apam iętaj p ro stą zasadę: Operatory jednoargumentowe są prawostronnie łączne. ż e w yrażenie a = b = c = d = e o d p o w iad a w y rażen iu (a = (b = (c = (d = e)))) W k12 Ćwiczenia Co to znaczy.napisz program. że wyrażenie a + b+ c + d + e odpowiada wyrażeniu ((((a + b) + c) + d) + e) Zapam iętaj: Operatory d w u a rg u m e n to w e są lewostronnie łącznie. z nak) załadujesz literę 'A ana s tę pn ie kolejno będziesz ją inkremen tował (znak++). to program ma zadać użytkownikowi pytanie (po liter w rzędzie ma wypisywać dalej). a co do następnych.30. który wypisywał będzie na ekranie kolejne liczby całkowite począwszy od 1 do 100. a po zakończeniu każdej dziesiątki (10..) wypisze tekst zakończona dziesiątką . że operator jest dwuargumentowy lub jednoargumentowy.20.

jeśli chodzi o typ rezultatu. . że obiekty a. i f ( (a < b) || (a < 15) II (a > (c = 15)) ) {/*. . W tabelce podane mamy dwa obiekty (dla uproszczenia 16 bitowe) Podaj rozkład bitów wartości wyrażeń występujących w dalszej części tabeli . W wyrażeniu warunkowym instrukcji i f może wystąpcie nawet kilka operatorów logicznych. . VI Jaka jest różnica między operatorami arytmetycznymi. by uniknąć tu ostrzeżeń kompilatora? Jaka jest wartość wyrażenia napisanego poniżej (w drugiej linijce). . . == może się znaleźć w wyrażeniu warunkowym instrukcji i f i Czyli czy poprawne są konstrukcje: a) i f (x = y) . a logicznymi .. Załóżmy. c są typu i n t . W poniższej instrukcji widzimy więc trzy człony alternatywy.*/ ) Pytanie 1: Który człon obliczony zostanie najpierw i jakie będą następne.128 Rozdz. Co zrobić. To ćwiczenie jest na sprawdzenie zrozumienia różnicy między operatorami logicznymi z bitowymi. 4. a & b i 3 && b r a | b —— !1 a 1| b 1 '— i1! 1 . jeśli chodzi o końcową wartość obiektu c. Pytanie 3: Oto instrukcja. b) i f (x == y ) .. Pytanie 2: Wyjaśnij działanie członu trzeciego.. b o o l ru c h = f a l s e . .I' Rozkład bitów 1 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 s h o rt in t a. b. ! ! ! ruch. Omów różnicę między operatorem = a operatorem == Który z operatorów =. Wypełnij rozkłady bitów dla poniższych wyrażeń . c o u t << (a = 7) << e n d l . ’r ■' 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 s h o r t i n t b. O peratory Ćwiczenia Jaka liczba pojawi się na ekranie na skutek działania następujących instrukcji i n t a = 4. która logicznie odpowiada powyższej i f ( (a > (c = 15)) II (a < b) II (a < 15) ) { / * . * / ) Wytłumacz jaka jest między nimi różnica.

że musi to być obiekt typu całkowitego. 4) Co to znaczy. że dany operator ma wyższy priorytet niż inny? Jak .można mimo wszystko zapanować nad kolejnością obliczania danego skomplikowanego wyrażenia? . dzieje się z najmniej znaczącym bitem? Jeśli chodzi o uzupełnia nie bitów z lewej strony słowa przez operator >>. może to zależeć od implementacji. Napisz dwie formy zastosowania tzw. że najbardziej znaczący bit będzie wypełniany zerami. by w rezultacie jego wartość została pomnożona przez 1024? int ddd = 3 . gdy x równa się 100. Są jednak sytuacje. Podaj wartość poniższego wyrażenia. że mamy obiekt typu int o nazwie x. Załóżmy. by mieć tę pewność? (Wiadomo. x++. a = b + 6. Które z poniższych wyrażeń jest poprawne a) sizeof (aaa) b) sizeof (double) c) sizeof (double + 2) d) sizeof (double) + 2 Mamy obiekt typu double o nazwie mm. Co.Rozdział. trady­ cyjnego rzutowania tego obiektu na typ int. Operator przesunięcia >> przesuwa bity danego słowa o żądaną ilość miejsc w prawo. 4. 12. Na czym polega "stratność" takiego rzutowania? XXII Co jest wartością następującego wyrażenia (55. Na argumentach jakich typów pracuje operator przesunięcia w lewo (<<). Czym za­ pełniany jest bit z prawego brzegu słowa? Zerami czy jedynkami? Co się dzieje z najbardziej znaczącym bitem? Napisz jak będzie wyglądał rozkład bitów w obiekcie rezultat po wykonaniu poniż­ szych instrukcji. x =-l. short int a = Of.2 .nie pamiętając priorytetów operatorów . Z jakim typem obiektu powinniśmy pracować. x -=1. ale z jakim "przydomkiem"?). O peratory 129 Ćwiczenia Wyjaśnij działanie operatora += w poniższym fragmencie int m = 3. v Jak zmieni się wartość obiektu x na skutek poniższych instrukcji? int x = 0. m += 2 . short int rezultat = a « 2. (x %100) ? "Kraków" : "Londyn" Mamy obiekt typu double o nazwie aaa. po przesunięciu. Ile razy trzeba przesunąć w lewo bity poniższego obiektu. gdy mamy pewność. Podaj jaką wartość na skutek tych instrukcji będzie miał obiekt m.

W tym bowiem rozdziale. c o n s t in t sze sc = 6. że możliwa jest niejawna konwersja obiektu typu B na typ A • Czy zatem kompilator pozwoli. Jaka jest łączność operatorów dwuargumentowych? X Ćwiczenia dla zaawansowanych Poniższe ćwiczenia dotyczące rzutowania są raczej dla zaawansowanych. Ostatnia instrukcja to przypisanie. b = 15. Mamy trzy klasy. Zatem na te poniższe pytania odpowiedzieć powinni tylko "wtajemniczeni Do czego służy operator con st_cast? Czy operatorem r e in te r p r e t_ c a st można rzutować obiekt typu double na typ int? Mamy dwa typy A i Btakie. d. aby nawiasy nie zmieniły kolejności obliczania wyrażenia. 4.130 Rozdz. b. c o n s t in t *wsk_c = &szesc. Jeden z nich jest ustawiony na obiekt o nazwie sze sc. c. Czy operatorem s t a t ic _ c a s t można rzutować typ v o l a t i l e in t na typ int? Jak zatem to zrobić? W programie zastosowaliśmy rzutowanie typu X na typ Y za pomocą operatora sta tic_ in t< Y > . Ujmij w nawiasy poszczególne człony tego przypisania . by nawiasy me zmieniły kolejności obliczania wyrażenia. in t a. Oto definicje obiektów tych klas. c. i n t *wsk_no£m. dokonaliśmy tylko pierwszego przybliżenia do stosowania tych operatorów. która pozwoli przepisać adres ze wskaźnika wsk_c do wskaźnika wsk_norm. r e z u lta t. Jaka wartość ostatecznie znajdzie się w poszczególnych obiektach? XXVII Ujmij w nawiasy poszczególne człony wyrażenia mnożenia . O peratory Ćwiczenia Jaka jest łączność operatorów jednoargumentowych? Poniżej widzisz fragment kodu. czyli mj przynajmniej jedną funkcję wirtualną.tak. r e z u lt a t = a * b * c * d . a = b = c = d. Napisz instrukcję (rzutowania). a także wskaźników . by operatorem s t a t ic _ c a s t dokonywać konwersji odwrotnej? (z typu A na typ B). in t a. że rzutowanie takie będzie błędem? Mamy dwa wskaźniki. Kompilator przy kompilacji tej instrukcji uznał ją za poprawną.tak. b. d. d = 2. Czy istnieje więc jakieś ryzyko. kot. Mamy też dwie klasy pochodne od klasy ssak Nazywają się one: p ie s . Podstawową (ssak) i jest ona typem polimorficznym.

że w pewnych warunkach (jakich?) w obiekcie wskjpsa znajdzie się adres 0 (NULL) ? Które z czterech operatorów rzutowania sprawdzają słuszność rzutowania w trakcie kompilacji.. c) wsk_ssaka = dynamie cast<ssak*> (wsk_psa). b) wsk_ssaka = static_cast<ssak*> (wsk_psa)..Rozdział. a które w trakcie wykonania? Kiedy takie sprawdzenie odbywa się w przypadku "tradycyjnych" (czyli nie zalecanych) sposobów rzutowania? Jak można ustawić wskaźnik na konkretny adres znany nam liczbowo z dokumentacji? Czy operator dynamie cast może nam pomóc przy rzutowaniu wskaźników dowolnej hierarchii klas? Jaki warunek musi spełniać klasa podstawowa. ssak *wsk_ssaka. pies *wsk_psa. 4. e) wsk_psa = static_cast<pies*> (wsk_ssaka). Które z poniższych instrukcji w trakcie kompilacji tego fragmentu programu uznane zostaną przez kompilator za błędne? a) wsk_ssaka = wsk psa. by operator dynamic_cast uzyskał od niej potrzebne mu informacje? " W . " d) wsk_psa = wsk_ssaka. że przez pomyłkę w obiekcie wsk psa znajdzie się adres kota? Która z tych instrukcji może sprawić. Która z powyższych (poprawnych składniowo) instrukcji może sprawić. f) wsk_psa = dynamic_cast< pies*> (wsk_ssaka) . Załóżmy. O peratory 131 Ćwiczenia pies azor. że dwa powyższe wskaźniki mają już sensowną wartość. //. kot mruczek.

Z/********************************** int main() i int m = 20. jakbyśm y języ k p ro g ram o w an ia w y p o ­ sażyli w n o w ą instrukcję um iejącą w łaśnie to obliczać. To.132 Rozdz. cout << "Zaczynamy" << endl. a jej z ad a n iem jest kukać ż ą d a n ą ilość razy. n azy w am y po p ro stu funkcją. P o d p ro g ram to J5kby m ały program we w łaściw ym program ie.j e s t p a ra m e tre m w ysyłanym d o funkcji. Oto przykład programu zawierającego funkcję: N azy w a się ona kukułka. Funkcje — — i— — —■ 5 Funkcje T e d n ą z najsym patyczniejszych cech now oczesnych języków pro g ram o w a- I nia jest to.to tak. 5. jak napisanie zw ykłej instrukcji. że m ożna w nich posługiw ać się podprogramami. F u n k ­ cję w y w o łu je się przez p o d a n ie jej nazw y i u m ieszczo n y ch w n aw iasie arg u m en tó w . W języku C++ w szy stk ie p o d p ro g ram y n a z y w a n e są funkcjami. . O d tej pory . a jest to tak proste. ile razy . P o d p ro g ram . int kukułka(int ile).ile ra z y w p ro g ram ie potrzebujem y obliczyć pole koła . który jako re z u lta t zw raca jakąś w arto ść. D zięki p o d p ro g ram o m m o ż e ­ my jak b y definiow ać swoje w łasn e „instrukcje": Jeśli n ap iszem y sobie p o d p ro g ram realizujący op erację liczenia pola k o ła na p o d staw ie zad an eg o prom ienia . #include <iostream> using namespace std.w y w o łu jem y nasz p o d p ro g ram .

czyli po prostu jej treść. dlatego w idzim y przypisa­ nie tej wartości rezultatu do zmiennej m. Ponieważ spodziew am y się. która ją identyfikuje. że funkcja rzeczywiście zwróciła jakąś wartość. ciało funkcji. i że nastąpiło przypi­ sanie tej wartości do obiektu m.a zwracającą jako rezultat wartość typu i n t . i++) ( cout « "Ku-ku ! ) return 77. Deklaracja ta mówi kompilatorowi: kukul ka jest funkcją wywoływaną z argumentem typu int. Sama funkcja może być zd efin io w an a później.przed pierwszym odwołaniem się do nich - m uszą zostać zadeklarowane. że w rezulacie swojej pracy funkcja zwróci jakąś wartość. to po prostu napisanie jej nazwy łącznie z nawiasem. Wykonanie tego programu objawi się na ekranie jako: Zaczynamy Ku-ku ! Ku-ku ! Ku-ku ! Ku-ku ! Ku-ku ! Na koniec m = 77 ^ Przyjrzyjmy się temu programowi O Funkcja ma swoją nazw ę. © Na dowód. 5. . Deklaracja. ale niekoniecznie od razu definicja. czyli wszystkie instrukcje wykonywane w ramach tej funkcji.Rozdział. Powtórzmy: Przed odwołaniem się do nazw y wymagana jest jej deklaracja. Definicja ta zawiera tzw. gdzie znajduje się argument przesyłany do funkcji. Z defi­ niować funkcję. © Tu się zaczyna definicja funkcji. Definicja funkcji znajduje się w O © W ywołanie funkcji. W tym miejscu programu w id zim y deklarację n a zw y funkcji. to znaczy po prostu napisać jej treść. n a w e t w zu p ełn ie in n y m pliku. wszelkie nazwy . i < ile .wypisujemy go w tym miejscu na ekran. Jak pamiętamy z poprzednich rozdziałów. Funkcje 133 int kukułka(int ile) { for(int i = 0 . Dwie klamry © i © określają ten obszar ciała funkcji. Wymagana jest więc także deklaracja nazwy funkcji.

• pin jest funkcją. void. którą w yw ołuje się z bliżej nieo k reślo n y m (teraz jeszcze) arg u m en tam i. Po takiej deklaracji . . a k tó ra nie zw raca ż a d n e wartości.1 Obok słow a r e t u r n w id zim y w artość. ) ♦♦♦ _ w języku C++ . to za p a m ię ta j. • fun jest funkcją (w yw oływ aną z 3 arg u m en tam i typu: int char. int).p o w ró t]. która w y w o ły w a n a jest bez ż a d n e g o arg u m en tu . że na końcu każdej z przed staw io n y ch dek laracji jest średnik. c< f(void) Jeśli m a sz p rzy zw y czajen ia z klasy czn eg o C. 5. k tó ra w rezultacie zw raca w arto ść typu double. • znak_x to funkcja. Uwaga dla programistów C: Jest tu z m ia n a w sto su n k u d o klasycznego C. P rzeczytajm y teraz te deklaracje. 1) [czytaj: „rytem "] .. k tó ra nie zw raca ż a d n e j w artości. . f ( ) . int przypadek(void).b rak jakichkolw iek a rg u m e n tó w . czyli to sam o . int nachylenie). że p rzez za p o m nienie p ró b u jem y uzyskać z tej funkcji jakąś w arto ść - ostrzeże nas. return . g d y funkcja k o ń czy swoją pracę i w ra c a do miejsca skąd został* w y w o łan a [ang.jeśli k o m p ilato r zobaczy. co f ( .. Słow o voi< [ang. Funkcje 0 Jest to m o m en t.). którj zdecy d o w aliśm y zw rócić jako rezu ltat w y k o n an ia tej funkcji. W Z atrzy m ajm y się trochę przy deklaracjach funkcji. -o z n a c z a i n t f (v o id ) . • kwadrat jest funkcją (w y w o ły w an ą z jednym arg u m en terą typu int).134 Rozdz.p ró żn y ] służy tu w łaśn ie d o w yraźnego z a z n a c z ę nia tego faktu. char znak_x(). czy li to sam o.d o w olną liczbę arg u m en tó w . void fun(int stopień. o z n a c z a _ w języku C . a w rezultacie zw raca w a rto ść ty p u char. że o d tąd Deklaracja in t f(). • przypadek to funkcja. O to kilka przykładów : double kwadrat(int bok). a k tó ra zw raca w arto ść ty p u int. która w y w o ły w a n a jest bez żad n y ch a r g u ­ m entów . P usty n a w ia s w deklaracji funkcji np. char znaczek. Z au w aż. void p i n (. sygnalizując błąd.

int). gdzie została przerw ana. W ów ­ czas to w ykonyw anie bieżącej funkcji się chw ilow o zaw iesza. to łatw iej się w nim orientow ać. a ro zp o czy n a się w y k o n y w an ie drugiej. Z n am y to z życia codziennego. ♦> łatwiej taką deklarację napisać. Po jej zakończeniu stero w an ie w raca do tej pierw szej funkcji . co dalej i .o d d zieliłem od reszty p ro g ram u za pom o cą linijki kom entarza składającą się z rz ę d u gw iazdek. W Z a u w a ż . że w naszym ostatnim program ie definicję funkcji (czyli to miejsce.tego z n azw am i argum entów . N am aw iam Cię jednak do sto so w a n ia pierw szego sposobu . p rzy p o m in a bow iem lepiej czym zajm uje się funkcja. M asz w ięc dw a sp o so b y deklarow ania funkcji. M im o ż e je st dłuższa. a zaczyna d ru g a . char znaczek. Po p ro stu pracując w edytorze p rzen o si się we w łaściw e m iejsce (u nas . P rzem aw iają z a nim d w a w zględy praktyczne: ♦> jest on czytelniejszy dla program isty. a nie typy a rg u m e n tó w .Rozdział.na górę pro g ram u ) pierw szą linijkę definicji funkcji i staw ia się na końcu tej linijki średnik.m ożem y dojść do p u n k tu . Pow tarzam : nazw y. Funkcje 135 Funkcja często wywołuje inną funkcję N a z w y arg u m e n tó w um ieszczone w n aw iasach deklaracji funkcji są nieistotne d la kom pilatora i m o żn a je pom inąć. int nachylenie). char. G dy w kuchni w y konujem y funkcję gotoiw- niejpierogćrw .w miejsce. Bardzo to po lep szy czytelność Tw oich p rogram ów . D lateg o deklarację funkcji void fun(int stopień. w k tó ry m mieści się trzydzieści definicji funkcji. R ad zę Ci robić pod o b n ie. (czyli do instrukcji znajdującej się p o w yw ołaniu funkcji drugiej). T o dlatego. Ju ż na pierw szy rz u t oka w idać. Jeśli m a sz plik. Ich nazw y nie są w tym m om encie istotne. g d z ie znajduje się treść. m o ż n a napisać także jako void fun(int. W czasie w ykonyw ania funkcji może nastąpić w y w ołanie innej funkcji. w któ ry m nie w iem y. (To będ zie w ażne w definicji). gdzie się jed n a funkcja kończy. 5. że w deklaracji p o w iadam iam y k o m p ilato r o liczbie i typie arg u ­ m en tó w . ciało funkcji) .

Zauważ. w jakim je przed chwilą zostawiliśmy. co zrobiliśmy do tej pory. c in » pocz. nadal czekają na nas w stanie.więc wszystkie zmienne lokalne (np. 5. Rys. Poniżej zobaczymy to na rysunku. c in >> k on iec. f u n k c j a B () < double zmienno. Ponieważ funkcja gotowania pierogów nie zakończyła się. // pętla drukująca wyniki z danego przedziału . Funkcja. cout << "\nPodaj koniec p r z e d z ia łu : ". Oto przykład programu liczącego potęgi danej liczby: jfinclude <iostream > using namespace std . a jedynie została ni chwile przerwana . long p otęga (in t sto p ie ń . może wywołać inną funkcję 5. Przyjrzymy się teraz bliżej temu mechanizmów przekazywania. Funkcje Zw racanie rezultatu przez funkcję konieczna jest konsultacja ze specjalistą.2 Z w ra c a n ie rezu ltatu p rze z fu n k c ję W naszym przykładowym programie funkcja w yw oływ ana była z argumen tern i zwracała jakąś wartość. //*x******-******»************»******************************** in t main() ł in t p o cz.kontynuują< to. czyi wywołujemy funkcję rozmowaJelefoniczna.136 Rozdz. w trakcie swej pracy. koniec. cout << "Program na o b lic z a n ie potęg lic z b " << "calkowitych\n" << "z zadanego p r z e d z ia łu \n" << "Podaj początek p r z e d z ia łu : ". 5-1. Po zakończeniu rozmowy telefonicznej wracamy do gotowania . ciasto na pierogi. że każda z funkcji ma swoją właśni (lokalną) zmienną o nazwie zm ienna. long lic z b a ) . Dzwonimy wtedy do mamy.

i < stopień .33. m o g ą być też inne w arian ty : return (wynik + 6) . long wynik = liczba. T y m czasem koło słow a r e t u r n stoi liczba zm ien n o p rzecin k o w a 12. i) // w y w o ła n ie f u n k c j i << endl. a następ n ie d o p ie ro ow a w artość jest „ p rz e d m io te m z w ro tu . i++) { . // z w ię ź le j m o ż n a z a p is a ć to sam o ja ko : wynik *= liczba.33 C o w te d y ? C zy jest to b łąd ? . wynik + 6). Staw ia się p o p ro stu przy niej ż ą d a n ą w artość. Funkcje 137 Zw racanie rezultatu przez funkcję for(int i = pocz . U n a s to w y g ląd a w ten sposób: return wynik. W sp o m i­ n aliśm y już. long liczba). ż e jest to jeden z typów liczb całkowitych). // ® / / ************************************************************* Jeśli n a p y tan ia p ro g ra m u o d p o w iem y np. } //***************■********************************************** long potęga(int stopień. to n ajpierw o bliczana jest jego w arto ść. O tóż jeśli d ek laracja funkcji jest taka: long potęga(int stopień. wynik = wynik * liczba. i) // i . Jeśli sto i tam w y rażen ie (np. 10 o ra z 14 to 3 na ekranie pojawi się: Program na obliczanie potęg liczb całkowitych z zadanego przedziału Podaj początek przedziału: 10 Podaj koniec przedziału: 14 10 do kwadratu = 100 a do sześcianu = 1000 11 do kwadratu = 121 a do sześcianu = 1331 12 do kwadratu = 144 a do sześcianu = 1728 13 do kwadratu = 169 a do sześcianu = 2197 14 do kwadratu = 196 a do sześcianu = 2744 O N a jp ie rw zw róćm y u w a g ę . long liczba) { . for(int i = 1 . jak odbyw a się z w ra c a n ie w arto ści fu nkcji.Rozdział. return 12. 5. że robim y to p rzez instrukcję return.w y w o ł a n i e f u n k c j i << " a do sześcianu = " << p o t ę g a (3. i <= koniec . że funkcja ma zw racać jako rezu ltat w arto ść ty p u l o n g (pam iętam y . to z n ac zy . i++) cout << i << " do kwadratu = " << p o t ę g a (2. Jest jeszcze coś zask ak u jąceg o . return wynik.

żj coś tu b ęd zie. Z ap y tasz p ew n ie: „A w łaściw ie.a m y . 5. co to znaczy. 5 + pot ega( 2. T o jed n a z w ielu zalet o b o w ią z k o w y c h d ek la racji funkcji. p rz e z nieu w ag ę. N astąp i bow iem p ró b a niejaw nej zam ian y (konw ersji) typu.czyli niezw racająci niczego . że funkcja z w ra c a jakąś w artość? W iem y ju ż ja k to się robi. O biecałeś. ale co to znaczy?!" To b ard zo w a ż n e pytanie. W n a ­ szym p rz y p a d k u będzie to konw ersja typu zm ien n o p rzecin k o w eg o na ty p 1 ong. P rzy k ład o w o : 7 + 1 . Także. że funkcja m a coś zw racać. Z a u w aż y łeś ju ż za p e w n e . O d p o w ie d ź je st b ard zo prosta.na liczbę zmiennoprzecinkową? Kompilator wtedy nam nie podaruje i w trakcie kompilacji oznajmi błąd. że w y ra ż e n ie będące w y w o łan iem tej funkcji m a —sa m o w sobie . W n a sz y m p rzy p ad k u w y rażen ie ( p o t ę g a (2. gdy funkcja zwraca v o id to k o m p ilato r w y k ry je błąd.138 Rozdz. M ieliśm y b o w iem nic nie z w ra c a ć . a prz. K o m p ilato r dom yśli się jak to zrobić i w rezultacie funkcja zw róci w arto śj 12.. ż e p o p ełn iam y błąd. 5 + 4 + 100 Jeśli funkcja je s t zad ek laro w an a jak o zw racająca ty p v o i d . N iezależn ie od tego. Funkcje Zw racanie rezultatu przez funkcję N ie zaw sze. Z n a czy to. wskaźnik . że w n aszy ch d o ty c h czaso w y ch p ro g ra m a c h funkcj J m a i n m a ty p re z u lta tu o k reślo n y ja k o i n t i n t m a i n () Z ap y tasz p e w n ie : . to ko m p ilato i o strzeże n as. to m o żn a go użyć w in n y c h . u ży jem y ją w tak im w y ra ż e n iu . g d y b y ś m y w ew n ątrz definicji takiej funkcji o b o k sło w a r e t u r n p o sta w ili coś o p ró c z śred n ik a return 6. a zw racam y ? T akże o d w ro tn ie : jeśli z ad e k laro w aliśm y . Jak bowiem zamienić tzw. słow ie r e t u r n stoi sam śred n ik . że jest to w y w o łan ie funkcji Skoro w ięc ta k ie w yw ołanie jest w y rażen iem m ającym ja k ą ś w arto ść. a nie m a? P ew nie o czy m ś z ap o m n iałeś ! Z powodów historycznych. // błąd. 2) + 100 o d p o w ia d a u n a s w yrażeniu: 7 + 1 . 2) ) m a sam o w so b ie w artość 4. Nie zawsze jednak taka konwersja może się odbyć. k o m p ila to r u zn a to za n a s z b łą d . ale d o b rze ją sobie w y ra ź n ie uśw iad o m ić. w iększych w y rażen iach ..jaką^ w artość.

A by te "stare" p ro g ra m y n a d a l m ożna było k o m p ilo w ać . ż e w funkcji m a i n kom pilator p o z w a la na n a m na o p u sz c z e n ie instrukcji return. K to to jest? Kto u ru c h o m ił program ? Nie. F u n k cja m a i n m a po p ro s tu specjalne p raw a.). K o m p ilato r. Skorzystałem z te g o . że p ro g ram zo stał u ru ch o m io n y p rz e z i nny p ro g ra m . lub klikając na jakąś ikonę).tu kompilator doda sobie tę instrukcję ) ' Z a te m w main. To ten system o p erac y jn y (Linuks. sk o ro i tak n ikt z niej n ie skorzysta? (Przecież w ra z z zak o ń c zen ie m funkcji m a in .nie.. T utaj b y ło to zero. Jest ta k z p o w o d ó w "h istorycznych" . 5. nie m y! M y tylko p o p ro siliśm y o to sy ste m operacyjny (p isząc kom endę. p ro g ram s ię kończy. Po co jest ta w arto ść rezu ltatu .po p ro s tu d aw n iej nie b y ło to w ym agane. // wszystkie instrukcje funkcji m ain re tu rn 0 ..u z n a w a ł. kończy się p ro g ram ). W in d o w s) uruchom ił p ro g ra m i to on o trz y m a ten rezultat. Musisz określić typ rezultatu funkcji U w a g a: w starych w ersjach języka C++ m o żn a b y ło w deklaracji funkcji opuścić ty p re zu ltatu . . T eraz. M o żliw e też. K toś w końcu u ru c h o m ił ten p ro g ram . m u sisz w y ra ź n ie napisać jaki jest ty p zw racan y . Dla dociekliwych Z obaczy liśm y . W innych fu n k cjach . // «. m o ż e m y tę instrukcję o p u szcza ć. . ale p rz e c ie ż m oże być d o w o ln a liczba typu int.Rozdział. bo nie chciałem . Poza ty m nie m o ż e m y jej w yw ołać z innej funkcji. Funkcje 139 Zw racanie rezultatu przez funkcję D laczeg o z a te m w naszych d o ty c h c z a so w y c h p ro g ra m a c h dotych­ czas w ciele funkcji m a i n nie b y ło instrukcji return? O d p o w ie m tak: N ie b y ło . W ów czas to sy ste m operacyjny p rz e k a ż e rezu ltat tam tem u d ru g ie m u p ro g ram o w i. w stan d ard zie. w id ząc taką d e k la r a c ję .. N a p rz y k ła d nie d ek laru jem y jej n ig d z ie . R zeczyw iście. b y w y g ląd ało tru d n iej. Krótko m ó w iąc. ale k o m p u te r n ie w yłącza się. że funkcja m a i n zw raca w arto ść (rezultat). (Z aw sze to je d n a in strukcja w iecej. ż e fu n k cja zw raca re z u lta t typu int.d o s ta n d a r d u w pro­ w a d z o n o n astęp u jącą z a s a d ę : S chem aty czn ie m o żn a to po k azać tak: int main() { . To ten ktoś w łaśnie o trz y m a teraz ten re z u lta t zw ra­ can y p rz e z funkcję main. ta p ra k ty k a została p o tę p io n a .

Jeśli nie. co chcesz. Zdjęcie książki z takiego stosu jest szybsze niż p rzec h ad zk a do biblioteczj ki. z e w pro g ram ie w y w o łu jem y tę funkcję tak: int a. to po prostu trzeba się z osobą piszącą ten d ru g i program um ów ić. to są o n e przechow yw ane najczęściej w łaśn ie na stosie . a me w niedzielę. m. potem w kładasz z po w ro tem . możesz tam wpisać. co się n azy w a stos..3 S to s M oże słyszałeś o czym ś takim w k om puterze. to idziesz d o biblioteczki w yjm ujesz i czytasz. Co zaś oznacza błąd . k tó rz y program ują w asem blerze. że m a m y funkcję void a l a r m (int stopień. 5. } Z ałóżm y też. .decydujem y my sami. int wyjście) { cout « "Alarm " « stopień << "stopnia" « " skierować sie do wyjścia nr " << wyjście << endl.140 Rozdz. Jeśli w obrębie funkcji definiujem y jakieś zm ienne. Tak sam o p ostępuje kom puter. Koniec obrazka. jaka liczba oznacza jaką w iadom ość. Jeśli rezultat ten m a posłużyć jako w iadom ość dla innego program u. . M a także swój p o d ręczn y stos.czyli w tej podręcznej pam ięci. Błędem może być na przykład uruchomienie programu w czwartek. Jeśli nie m a takich potrzeb.. Tradycyjnie zw ro t w artości 0 oznacza p opraw ne zakończenie całego p ro g ram u . G dv którąś potrzebujesz. Wiem.. W artości in n e niż zero mogą oznaczać różnego typu b łęd y w ykonania. Stos m a w iele ciekaw ych w łasności . P raw d a jest taka. to w yobraź so b ie taki obrazek: W szystkie swoje książki trzy m asz w biblioteczce. w iem jestem naiw ny. Załóżm y. na którym trzym a p ew n e dane. W artość jej jednak jest d o w olna. Funkcje Stos Co może być wartością rezultatu działania funkcji main? Oczywiście liczba całkowita. // . 5. N ajpierw spraw a n azew n ictw a. że najpo­ trzebniejsze książki leżą na Tw oim b iu rk u w postaci m niejszego lub w iększego sto su .znają je p rz e d e w szystkim Ci. czy z b łędam i.IIHII IIMWII «M■ ■■ ■' P rze s y ła n ie a rg u m e n tó w d o funkcji p rzez w a rto ś ć Zajmijmy się teraz sposobem p rz e sy ła n ia argum entów d o funkcji. Z niektórym i w łasnościam i stosu zap o z n am y się w następnych paragrafach. . to najczęściej wartość zw racan a oznacza czy p rog­ ram się w y k o n ał dobrze.

10. / / z w ię k s z e n ie lic z b y o 1 0 0 0 O cout << "W funkcji modyfikuje arg formalny\n\t" . a. że to ta sam a osoba. wyjście . W sklepie n ik t n ie n azy w a jej inaczej.„ m u s z ę obsłużyć klienta".tak. a za ch w ilę w ejdzie S ybilla. To d la niej w tym m o m en cie pracu je sk lep . je d n a k aktualnie k lie n tk ą jest C lau d ia. m ) .są tylko k o p ia m i. jak tylko (b a rd z o ) formalnie: klient(-ka). T a k a jest w ięc różnica m ięd zy a rg u m e n tam i ak tu aln y m i. to o n a staje się a rg u m e n tem a k tu a ln y m tego sk lep u . C z y li takie a rg u m e n ty . m | to tak z w a n e argumenty (param etry) aktualne. N a z e w n ic tw o jest ta k ie: n azw y stopień . I A rg u m e n ty form alne to jest to. 5. n a to m ia s t I a rg u m e n ty a k tu aln e to to. co p o ja w ia się w n aw iasie w m o m en cie w y w o ły w a n ia tej fu n k cji- c z y li w n aszy m p r z y p a d k u 1. to o n a jest a rg u m e n te m a k tu a ln y m tego sklepu. W KIP A rg u m e n ty p rzesłan e d o funkcji . Funkcje 141 Przesyłanie argum entów do funkcji przez w artość alarm{l. J e d n a k do sk lep u p rz y c h o d z ą jacyś k o n k re tn i lu d zie. ale n ikt nie tw ie rd z i. W sk lep ie m ó w ią o nas . co a k tu a ln ie stosujem y w k o n k retn y m I w y w o łan iu funkcji. jak n a p a ra m e try m ó w i sobie I w śro d k u funkcja. alarm(a.k tó re w id z im y w p ierw szej linijce definicji fu n k cji są to tzw. argum enty form alne funkcji. N aw et n ie zn ają jej n azw isk a. Jakiekolw iek d ziałan ie na nich nie d o ty czy o ryginału. O to dow ód: void zwiększ(int formalny) formalny +.b o z ty m i arg u m e n ta m i fu n k c ję w y w o łu jem y . z k tórym i ak tu a ln ie funkcja m a w y k o n a ć pracę. Często b ę d ę na to m ó w ił prościej: argumenty w y wołania funkcji .1000. T o n ato m iast. 1 0 ) .Rozdział. S klep na nią i tak z n o w u m ów i „k lie n tk a ". W a ż n e jest tu słow o: formalne. G dy d o s k le p u w ch o d zi C la u d ia . jak to w n aszy m p rz y k ła d z ie . K lient jest a rg u m e n te m fo rm aln y m funkcji sklep. a fo rm aln y m i. G d y C laudia w y jd zie z e sklepu. W sklepie o b słu g u je s ię klientów . C zasem z w a n e p a ra m e tra m i form al­ nym i. D la osw ojenia się p o d a jm y obrazek z życia: sk le p to jakby funkcja. void sklep(int klient).

by się pobaw iło. jasne.zdjęcia). D ziecko ukochanej b ab ci dorysow uje wąs> (dodanie 1000). int &ref). Czyli w n a sz y m przykładzie d o d a n ie 1000 (w miej* scu O ) nie n astąp iło do kom órki pam ięci. a śmieci wyrzu* cane (niszczenie kopii . Funkcje Przesyłanie argum entów przez referencję « " i teraz arg formalny = " « formalny « e n d l .używać będziemy też równolegle terminu „przez przezwisko" O to przykład: #include <iostream> using namespace std. void zer(int wart. Po skończonej zabaw ie p a trz y m y na naszt (żyw ą) teściow ą: teściow a w ąsów nie m a. Jeśli wykonamy taki fragment programu to otrzymamy: Przed wywołaniem. jedna dopóki się z tym nie oswoisz . K iedy skończy zab aw ę zab aw k i są sp rząta n e. cout << "Przed wywołaniem. Czyli p rz e z przezw isko. H ® . Bardzo pouczająca przypowieść o babci Jeśli jeszcze to nie jest dla Ciebie. Zdjęcie to dajemjl dziecku (funkcja). aktu = 2 W funkcji modyfikuje arg formalny i teraz arg formalny = 1002 Po wywołaniu. Przez refe rencję. to ro zw ażm y taki obrazek M y. 5. zwiększ(aktu). z« coś tam robiliśm y. czy li zm iennej lokalnej tw orzonej przea funkcję na stosie.5 P rze s y ła n ie a rg u m e n tó w p rz e z referen cję Powyżej o p isa n y sposób przesyłania a rg u m e n tó w znany b y ł program istom C Język C++ p rzy n o si jeszcze inny sp o só b przesyłania arg u m e n tó w .robim y teściowej (zm ien n a) zdjęcie (kopia). Jest to więc jakby zro b ien ie kopii w o b ręb ie funkcji. Funkcja pracuje na tej kopii. cout << "Po wywołaniu. W artość ta służy dc inicjalizacji p a ram etru form alnego. w tej funkcji zw iększa się w arto ść argum entu form alnego funkcji. nie m a śladu. 5. } Jak widać. Funkcję tę w yw ołujem y na przykład w tak im fragm encie p ro g ram u . ale do tej zm ien n e lokalnej na stosie. C zy teln ik u . gdzie tkwi a k t u . g d zie mieści się k o p ia (o nazw ie formalny). int aktu = 2 . aktu = 2 N ależy u św iad o m ić sobie bardzo w a ż n ą rzecz: Do funkcji przesyłam y tylkc w artość liczbow ą zm iennej aktu (p aram etru aktualnego). (program ) .142 Rozdz. aktu = " << aktu << endl. Po opuszczeniu funkcji ten frag m e n t stosu jest n iszczony. aktu = " << aktu << enal. znika więc też k o p ia . ^ j W dalszej części książki powinniśmy mówić: „przez referencję".

to nic nas tu nie dziw i. b = 77. cout << "Przed wywołaniem funkcji: zer \n". b = " << b << endl. b = " << b « endl. ref = 77 W funkcji zer po zerowaniu wart = 0. II 0 cout << "Po powrocie z funkcji: zer \n". D rugi nato m iast jest p rz e sy ła n y p rzez referencję.zask o czy ła nas. że to fu nkcja. które w ysy łam y d o funkcji zer. k tó ra chciała w y zero w ać d w a obiekty a i b w y słan e do niej jako arg u m en ty . b = 0 Komentarz P a trz ą c na ekran z a u w a ż a m y . To znam y. że funkcja. cout « "\twart = " « wart << ". // © wart = 0. 0 W main m am y dw ie zm ien n e. int &ref) { cout << "\tW funkcji zer przed zerowaniem \n" . ref = " << ref << endl. Pierw szy z nich jest p rzesy łan y . cout << "a = " << a << ". Funkcja o d eb rała ją p rz e z w artość. 5. cout << "\twart = " << wart << ". Jed n ak obiekt b m a w arto ść 0.Rozdział. ref = O t II O cout << "\tW funkcji zer po zerowaniu \n".tak jak p o p rzed n io . W idzim y. zer (a. ref = 0 Po powrocie z funkcji: zer a = 44. // © } // © 3 W rezultacie działania tego programu na ekranie pojawi się Przed wywołaniem funkcji: zer a = 44. O R zu ćm y w ięc okiem na deklarację funkcji zer. b = 77 W funkcji zer przed zerowaniem wart = 44. ref = " << ref << endl. D laczego? Jeśli chodzi o zm ienną o n azw ie a . cout << "a = " << a « ". Z au w aż znak: &. Inaczej mówiąc: w y w o łu jem y funkcję zer z param etram i a k tu a ln y m i a. O czyw iście o b ie k t a jest n ietk n ięty . która p rzy jm u je d w a arg u m en ty . U O } void zer(int wart.p rz e z wartość. b ) . b . Funkcje 143 Przesyłanie argum entów przez referencję ^************************************************************/ int m a i n () X int a = 44.

«.np. N ato m ia st ta z m ie n n a . W O d o o b iek tu o ty m p rzezw isk u r e f w p is a n o zero. W n io s e k : P r z e s ł a n i e a rg u m e n tó w fu n k c ji p r z e z r e fe r e n c ję p o z w a la te j fu n k c ji na m o d yfikow a n ie zm iennych (naw et lokalnych!) z n a jd u ją cych się poza tą funkcją. S koro r e f b y ło p rz e z w is­ kiem o b iek tu b. to znaczy. tracim y a d r e s te g o b u d y n k u . ale określają te n s a m obiekt. fu n k cja m a i n . to lin ijk ę w cześniej n ależało b y n ap isać return. Z treści.o: „D o b rze. I tu jest cała n ie s p o d z ia n k a . a p o tem 0). że o d b y ło się to n a obiekcie b. 1) B ędąca n a stosie k o p ia z m ie n n e j a . 5. © N a d o w ó d . P o n iew aż. Są to d w ie ró ż n e n azw y . k tó rą fu n k ­ cja o d eb rała p rz e z referencję (p rzezw isk o ) zo stała z m o d y fik o w a n a .zo b aczm y . co p r a w d a . 0 K ończym y p ra c ę funkcji. O Po pow rocie z funkcji. ref © Tu n astęp u je ja k a ś operacja zm ieniająca w a rto ść zm ien n y ch w a r t i r e f . Czyli p o w ie d z ia ła so b ie coś takieg. p o z a k o ń c z e n iu d z ia ła n ia fu n k cji lik w id u je się śm ie­ ci . stała się te ra z w funkcji z e r z n a n a p o d p rz e z w isk ie m ref. z a m ia s t liczby 77 (w a rto ść zm ien n ej b). P oniew aż fu n k c ja zw raca ty p v o i d (p o p ro stu nic nie zw raca). to m im o w szy stk c b u d y n e k te n n a d a l stoi.144 Rozdz. zo stał w y sła n y a d r e s zm iennej b w p a m ię c i k o m p u tera. (K tóra to k o p ia p o c z ą tk o w o m iała ^ w a rto ść 44. że te n a rg u m e n t o d e b ra n y b y ł p rzez w arto ść.♦. P am iętam y . Ten a d re s z o s ta ł z lik w id o w a n y . co zo sta ło z lik w id o w a n e . ale in n i . ż e ten arg u m en t. na m om ent p r z e d „eg zek u cją" w y p isu je m y jeszcze w arto ść d w ó ch p a ra m e tró w fo rm aln y ch wart. My. Funkcje Przesyłanie argum entów przez referencję © W ew n ątrz fu n k cji zer. k tó ry to o b ie k t w e w n ą tr z funkcji p rz e z y w a liś m y ref. (Jeśli p o d rzem y k a rtk ę z z a p is a n y m ad resem ja k ie g o ś b u d y n k u . . b ęd ąc już w m a i n w y p isu jem y n a ek ra n ie w artości zm ien n y ch a i b. w ię c n a sto sie m ieliś­ m y z a n o to w a n y ad res tego o b ie k tu . Dlaczego ? O tóż w tym p r z y p a d k u d o funkcji. G dybyśm y chcieli b y ona k o n ieczn ie była. T en a d re s fu n k cja sobie o debrała i (n a sto sie) stw o rzy ła so b ie referencję. k tó ra p o jaw ia się na ek ran ie w id ać. d la te g o m ożem y sobie tu o s z c z ę d z ić instrukcji return. n a k tó rą w main m ó w iło się b. że ta k się stało w istocie . 2) Drugi a r g u m e n t p rzesy ła n y b y ł p rz e z referencję. k tó ry fu n k cja p rzy jm o w a ła s ta ry m sposobem (p rzez w artość) n ie został z m o d y fik o w a n y . W na­ szym p rz y p a d k u to w pisanie tam zer. jak p a m ię ta m y .m ają te n a d re s u siebie z a n o to w a n y . z a te m kom órce p a m ię c i o p rzy słan y m m i a d re sie n a d a ję p se u d o n im (p rz e z w isk o ) ref.w y p isu je m y ich w a rto ść na ek ran . P o d k reślm y jasn o : ta sam a kom órka.

gdy taka funkcja jest w y w o ły w an a bardzo w iele razy. To w łaśnie z pow odu takich sytuacji ten sposób przesyłania arg u m e n tó w został d o języka C++ w pro­ w ad zo n y . bow iem . dziesiątków .Rozdział. N asze zm ienne w jakim ś fragm encie p ro g ram u zm ieniają się. a k tó ry przez referencję. że może dla piszących kom pila­ tory byłoby to tru d n e w realizacji. Jeszcze innym sposobem przesłania arg u m en tu m oże być p o słu żen ie się tzw. nie chodzi o to. że przesłanie ich przez w artość (w ym agające zro b ien ia kopii np. N ie m a więc ostrzeżenia: aha. setek bajtów ) pow odow ałoby znaczące spow olnienie w yw oływ a­ nia takiej funkcji. N iezauw ażony. D otyczy to też nazw funkcji. . W p rzy p ad k u . bo z w y w ołania funkcji z e r w środku m a in © nie w idać. O tóż przesy łan ie przez referencję jest prostą d ro g ą d o pisania p ro g ram ó w b ardzo tru d n y ch d o później­ szej analizy. że sposób ten stosuje się d o tak dużych obiektów . D laczego zatem tak w sp a n iały język jak C (klasyczne) nie p o zw alał na to? W idocznie były po w o d y . K iedy d eklaracja fu n kcji nie je s t k o n ie c zn a ? Jak w spom nieliśm y . Ten sposób om ów im y bliżej w rozd ziale o w skaźnikach. spotkałeś ju ż taki w łaśnie sp o só b przesłania a rg u m e n tó w d o funkcji. N ie. Pow ody są inne. n a w e t prym ity­ w n y ch językach p ro g ram o w an ia. k tóry arg u m en t p rzesy łan y przez w artość. k ażd a definicja (funkcji) jest także p rz y okazji jej deklaracją. może to być czynnikiem w ażnym . w sp o só b n ie zau w ażo n y n a skutek d ziałan ia jakiegoś innego fragm entu p ro g ra m u (innej funkq'i). kiedy się b ardzo przydaje. Funkcje. 5. hola! C hciałbym C ię tutaj przestrzec. N a p ew n o w innych. n a co nie p o z­ w alało p rzesyłanie arg u m e n tó w przez w artość. O tych sytuacjach będziem y jednak m ów ić dokładniej w dalszych rozdziałach. Są jednak sytuacje. jak pam iętam y.k ażda nazw a przed odniesieniem się do niej (po prostu użyciem jej) m usi zostać zadeklarow ana. Jednakże. Funkcje 145 Kiedy deklaracja funkcji nie jest konieczna? Programistów klasycznego C opanowała na pewno teraz euforia: „-W reszcie jest łatw y sp o só b m odyfikow ania argum entów ! To. Tutaj tylko w spom nę. staje się w reszcie możliw e d zięk i przesyłaniu p rz e z referencję!" H ola. m uszą w ięc być d eklarow ane i robi się to w sposób. ten arg u m en t m o że być tam m odyfikow any! Ten sp o só b przesyłania arg u m en tó w do funkcji pow inien być w ięc zasadniczo u n ik an y . w skaźnikiem . m im o że tam nie n azw ał się on przesłaniem przez referencję. o którym już m ów iliśm y.

-***■***★ ***■******■******* //*★★*★*★**★**★★**★***************'******.czemu nie ? Z /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ’ int main() { funkcj a _ g o r n a (). c z a ją c ją n a g ó r z e p r o g r a m u . funkcja d o l n a ().c z y po. a w y w o ła n ie n a s tę p u je \ linijce p o w y ż e j d e fin ic ji tej fu n k cji —w ó w c z a s k o m p ila to r z a p r o t e s tu je k o m u n . b o się n a n: n a tk n ą ł p o w y ż e j. // deklaracją. W p r o g r a m a c h w ię k s z y c h n ie r a d z ę n a ty m p o le g a ć i p o p r o s tu d e k la n w a ć w c z e ś n ie j w s z y s t k ie fu n k cje. (b o n ie b ę d z ie je s z c z e z n a l n a z w y tej fu n k c ji z ż a d n i d e k la ra c ji). K o m p ilu ją c lini k ę © k o m p ila to r z n a ju ż d e k la ra c ję fu n k c ji funkcj a_gorna. void funkcja d o l n a (void) / / O d e fin ic ja k t ó r a t e ż j e s t . Jeśli n a to m ia s t fu n k c ja n ie je st o s o b n o d e k la r o w a n a . ż e w ty m m ie jsc u k o m p i la t o r n ie z. k a te m o b łę d z ie .to n ie trz e b a o s o b n e j d e k la ra c ji t( funkcji. Ł atw o p rz e c ie ż z ro b ić ( k o p iu ją c w e d y to rz e p ie r w s z ą lin ijk ę d e fin ic ji f u n k c ji i u m ies. .146 Rozdz. ale niestety spóźnioną ! / / dla uproszczenia pusta funkcja . T o d la te g o . N a s z a f u n k c ja main m o g ła b y b y ć d o w o ln ą fu n k c ją w y w o łu ją c ą d w in n e . k t ó r a to d e k la r a c (łą c z n ie z d e fin ic ją ) z n a jd u je się k ilk a lin ije k n iż e j O . T o. p o z n a ł się je s z c z e z d e k la ra c ją fu n k c ji f u n k c j a d o l n a . ż e jej d e fin ic ja n a s tę p u je p o lin ijc e w y w o ła n ia . ) . Funkcje Kiedy deklaracja funkcji nie jest konieczna? Jeżeli w ię c w p lik u d e fin ic ja fu n k cji je s t w c z e ś n ie j (p o p r o s tu w y ż e j) n iz linijka ja k im k o lw ie k w y w o ła n ie m tejże fu n k c ji . cz d a n a fu n k c ja je s t przed.ła tw e je s t d o o p a n o w a n ia w n ie w ie lk ic h p ro g r.z a o p a tr u ją c p r z y o k a z ji w ś r e d n i k ) . m a c h . M o im z d a n ie m n ie m a s e n s u p r ó b o w a ć o s z c z ę d z a ć n a d e k la r a c ja c h . N ie c h o d z i tu b y n a jm n ie j o p o z y c ję fu n k c ji w s to s u n k u d o s p e c ja ln e j fu n k c irta in . Z u p e łn ie in a czej je s t z w y w o ła n ie m f u n k c ji f u n k c j a _ g o r n a . w lin ijce O . B łą d b y łb y t e n sa m . O to ilu stra c ja o b u p r z y p a d k ó w : / * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ******************** ł v o id f u n k c j a _ g o r n a (void) / / O d e f i n i c j a k tó r a // j e s t t e z d e k la r a c ją // dla uproszczenia pusta funkcja . 5. N a le ż a ło z a te m p a m ię ta ć .czemu nie ? //* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ■ * * * * ’'* * * * * * * * * * ’ Jeśli s p r ó b u je m y s k o m p ilo w a ć p o w y ż s z y p r o g r a m o tr z y m a m y k o m u n ik a t b łę d z ie k o m p ila c ji w lin ijce © .

Stąd też C++ m a opinię tak ieg o języka..Rozdział. Są to tak zw an e arg u m e n ty dom niem ane. k tóra W as spotka. break. że k o m p ilato r C++ tak krytycznie p atrz y na tekst p ro g ram u .. a le nie w ym agane. kom p ilato r robił m ilczące założenia co d o ty p u arg u m en tó w i typu w artości zw racanej p rzez funkcję. g d y p ro g ram y w C będziecie przerabiali na C++.d o której zachęcam. Funkcje 147 A rgum enty domniemane Przyjm ując taką z a sa d ę u w alniam y się od p am iętan ia. W języku C deklaracje takie (zw ane tam predefinicjam i lu b p ro to ty p am i fun­ k i i ) były zalecane. Jeśli ich w ięc nie zam ieszczaliśm y. gdyż już w trakcie przeróbki okazało się. case 1 : cout « (stopnie +273) << " K\n". bez żm u d n e g o procesu u rucham iania. będzie w łaśn ie sp raw a braku deklaracji funkcji. break. Kiedy przerabiałem na C ++ jeden z moich dużych programów w C. w— 5. int skala) { cout << "Temperatura komory: switch(skala) < case 0: cout « stopnie « " C\n". case 2: cout « cels_to_fahr(stopnie) « " F\n". W eźm y taki przykład: /Z************************************************************ void temperatura(double stopnie. . U w a g a d la p ro g ra m istó w k la s y c z n e g o C Jed n ą z pierw szych niem iłych rzeczy. break. D zięki tem u. Uwaga: Niedawno wspominałem. ale bardzo szybko się opłaciło.-musiałem zrobić deklaracje wszystkich funkcji.7 Argumenty domniemane D o pochopnego przesy łan ia argum entów p rz e z referencję nie zachęcałem . i m II mu T II r lim iim i i iii ttilu r m n imiKrnn m a * * n u r — — . że niektóre wywołania funkcji nie zgadzały się dokładnie z definicjami. 5. w k tó ry m program y . . która funkcja jest pow y­ żej której. Je st z a to w C++ in n a nowość w arg u m en tach funkcji (w sto su n k u do C klasycznego) ..działają od razu . m u . ) ) .jeśli p rzeb rn ą przez kom pilację . taki na 25 tysięcy linijek. że specjalnej funkcji o nazwie ma in ­ nie deklaruje się. dużo b łę d ó w w y k ry w an y ch jest już na etapie kom pilacji. Zabrało mi to trochę czasu.

T e m p e r a t u r a je s t a r g u m e n te m p r z y s y ł a n y m d o f u n k c ji. to o n d o m n iem yw a . w t e d y k o m p i la t o r . t e m p e r a t u r a ( 5 2 . ż e je s t w b ib lio te c e . D o z a m ia n y s t o p n i C e ls ju s z a n a F a h r e n h e i ta m a m y ja k ą ś f u n k c ję double cels_to_fahr(double stopnie) . s ł u ż y d o w y d r u k u in f o r m a c ji o te m p e r a ­ tu r z e . P o d k r e ś la m : . J a k d o t ą d . J e d n a k ż e z a k a ż d y m r a z e m . c z a s e m w s to p n ia c h K e lv in a . S ta r y s p o s ó b z d w o m a a r g u m e n ta m i te ż je s t d o p u s z c z a l n y . m u s i m y ja k o d r u g i a r g u m e n t w y s y ła ć to n ie s z c z ę s n e z e r o . ż e a r g u m e n t j e s t d o m n i e m a n y .5. int skala = 0 ). T e m p e r a tu r a p r z y s y ła n a je s t z a w s z e w s to p n ia c h C e ls ju s z a . 2). ta k ja k m u to w d e k la r a c ji p r z y k a z a l i ś m y . 0).o ty m . C z y l i z je d n y m ( ty l k o p ie r w s z y m ) a r g u m e n t e m . A p r z e c ie ż . D o tej p o r y n ie b y ło je s z c z e n ic n o w e g o . ja k ła t w o s ię z o r ie n to w a ć . a c z a s e m w s to p n ia c h F a h r e n h e ita . w d e k la r a c ji f u n k c ji.3 ). Z o b a c z m y jak z n a s z e j f u n k c ji t e m p e ­ r a t u r a k o r z y s ta m y . t e m p e r a t u r a (100. s p r a w i to .5. 0). P o to s ą w ł a ś n i e a r g u m e n ty d o m n ie m a n e . w ja k ie j s k a li m a m y a k u r a t w y p is a ć b ie ż ą c ą te m p e r a tu r ę . z a l e ż y o d d r u g ie ­ g o a r g u m e n tu . ta k ż e w s z y s t k o je s t p o s t a r e m u .to w s t o p n i a c h F a h r e n h e ita . 2 ) . to w d e f in ic ji j u ż s ię te g o n ie p o w t a r z a . ż e c h o d z i o s k a l ę C e ls ju s z a . Funkcje A rgum enty domniemane F u n k c ja ta . t e m p e r a t u r a ( 2 0 . T o .je s t t e r a z n ie is to tn e . a je śli r ó w n y 2 . g d y p y t a m la b o r a n ta o t e m p e r a t u r ę w r z e n ia w o d y i n ie d o d a je w ja k ie j s k a li. in f o r m u je m y k o m p i l a t o r r a z . O to p r z y k ł a d o w e w y w o ł a n ia : t e m p e r a t u r a (52. 0) . C z y k o m p i l a t o r n ie m ó g łb y s ię te ż in t e l i g e n t n i e d o m y ś lić ? M ó g łb y . 5. J e ś li d e f in ic ja j e s t p ó ź n ie j. A te r a z z a s t a n ó w m y się: w n a s z y m p r o g r a m i e s e tk i r a z y d r u k u j e m y te m p e r a ­ t u r ę w s k a li C e ls ju s z a . 0). g d y c h c e m y w y d r u k o w a ć w s k a li C e ls ju s z a . ż e d r u g i a r g u m e n t je s t r ó w n y 0. je śli 1 — to w K e lv in a c h .148 Rozdz. g d z ie o n a je s t i ja k je s t z r e a liz o w a n a . t e m p e r a t u r a (60. t e m p e r a t u r a ( 5 2 . W y s ta r c z y w n a s z y m p r z y p a d k u d e k l a r a c ję f u n k c ji n a p i s a ć ta k : void t e m p e r a t u r a ( do u bl e stopnie. O d tej p o r y w o ln o n a m tę f u n k c ję w y w o ł y w a ć ta k ż e z j e d n y m a r g u m e n t e m . D la u p r o s z c z e n ia z a łó ż m y .1 . je d n a k n a e k r a n c h c e m y tę te m p e r a t u r ę w y d r u k o w a ć c z a se m w s t o p n i a c h C e lsju sz a . k o m p i l a t o r d o m n i e m a .5. ż e je śli w n a s z y m p r o g r a m i e w y w o ł a m y f u n k c ję n p . n a to m ia s t b a r d z o r z a d k o w in n y c h s k a la c h . T o . J e ś li je s t o n r ó w n y 0 — to w s to p n ia c h C e ls ju s z a . ta k t e m p e r a t u r a ( 66 .

14. że jeśli funkcja jest w p ro g ram ie n a p isa n a pow yżej jakieg o k o lw iek jej w y w o łan ia.14 multi (2. //a = 7 .y = 0. co kazaliśm y w w yw ołaniu funkcji.14.3).3).55. //domniemywa się: skala = 0 // poniżej nic się nie musi domniemywać. Z a te m p o n iższe s p o so b y w y w o łan ia są le g a ln e temperatura (100. 5). // chcesz w Fahrenheitach. 3.3. by funkcja m iała kilka a rg u m e n tó w d o m n iem an y ch . N ie d la teg o . int a = 4. // !!! je st trak to w a n e jako b łą d . d o b ry k o m p ilato r n ie p o w in ien się na ta k ą po w tó rk ę zgodzić. 3.55. 0.14. 5.. 7. N a zakończenie jeszcze raz podkreślm y: A rg u m e n ty d o m n ie m a n e określa się w deklaracji funkcji. 7.Rozdział. y = 6.2). 6 . żeby k o m p ilato r nie potrafił sobie d a ć ra d y z zapisem . K o m p ilato r znow u robi to w naszym interesie. 0. które kom b in acje są d o p u szcza ln e. O to p rz y k ła d y w y w o ła ń tej funkcji. 3. to o d d zieln a deklaracja tej funkcji nie jest . alb o p o prostu n iep o trzeb n ie napisały nam się d w a przecinki. y. 7. Z a s a d a jest p ro sta i logiczna: W ję z y k u C + + n ie m o ż e w y s tą p ić ta k a s y tu a c ja .i— t—*—n r . (n ie-d o m n iem an e) a rg u m e n ty i sp raw a jest jasna: 2 i 3.i»r>Mr>iHiiimTnriMitri"i~Tt''' tmt.3. double y = 6. Funkcje 149 A rgum enty domniemane n ie m u si nic d o m n ie m y w a ć . W k o m e n tarzac h podaję jakie w arto ści mają w ó w c z a s arg u m e n ty a. N aw et jeśli w definicji n ap isalib y śm y te sam e w artości d o m n iem an e.55. To d la teg o . / / a = 4.1). k = 10 multi (2. 3. Z a te m w yw ołanie ty p u m u l t i (2. y = 6. W definicji nie. Ł t m — uwiii.y = 0. k =5 N ie jest m ożliw e o p u sz c z e n ie d o m n iem an eg o arg u m e n tu a lu b y. 0 ) . N ie trzeba się tu nic uczyć. bo 0 temperatura (50.3. a które nie. // chcesz w Celsjuszach. // chcesz w Keluinach. a u m iesz­ cz e n ie arg u m e n tu k. k = 10 multi (2. bo 2 Jeśli chcem y.•trT rr T -^ -‘^*ŁT ' 1" r ^ •**■«■■■»#■> ■■ »Tinrłi«ifiT> irnm»«nim— ■ mtJt Taka sy tu acja u w ażan a jest jako b łąd literow y. ż e o b o k s ie b ie s to ją dw a p rz e c in k i. k. bo są to zw ykłe. . że g d y b y k o m p ilato r zezw olił nam na z ap isy z d w o m a p rzecin k am i - to tym sam y m znieczuliłby się na w szy stk ie p rz y p a d k i. bo jest napisane jasno temperatura ( 3 6 . gdzie rzeczyw iście zapom nieliśm y o jak im ś arg u m en cie. 3. O s ta tn ie a rg u m e n ty (jako dom niem ane) m o g ą w ięc być w n iek tó ry ch w y w o ła­ n ia c h tej funkcji o p u szcza n e. 7 ). to arg u m e n ty ta k ie m u szą być na k o ń cu listy int multi( int x.14). k = 10 multi (2. int k = 10). / / a = 7.14. 5 ) . l/a = 7 . bo 1 temperatura (159.8. A le: M ów iliśm y k ied y ś. ab y z a p a m ię ta ć .3. double m. po prostu ro b i to. A rg u m en tó w x i m nie podaję.

gdy nazwy argumentów s£ opuszczone? O czy w iście tak sam o. Z ałó żm y . b o jest trochę za b ard zo szczegółow y. Słowa.1 C iekaw ostki na temat argumentów dom niem anych T e ra z trochę ciekaw ostek. Sam a definicja funkcji jest w ted y także jej p ierw szą w y stęp u jąc ą w ty m p ro g ram ie deklaracją. że deklaracja funkcji inform uje k o m p ila to r jedynie c typie i ilości a rg u m e n tó w . co domyślny morderca. U opuszczone nazwy argumentów . g d y d o w ia d u je się. żeby kom pilator o arg u m en tach d o m n ie m a n y c h danej funkcji d o w ied ział się tylko raz . Z o id f l i n t . d o u b le drugi).150 Rozdz. II opuszczone nazwy argumentów Z ałó żm y . d o u b le ) . słowa. Jeśli jesteś początkującym . co to za funkcja (czyli w tedy. by d ek laro w ać w szystkie funkcje. m ożesz ten p a ra g ra f o p u ś­ cić.w ted y . że inform acje te są m u potrzebne w tedy. W 5. Funkcje A rgum enty domniemane p o trzeb n a.a że jest nią tutaj ak u rat definicja funkcji . Z a s a d a jest taka: C hodzi o to. g d y o p raco w u je w y w o łan ia tej funkcji w program ie. w y g lą d a ć taka deklaracja: v o id f ( i n t = 4. K ró tk o m ów iąc p o n iższe dw ie deklaracje są sobie ró w n o w ażn e: v o id f ( i n t pierwszy. Pytanie: Jak zaznaczyć. N ie tru d n o się do m y ślić. że w po w y ższej funkcji m ają być d w a argum enty d o m n iem an e. ż e m am y w zw yczaju w deklaracjach funkcji o p u sz c z a ć nazw i a rg u m e n tó w . K ied y ś m ów iliśm y o tym . G d z ie w ted y określić a rg u m e n ty dom niem ane? O czyw iście w d ek laracji . O to. słowa N iek tó rz y zam iast m ów ić: domniemany. m ów ią: domyślny. b y te o p u szczo n e p rz e z nas a rg u m e n ty u zupełnić. 5. jak pow inn.7. jak na w stę p n y etap n a u k i. Zateir p rzesk o cz teraz na stro n ę 156.jeśli b ęd ziesz się trzyma! z a s a d y .to robim y to tutaj. w ięc nazwy tych arg u m e n tó w m o żn a opu szczać. jakby nazw y argum entów ta m były. że argumenty są domniemane. P am iętaj jed n ak . że domniemany morderca to nie to sam o. d o u b le = 2 0 ). g d y dociera do niego deklaracja). N ie m usisz się tą sp ra w ą zu p ełn ie interesow ać . K om pilator m u si to już w iedzieć w m om encie.

jeśli zobaczysz to w cudzym programie. // <—błąd. ż e p ierw sza d ek laracja m ów i. jakby w y stąp iła jedna taka deklaracja: void g(int a = 4. n ato m iast nie m ó w i nic o arg u m e n cie b. Z a g a d k a : C zy p o p ra w n e jest takie p o w tó rzen ie deklaraq 'i? Jaki m a efekt? void g(int a. int b = 6) U ok. // ok. w k ażd ej n astęp n e j p o w tó rzo n ej deklaracji). T ak . K o m p ilato r w trakcie kom pilacji d a n e g o plik u m o że (w d an y m z a k re sie w ażn o ści) n ap o tk ać deklarację argumentu domniemanego tylko je d n o k ro tn ie . Spójrz na p o n iższy z e sta w deklaracji: .n ie jest tak łatw o. int b). K ró tk o m ów iąc: jeśli już chcem y sto so w ać tak ą sztu czk ę. int b = 6). void fun(int a. n ie o p u szczając p rz y ty m ż a d ­ nego. p ra w d a ? A je d n a k jest p o p raw n y . pierwsza deklaracja arg. N a to m ia s t taka kolejność deklaracji void g(int a = 4.Rozdział. że b łę d e m b ę d z ie w y stąp ien ie takich d w ó ch deklaracji o b o k siebie w je d n y m pliku. Funkcje 151 A rgum enty domniemane Z a sk a k u ją c o w y g lą d a ten zapis. ż e b ę d z ie m y się z ty m i a rg u m e n ta m i d o m n ie m a n y m i p o su w ali w stro n ę p o czątk u . p o d w aru n k iem . domniemanego void fun(int a. int b). że a rg u m e n t o n azw ie a je st d o m n iem an y . int b = 8). // a co z wartością b 1 void g(int a int b = «' jest n ie p o p ra w n a . k tó ry (jako n astę p ju ą c y po d o m n ie m a n y m ) też p rzecież m u s i być d o m n ie m a n y . 5. N a w e t g d y b y ta p o w tó rn a d ek laracja d e k la ­ ro w ała d o k ła d n ie tę sam ą w a rto ść tego a rg u m e n tu . void g(int a = 4. redeklaracja arg.b ęd zie o d rz u c o n a . Ale w swoim własnym . ż e d eklaracja (na p rz y k ła d funkcji) m oże w y stą p ić w ie­ lo k ro tn ie (n ato m iast definicja tylko je d n o k ro tn ie). void fun(int a. ż e d e k laru jem y te a rg u m e n ty "na raty" (p o k aw ałk u . Przypominają one o znaczeniu tych argumentów. Nie bądź zaskoczony. int b = 6). Efekt tej instrukcji je st ta k i sam . Z n a c z y to. jest to p o p ra w n e . pierwsza deklaracja arg. int b). int b = 6). W p rz y p a d k u a rg u m e n tu d o m n ie m a n e g o . bo w każdej z nich . 4 M ó w iliśm y n ie d a w n o . int b). domniemanego N a to m ia s t p o p ra w n e jest tak ie p o w tó rzen ie dek laracji void fun(int a. int b = 8). N ie ma p o w tó rzen ia.d ek laracja je d n eg o z a rg u m e n tó w d o m n ie m a n y c h jest p o raz pierw szy. to m o ż em y tak robić.lepiej te nazwy argumentów umieszczać. void funfint a. domniemanego c z y w o d w ro tn ej kolejności void fun(int a. Z a u w a ż .

II błąd. ale nie zostaje p o in fo rm o w an y o jego dom n ie­ m anej w artości. in t. że w w y ra ż e n ia c h tych n ie m o g ą w y stąp ić Io b ie k ty lo k aln e (au to m aty czn e). a zakres ważności Nie tylko wartości liczbowe. in t). in t. W trakcie p racy nad tą d ek laracją kom pilator d o w iad u je się. N a p rz y k ła d (x + 2 ) alb o (x * y ) P am iętać jed n ak należy. ale ro zu m ie w obec te g o . i n t . i n t ) . W ostatniej linijce jest błąd. że a rg u m e n t pierw szy jest ta k ż e do m n iem an y (i poznaje tę d o m n iem an ą w artość). że arg u m e n t d r u g i też m u si być d o m n iem an y... i n t = 33. Funkcje A rgum enty domniemane v o id f 4 (i n t . M ogą je d n ak w ystąpić tam ta k ż e w y rażen ia. W d o ty ch czaso w y ch p rzy k ła d ach w arto ścia m i d o m n ie m a n y m i a rg u m e n tó w b y ły liczby. że w szystkie dalsze arg u m e n ty też są dom niem ane.152 Rozdz. D o w y ra ż e ń n ależą na p rzy k ła d w y w o ła n ia funkcji (zw racający ch w arto ść o d p o w ie d n ie g o ty p u ). i n t . in t. in t = 44. i n t ) . in t. W trakcie kom pilacji pierw sze trzy linijki inform ują k o m p ilato r o coraz to now ym arg u m en cie dom niem anym i w każd ej chw ili k o m p ilato r potrafi podać dom n iem an ą w arto ść każdego z nich. • O arg u m en tach od trzecieg o do piątego d o w ie d z ia ł się już p o p rzed n io i poznał też ich w artości d o m n iem an e . bo także wyrażenia. i n t = 5 5 ). To jest błąd! Deklaracja argumentu domniemanego. in t . • T u do w iad u je się (p o śred n io ). co p raw d a. 5. v o id f 4 ( i n t . i n t . v o id f 4 ( i n t . in t. (nawet funkcje). v o id f 4 ( i n t =11. . i n t .

. Oto długo oczekiwany przykład: #include <iostream> using namespace std . f un k c j a () . 5. // O // <. // argumentem może być skomplikowane wyrażenie. n a to m ia st o w a w arto ść d o m n ie m a n a a rg u m e n tu . //00 globalnyl = 4 + lokalnyl. //< -błąd! //oo funkcja(7). // © /Z ************ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * int main() { f unkcja(). // O // void funkcja(int a = 3. int b = lokalnyl ). int b) cout << "Naprawdę nastąpiło wywołanie: funkcja(" << a << ".w argu­ mentach wyioołania tych funkcji nie powinno być obiektów lokalnych automatycznych.Jesteśmy w zakresie lokalnym\n". } // © int globalnyl = 32 . void funkcja(int a = 2. / /4—błąd void funkcja(int a. / / < . int). //O © funkcja O . // O int kwadrat(int x) ( return x * x. int b = 8). // w y w o łu je m y je s z c z e "po sta rem u " funkcja(). //O © ) Z /*** * * * * * * * * * * * * * * * ****************************************** void funkcja(int a. //O O ) // o© cout << "-.błqd // void funkcja(int a..Rozdział. ) //**•***•****************★ ************************************** .o b liczan a jest już w c z a sie w y k o n a n ia p ro g ra m u . int = 6).Jesteśmy poza zakresem l o k a l n y m W .o tw a rc ie lo k a ln e g o zakresu © cout << "--. void funkcja(int a =kwadrat(globalnyl). Funkcje 153 A rgum enty domniemane Jeśli zamierzmy z tego skorzystać-to w myśl powyższej zasady . inc b) . P o p ra w n o ść s k ła d n io w a tak ich w y rażeń s p ra w d z a n a jest o czy w iście w trakcie kom p ilacji. I I <G> / / od tej poru "po staremu" wywołać już nie można //funkcja (). // © int lokalnyl = 2 . " << b << « endl.

D ru g i arg u m en t jest d o m n iem an y . ♦♦♦ albo zrobić w szy stk o od nowa. . a jego w artość u staw iam y na 8. w tym zakresie w ażn o ści. b. To w łaśnie w y w o łu je tu protest kom p ilato ra. Z atem tu taj cała zabawa z d ek laro w an iem arg u m en tó w d o m n iem an y c h musi zaczać sie od now a. G d y b y śm y p o stan o w ili nic nie zm ieniać. pojaw ia się deklaracja tej funkcji. że dotychczasow e dom n iem an e a rg u m e n ty są w mocy. Funkcje A rgum enty domniemane Po wykonaniu tego programu na ekranie zobaczymy tekst Naprawdę nastąpiło wywołanie: funkcja(2. na tym m ógłby się ten przykład zakończyć. o » Napraw dę nastąpiło wywołanie: funkcja 7. R zu t oka na ek ran p rzek o n u je n as.154 Rozdz. 5.w ż ąd n y m w rażeń . © Skoro trzeba zacząć o d d ru g ieg o a rg u m e n tu . O W lokalnym zak resie m ożem y zdefiniow ać jakiś obiekt au to m aty czn y . O czyw iście nam . O W yw ołanie tej funkcji bez żadnych arg u m en tó w . Jest to w y w ołanie bez ż a d n e g o arg u m en tu . . ale skoro tu. © W lokalnym zak resie w ażności znow u w yw ołujem y f u n k c j e . D laczego. na ek ran ie m o żesz zobaczyć.o k azu je się błędem (kom pilator protestuje). Poniew aż funkcja jest gada­ tliw a". czyli tym sam y m now ego zak resu w ażności. Spójrz na ciekawsze punkty tego programu O D eklaracja funkcji o n azw ie f un k e j a z d w o m a argu m en tam i d o m niem anym i. © O tw arcie lokalnego b loku. ż e ustaw ienia z p o p rzed n ieg o zakresu w ażn o ści zostały po deklaracji © zap o m n ian e. )* Naprawdę nastąpiło wywołanie: funkcja(36. zróbm y tak Jak o w arto ść dom nie­ m a n ą dajem y lokalną zm ienną l o k a l n y 1. D lateeo że co p ra w d a . -. . Tutaj m am y szansę: * albo nic w sp raw ie tych arg u m e n tó w d o m niem anych nie zm ieniać. że rzeczyw iście w y w o łan ie o d było się z uży ciem w artości dom niem anych.jesteśmy w zakresie lokalnym Naprawdę nastąpiło wywołanie: f u n k c ja 2. © P róba deklaracji funkcji f u n k c j a ze z m ian ą w artości d o m n iem an ej pierw szego arg u m e n tu . zró b m y tu grzeczną deklarację funkcji. . 6). A od now a nie m o ż n a zaczynać d ek laru jąc jako dom nie­ m a n y a rg u m e n t pierw szy . . W bardziej zew n ętrzn y m zakresie by ło o n o m ożliw e (U). T eraz jed n ak jest ju ż błędem . 8).nie o to chodzi.Jesteśmy poza zakresem lokalnym Naprawdę nastąpiło wywołanie: funkcja (2. bo w ażna jest deklaracja © . d rugi arg u m en t m iał w „bardziej z e w n ę trz n y m " zakre­ sie w artość d o m n iem an ą . um ieściłem to w yw ołanie. a d rugi nie. . © K oniec dziw actw . -. O O Ż eb y Ci u d o w o d n ić. . to od tego miejsca tam te w artości zo stają zapom niane. Z now u błąd k o m p ilato ra w yraże­ n ie z lokalną zm ien n ą nie m oże być w artością d o m n iem an ą.

O d tej p o ry ten p ie rw sz y a rg u m e n t także staje się d o m n iem an y . Spójrz na e k ra n i przek o n aj się. k tó rą deklarujem y ja k o m ającą a rg u m e n ty d o m n ie m a ­ ne. że te ra z o b o w iązu je takie zło ż e n ie deklaracji void funkcja(int a. że obiekt 1 o k a l n y l (jako właśnie lokalny) nie mógłby tu być argumentem funkcji kw adra t. O d tej p o ry . // V © co o d p o w ia d a jakby takiej jednej deklaracji void funkcja(int a =kwadrat(globalnyl). to działa! P rzelicz sobie w pam ięci bieżącą w artość o b iek tu g l o b a l n y l p o d n iesio n ą do k w a d ra tu . P am iętajm y. że m a m y pro g ram sk ład ający się z kilku p lik ó w . O © K olejna. M oże się tak zdarzyć. Zobacz n a w y d ru k ek ra n o w y .unikajm y tego. int). w ra z z jego a rg u m e n ta m i d o m n ie­ m a n y m i —p rzech o d zi d o historii. jak w ty m p rz y ­ k ła d o w y m program iku. Jeśli definiujesz jak ąś w arto ść d o m n ie m a n ą . W je d ­ n y m z nich jest funkcja. O © W yw o łu jem y funkcje b ez żadnych a rg u m e n tó w i na ek ran ie w id zim y . Jak w obec tego um ieścić jej deklarację? M o żn a na d w a sposoby. Czy to zagadnienie nie przypomina Ci sprawy zasłania nazw? O d leg le chyba tak. ile razy w d alszy c h linijkach w y stą p i jakieś w y w o ła n ie funkcji. w tedy z o sta n ie u ru ch o m io n a funkcja kwadrat ( 0 ) z a rg u m e n te m w y w ołania g l o b a l n y l (© ). Z acy tu jm y ją: void funkcja(int a =kwadrat(globalnyl). int b = 8).chcem y tę fun k cję w yw oływ ać. Lokalny zakres. To w łaśnie w id z im y na ekranie. by zaw sze m iała tę sa m ą w artość i nie rób tak ich sztu czek . W różnych miejscach n aszeg o pro g ram u (czyli w różnych p lik ach ) . int b = 8). P o prostu b ard zo ła tw o się p o tem p o g u b ić.Rozdział. // - void funkcja (int a =kwadrat(globalnyl). ż e d ru g i a rg u m e n t m a w arto ść d o m n ie m a n ą określoną d la te g o zak resu . P ierw szy sposób: . „bard ziej u ściślająca" deklaracja funkcji. O © K ończy się lokalny zak res. Funkcje 155 A rgum enty domniemane O 0 W y w o łan ie funkcji z je d n y m argum entem . to staraj się. D ru g i jest d o m n iem an y . Przypominam. w k tó ry m nie b ęd zie p ie rw sz e g o (i tym sam y m d ru g ieg o ) a rg u m e n tu . że tak sam o n a le ż y je p o trak to w ać: jeśli to tylko m o ż liw e . W artość zw rócona p rzez tę fu n k cję kwadrat sta n ie się w arto ­ ścią w y słan ą jako p ie rw sz y a rg u m e n t do funkcji funkcja. M yślę. o o O to p rz y k ła d takiego w y w o łan ia. int). 5. że te ra z n a p o w ró t są w m o cy te arg u m e n ty d o m n ie m a n e s p rz e d lokalnego z a k re s u .

72). Była to na przykład funkcja: void ton(int wysokosc) .kom pilator nie zaprotestuje. że w szystkie pliki b ęd ą m iały tę samą w artość d om niem aną. że jeśli pew nego d n ia zm ienim y zdanie. albo. Dzięki tem u m am y pew ność.156 Rozdz. ale k o m p ila to r będzie nas ciągle od tej p o ry o strzeg ał . Co robić? O d p o w ied ź w y d aje się prosta: w yrzucić ten arg u m e n t z d ek laracji i definicji funkcji.p o p raw k ę w y starczy zrobić w tym jednym pliku nagłów kow ym . 5. str. który piszczy z a d u ż o . ż e w funkcji nie m a ża d n e j instrukcji .7. N ie jest to błąd. że program . Funkcje A rgum enty domniemane ♦> W k ażd y m pliku umieścić na g ó rze deklarację tej funkcji.sugerując. 5. (Definicji tej funkcji nie przytaczam . że teraz a rg u m e n t form alny w y s o k o s c nie zo stał ani raz użyty. pow odująca. (O dradzam !) Jest d ru g i bezpieczniejszy sposób: ♦> D eklarację tej fu nkcji (łącznie z w artościam i jej argu m en tó w dom niem a­ nych) u m ieszczam y w pliku nagłów kow ym .. Ten d ru g i sposób m a jeszcze tę zaletę.8 N ie n a zw a n y a rg u m e n t W yobraźm y so b ie taką sytuację. że m o ż e czegoś zap o m n ieliśm y . § 3. nie m a w yglądu n au k o w eg o . . że k o m p u te r zapiszczy je d n y m z sygnałów ostrzegaw czych. co do w artości dom niem anej arg u m en tu . razem z okreś­ leniem dom niem anych w artości jej argum entów . Funkcja ta do tej p o ry dobrze nam słu ży ła i w naszym p ro g ra m ie setki razy w yw oływ aliśm y ją w różnych miejscach. W olno nam tak - po p ro stu k ażd y plik jest innym zakresem ważności. alb o też u zn aliśm y . C h o d zi o to.to nie jest problem .3. M ożem y przecież naw et w k ażd y m z tych plików ustalić sobie zupełnie inne w arto ści dom niem ane. M ieliśm y funkcję w y w o ły w a n ą z jednym argum entem .. bo jej w y g ląd zależy od im plem entacji). (Por. P ew nego d n ia je d n a k zapragnęliśm y ciszy. W olno nam . Jeśli się p om ylim y i w jakimś z plików napiszem y nieco inną wartość jednego z arg u m en tó w . O argum entach dom niem anych b ędziem y m ów ić jeszcze kilkakrotnie. K rótko m ów iąc po drastycznym cięciu definicja naszej funkcji w y g ląd a tak: void tonfint wysokosc) { // funkcja jest teraz pusta ) N ie chodzi tu w ty m przykładzie o to. że p a ra m e tr o nazw ie w y s o k o s c słu ż y do w yb o ru w ysokości tonu. Daj­ m y na to. który w trakcie kompilacji. zostanie w staw iony do każd eg o z potrzebujących tej funkcji plików.

Tragedia. że tego cięcia dokonujem y w definicji. Jak bow iem p am iętam y . N a z w a zaw sze p rzy p o m in a m i do czego d an y arg u m en t m iał służyć. ale tego arg u m e n tu w funkcji nie używ am y. że jest to funkcja w yw oływ ana z jednym arg u m en ­ tem ty p u int. N iech nam więc o szczęd zi ostrzeżeń o ty m . co dla kom pilatora jest rów n o zn aczn e. Jest jed n ak wyjście: A rg u m en t nienazw any. } Jej deklaracja m ów i nam: zao jest funkcją w y w o ły w an ą z jed n y m arg u m en tem typu double. Jak poniżej: void ton(int) { } Jest to zn ak dla k o m pilatora. N iew ielką. Ze spojrzenia na ciało tej funkcji . że ma .w sam ej deklaracji n azw y argum entów form alnych (nie typy. że jest to funkcja służąca do "m atem atycznego" zao k rąg lan ia liczb rzeczyw istych do całkowitych. że zapom nieliśm y z nim cokolwiek zrobić. zaw iera niew iele instrukcji. będziem y mieli setki k o m u n ik ató w o błędzie nie znalezienia funkcji ton w yw oływ anej z jednym a rg u m e n te m typu int. że tam nic nie ma void ton(int /* wysokosc */ ) ( } a ja zachow uję w spom nienia. w y rzu cam y tylko jego n a z w ę . 5. d ro g i czytelniku. tylko nazw y) mogą istnieć lu b nie.czyli na instrukcje będące jej treścią - w id zim y . Do liczby ty p u double dodaje się 0. O tó ż. C o się w ted y stanie z tym i setkam i w yw ołań fu n k q i ton w n a s z y m program ie? (a m o ż e n aw et w jeszcze innych. że osobiście czasem tru d n o m i definity­ w n ie w yrzucić nazw ę. a nastę­ pnie tę w artość przedstaw ia się instrukcji return. Przykładow o: int zao(double liczba) { return (liczba + 0.5).Rozdział. K ażd y k o m u n ik a t-o d jednego w yw ołania funkcji ton w p ro g ram ie. jeśli funkcję ton traktow a­ liśm y jako biblioteczną). od tej p o ry zam iast jednego ostrzeżenia. Z w ró ćm y uw agę.5. a zw racającą typ int. że m am y niew ielką funkcję. M iało być lepiej. D latego ujm uję nazw ę w znaki kom entarza. Funkcje 157 Funkcje i n l i n e (w linii) Ł atw o pow iedzieć. K om pilator w d eklara­ cji i ta k nazw y te ignoruje (korzysta tylko z typów ). to znaczy jej definicja jest b a rd z o krótka. a jest gorzej. Funkcja ta w ie. 5. a typ arg u m en tu zostaje. N a ko n iec zd rad zę Ci. zam iast w yrzucać cały arg u m en t z definicji funkcji. In n y m i słow y.9 F u n k c je inline (w linii) Z ałóżm y. a nie w deklaracji funkcji.

Funkcje Funkcje i n l i n e (w linii) zw rócić ty p i n t .158 Rozdz. T ak ż e p o w y k o n an iu funkcji trzeba trochę posprzątać. czy li p rz e z odcięcie części ułam kow ej.5).2 + 0.3 ---------> 7 6. jed n ak jeśli naszą fu n k cję n a p ra w d ę z a m ie rz a m y w yw o ły w ać ty siące razy. W rezultacie taki k o d będzie w y k o n y w a ł się szybciej. a w ięc w arto ść stojąca k o ło r e t u r n zam ien ian a jest na typ i n t w najbardziej d ra s ty c z n y sposób. 6.jak w p rz y p a d k u funkcji (p ierw sze w y raże­ nie) O • szy b k o ść w y k o n an ia . k tó rz y m ają jakieś d o św ia d c z e n ie z p ro g ram o w an iem w asem ble­ rze w iedzą. 7 ) . © Tak: w łaśnie w lin ię . z w y jątk iem tego słow a i n l i n e . w ięc też jest niew ielka p raca d o zrobienia.5).5 = 6. C o p raw d a. N ie b ęd zie w ięc żad n y c h akcji zw iązan y ch z w y w o ła n ie m i po­ w ro tem z tej funkcji. M am y w ięc w ybór: alb o posłu g u jem y się tą funkcja (jak w p o n iż sz y m w yrażen iu ) 1 . C o o n o daje? O tó ż teraz.2 N aszą funkcję d efin iu jem y tak: inline int zao(double liczba) return (liczba + 0. b ard zo często posługujem y się tą funkcją. to czas zu ży ty na w y w o ła n ie i p o w ró t m o że stać się znaczący.zao(m ) + z a o ( n * 1 6 .pokazuje po n iższy zapis. ż e za w y w o łan ie funkcji tro ch ę się płaci. że w n aszy m p ro g ra m ie b a rd zo . Zostaje sam a w artość całk o w ita i to w łaśn ie z w ra c a funkcja. w języ k u C ++ k o szt w y w o ła n ia funkcji jest rela ty w n ie niski.5 = 7.jak w p rz y p a d k u w p is a n ia tego algory­ tm u zao k rąg lan ia w linię. C o robić? Jest w sp a n iałe w yjście ko m p ro m iso w e.8 i 6. 1 = (int) (m + 0.2 . P o zw ala ono na • jasn o ść zap isu . M usi na p oziom ie języka m aszy n o w eg o w y stą p ić kilka instrukcji. II ® albo rezy g n u jem y z niej i zao k rą g lam y „ n a p iechotę" w p isu jąc alg o ry tm zaok­ rąglania w linię w y rażen ia. } Różnica ż a d n a .czyli po angielsku: in linę. Jak to się d zieje w p rz y p a d k a c h d la liczb 6.7) + 0. . ile razy w p ro g ram ie u m ieścim y w y w o ła n ie funkcji z a o . k o m p ilato r u m ieści do sło w n ie jej ciało (treść) w linijce.5) + (int) ( (n * 16. ale ostatecznie m o że się nam nie chcieć w setkach lin ii z p o d o b n y m i w y ra ż e n ia m i w p isy w ać ten ko d . H © T en d ru g i z a p is w y k o n a się szybciej. k tó re obsługują to specyficzne przej­ ście w in n e m iejsce p ro g ram u . 2) [czytaj: „yn lajn"J. w której to w y w o ła­ nie nastąpiło.7 ---------► 6 Z ałóżm y te ra z. C zytelnicy. 5.8 + 0.

że potrafi sobie z n ią radzić. a to dlatego. Jeśli funkcja jest typu inline. T era z jednak chodzi o sp ra w ę pow ażniejszą. iż: Z d ru g ie j stro n y . g d y ch o d zi o szybkość i łatw o ść zap isu . To nic.słow o i n l i n e sp raw ia. W innych p rz y p a d k a c h objętość p ro g ra m u m oże się zw ięk szy ć. a k o m p u te r i tak sam za m ie n i sobie to na 0 . a nawet statycznych! P am iętaj je d n ak . g d y k o m pilujem y ją dla p racy z p ro g ram em u ru ch o m ien io ­ w y m tzw . Funkcje 159 Funkcje i n l i n e (w linii) W y tłu m a c z m y to jeszcze prościej: .zw an ą czasem żarto b liw ie o u t l i n ę . d ebuggerem . P o to. że.. Jeśli nie skorzysta. o d tej p o ry m ożem y sto so w a ć zap is jak w O . Jeśli jed n ak potem sk om pilujem y pro g ram jeszcze raz „na czy sto ". to kom pilator zach o w a się tak. by s p ra w d z ić popraw ność w yw ołania. jak u m ie najlepiej.czyli „p o za linią". Inaczej m ów iąc tak ą. g d y funkcję zao w y w ołuje się w niew ielu m iejscach w p ro g ram ie. g d y n ap o tk a pierw sze w y w o łan ie tej funkcji. Czy rozmiar programu przez to zmniejszy się. Z atem teraz już sam a d ek laracja nie w ystarczy. Dla wtajemniczonych: Może ona mieć w swoim ciele definicje obiektów lokalnych. M ów ię tu o p rz y p a d k u . w której się ją w yw ołuje. 5. to zro b i z niej funkcję zw y k łą . D lateg o słow o inline ro zu m ieć należy jako su g estię dla k o m p ilato ra.jeśli d a n y k o m p ilato r nie jest na tyle d o b ry . f o r). Umiejscowienie definicji funkcji typu inline Do tej p o ry w ielokrotnie podkreślaliśm y. czy zwiększy? To z a le ż y . funkcja typu inline może zostać skompilowana tak. g d y funkcja m oże być sk o m p ilo w an a jako o u t li n ę : W te d y m ianow icie. W te d y p ro g ram m o że być nieco m n iejszy . n a s z a . napotykając w jakiejś linii jej w y w o łan ie. Plotka głosi. ż e nie m a jakichś specjalnych w y m ag ań . że jeśli w funkcji i n l i n e kompilator napotyka pętlę (do. w której ciało je st gdzieś p o z a linią. m usi w tej linii w staw ić w łaściw e instrukcje. Jeśli fu nkcja. że tak w ygodniej jest p racow ać d eb u g g ero w i. Definicja . że k o m p ilato r m usi zn ać deklarację funkcji w m om encie.to jej treść m o ż e zająć mniej m iejsca n iż k o d g en ero w an y z w ią z a n y z o b słu g ą w y w o łan ia fu n k cji i p o w ro tem z niej. w h ile . to k o m p ilato r. co d o w y g lą d u jej ciała..ta k a jak np. to najprawdopodobniej zrealizuje tęfunkcję jako o u t l i n e .Rozdział. To tyle. ale za to m iliony razy . k tó rą zd efin io w aliśm y je st niew ielka . Są jeszcze in n e sytuacje. w łaściw ie k ażd ą funkcję m o ż em y zam ien ić n a funkcję inl ine. Z tej s u g e stii m o ż e on sk o rzy stać lub nie. jak zwykła funkcja . W ów czas k o m p ilato r w szy stk ie n asze fu n k cje typu i n l i n e skom piluje jak o o u t l i n e dlatego. J e d n a k ż e p am iętać n ależy .

to w k a ż d y m z n ic h p o w in n a o b o w ią z y w a ć ta s a m a w ersja fu n k c ji in lin e. A o to p r z y k ła d p r o g r a m u z n a s z ą fu n k c ją ty p u i n l i n e : ti n c lu d e < io s tre a m > u s in g n am esp ace s t d .p o c z a te k _ y ) * s k a l a _ y ) . \n ” << " z e p o c z ą te k z n a j d z ie s i e w p u n k c ie \ n " << p o c z a t e k _ x « " . //* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * i n t m a i n () { d o u b le x 1 = 100. // // z m i e n i a m y p o c z ą t e k u k ł a d u w s p ó łr z ę d n y c h p o c z a te k _ x = 2 0 .i to w ła śn ie w łą c z y d o d a n e j lin ii p r o g r a m u . które potrzebują tej fu n k c ji. U p r z y k ła d o w y p u n k t y l = 100. c o u t << "G dy p r z e s u n ie m y u k ł a d w s p ó łr z ę d n y c h t a k . g d z ie z n a jd u ją się d e k la ra c je in n y c h . c o u t << "Mamy w p u n k t o w s p ó ł r z ę d n y c h \ n " . // s k a l e : p o z io m a i p io n o w a / / *^*^ m» * ' * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * i n l i n e d o u b l e w s p x ( d o u b le w s p ó ł r z ę d n a ) // 0 r e t u r n ( (w s p ó łrz ę d n a . 5. W niosek s tą d ta k i. Ich c ia ła m u s z ą b y ć p o p r o s tu ju ż k o m p ila to ro w i z n a n e w d a n y m z a k r e s ie w a ż n o ś c i. p o c z a te k _ y = -5 0 0 .p o c z a te k _ x ) * s k a la _ x ).160 Rozdz. " << p o c z ą t e k y « " \ n t o now e w s p ó ł r z ę d n e p u n k tu Yn" . _ To właśnie zapewnia nam umieszczenie jej w pliku nagłówkowym i lołączanie tegoż pliku do w szystkich plików programu. z w y k ły c h fu n k c ji. / /* * * * * * * * * * * * * * * * * * * * * * ************************************* i n l i n e d o u b l e w s p y ( d o u b le w s p ó ł r z ę d n a ) // © { r e t u r n ( (w s p ó łrz ę d n a . n ie m o ż e m y o s z u k iw a ć : Jeśli p ro g ra m s k ła d a się z k ilk u p lik ó w (m o d u łó w ). a k tó ry to p lik d o łą c z a n y jest w c z a sie k o m p ila c ji m o d u łó w n a s z e g o p ro g ra m u . s k a la _ x = 1 . Funkcje Funkcje i n l i n e (w linii) ciała (treść) fu n k c ji m u s i ju ż b y ć w ty m m o m en cie k o m p ila to ro w i z n a n a . c o u t << " x = " « w s p x ( x l) // << »* y = << wspy(yl) << endl. // p o c z ą t e k u k ła d u w s p ó łr z ę d n y c h p o c z a te k _ y . d o u b le // ® p o c z a te k _ x . K o m p ila to r p o w in ie n ju ż m ieć „ n a b o k u " p rz y g o to w a n ą tre ś ć tej fu n k cji . A le u w a g a . ż e w o b e c tego: F u n k c je ty p u i n l i n e m u s z ą b y ć na sam ej g ó r z e te k stu p ro g ra m u a lb o n a w e t w p lik u n a g łó w k o w y m .

to m a sz rację.5 to ten sam punkt ma teraz współrzędne: x = 40 y = 600 Kom entarz Jeśli p ie rw sz e Twoje w rażen ie je st takie.u nas w O . O .Rozdział. © . a my chcemy tam narysować coś. W ty m ro zd ziale istotne jest d la n as to.zgodnie z z a s a d ą . dla p rzy sp ieszen ia d ziałan ia p ro g ram u . T e definicje w id zisz w 0 i © . © . © w ów czas o d b y w a się to w sposób m aksy m aln ie szybki . ze początek znajdzie sie w punkcie 20. g d y opłaca się użyć funkcji ty p u i n l i n e . . ze skala_x=0. Trzeba wówczas przeskalować współrzędne. że p o w y ż sz y p ro g ram więcej g a d a niż robi. O czyw iście definicje tych funkcji są . Jeśli nie jest dla Ciebie jasne. 5. Tu w łaśn ie d o ch o d zim y d o sytuacji. co u nas w programie ma rozmiary 100 na 100 iw dodatku ma to zająć cały ekran. Nie jest to takie nic-operacje robisię najczęściej przy posługiwaniu grafiką na ekranie. 600 na 800 punktów. © .pow yżej miejsc. -500 to nowe współrzędne punktu w takim układzie sa: x = 80 y = 600 Gdy dodatkowo zmienimy skale pozioma tak. Mamy w punkt o współrzędnych x = 100 y = 100 Gdy przesuniemy układ współrzędnych tak. Jak w id ać funkcje te korzystają także z niektórych zm iennych globalnych — zdefiniow anych w O . A co w z asad z ie robi? P rzelicza w sp ó łrzęd n e z jednego u k ła d u odn iesien ia na drugi. Funkcje 161 Funkcje i n l i n e (w linii) << "w takim układzie sa: " << " X = " << wspx(xl) << " y = " << wspy(yl) << endl. na czy m polega to p rzesk alo w an ie. że takich p rzesk alo w ań p rzy sk o m p lik o ­ w an y m ry su n k u dokonuje się tysiące razy. ż e zdefiniow aliśm y dw ie funkcje ty p u inline: funkcję w s p x i funkcję w spy (do przeliczania w sp ó łrzę­ dnej poziom ej oraz pionowej). g d zie są p o raz p ierw szy w yw oływ ane. W rezu ltacie za każdym razem . to nie zap rzątaj sobie teraz tym głowy.m ech an izm em i n l i n e . Ekran ma rozdzielczość np. Tutaj w ażn e jest bow iem . g d y w p ro g ram ie w y w o łu jem y sk alow anie funkcji .

t i n c lu d e < io s tre a m > u s in g n am esp ace s td . można decydow ać o zakresie ważności je g o nazwy i o czasie jego życia. N ie można więc. za pom ocą danej nazw y. c o u t « " W a rto ś c i: l i c z b a = " « l i c z b a « " i = " « i. że tak nazw any obiekt . 5. sp o za funkcji. ♦♦♦ N azw ą deklarow aną w obrębie funkcji jest też etykieta. 5. N ie m ożna w ięc do niej skoczyć instrukcją g o t o spoza tej funkcji. y/********************************'*** v o id f f f ( v o i d ) { i n t x. Poniżej o m ó w im y kilka m ożliw ych sposobów definiow ania obiektów .do stęp n y jest w ew n ątrz w szystkich funkc. x = 5. w jaki definiujemy obiekt. do końca p ro g ram u . in t lic z b a . *5i ^ ******************* ^ ***************************** i n t m ain () 1 in t i.162 Rozdz.1 Obiekty globalne N azw a zd ek laro w an a na zew n ątrz w szystkich funkcji m a zasięg globalny Znaczy to. w której nastąpiła jego deklaracja. O czywiście p rak ty k a jest taka. 5.11.1 0 P rzyp o m n ie n ie o zakresie w ażności n azw d ek la ro w a n yc h w ew nątrz funkcji Z akres w ażności nazw deklarow anych w obrębie funkcji ogranicza się tylko d o bloku tej funkcji. że deklaracje um ieszcza się na sam ym początku pliku. Funkcje Przypom nienie o zakresie ważności nazw deklarowanych w ew nątrz funkcji 5 . próbować d o trzeć do zm iennej będącej w o b ręb ie funkcji. lic z b a — .11 W yb ó r z a k re s u w ażności n azw y i czasu ży c ia obiektu Przez sposób. w dól. . dzięki czem u obiekt jest d o stę p n y w e w szystkich funkcjach tego pliku. dlatego w dw óch różnych fu n k ­ cjach m ogą istnieć bezkonfliktow o identyczne etykiety. li c z b a = 10. f f f (). i = 4. Z jed n y m zastrzeżeniem : jest zn an y dopiero o d linijki. znajdujących się w tym pliku. ♦> Skoro etykieta jest lokalna dla funkcji.

Rozdział. © W ew n ątrz funkcji f f f m ożem y ta k że używ ać g lo b aln eg o obiektu l i c z b a . © K ary g o d n y b łąd . to zm ienne takie zo stan ą pow ołane d o życia po raz d rugi. że odtąd nie możemy liczyć. © W yw ołanie funkcji f f f.sk o ro obiekt ten p rzestaje istnieć. że obiekty au to m aty czn e k o m p u ter przechow uje w łaśn ie na stosie. 5. a o n e . To d latego. o p c ji o p ty m a liz a c ji.11. Funkcje 163 W ybór zakresu ważności nazwy i czasu życia obiektu O Definicja o b iek tu globalnego o n azw ie l i c z b a . w ięc kom pilator zaprotestuje. . © W funkcji f f f m ożem y zd efin io w ać obiekt lokalny o n azw ie x i go używ ać.3 W ynikają z tego dw a wnioski: <♦ . to nie m o ż em y liczyć na to. g d y kończym y blok. @ P rzy k ład u ży cia zm iennej globalnej w funkcji m a in . bow iem zakres w ażn o ści nazw y i nie ro zciąg a się na funkcję f f f . Definiujemy je. co p op rzed n io . Przy ponow nym w y w o łan iu tejże funkcji o b ie k t taki zostanie zdefinio- Dokładny moment uśmiercenia obiektu może zależeć od rodzaju kompilatora i jego tzw. Ważne jest to. Jeśli p o raz d ru g i w ejdziem y d o d an eg o bloku (np.auto m aty czn ie przestają istnieć. 5. Jest przecież g lo b aln ie dostępny. N ie m a żadnej gw arancji.2 O biekty automatyczne W n aszy m przy k ład zie zm ien n e lokalne i oraz x są to tak zw an e zmienne autom atyczne.w m om encie. iż obiekt jeszcze istnieje. N iep o p raw n e jest takie o d w o ły w an ie się d o obiektów lokalnych innych funkcji. p rz y p o w tó rn y m w y w o łan iu funkcji f f f ). którą m iał na m om ent przed unicestw ieniem . w któ­ rym p o w o łaliśm y je d o życia .znow u z o sta n ą zlik w id o w an e. że znajdą się a k u ra t w tych sam ych miejscach w pam ięci. G d y znow u o p u ścim y blok . Tutaj nazw a i nie jest zn an a. O biekt i nie je st obiektem lokalnym tej funkcji. ż e p rzy po n o w n y m w yw ołaniu tej funkcji zastan iem y g o tam z w artością.

N atom iast: Zm ienne globalne (i zmienne z przestrzeni nazw) .te są zakładane w normalnym obszarze pamięci.(w pisując tam np. jeśli np. bardzo m ożliw e.. K om pila­ tor nie inicjalizuje nam tego obszaru . a na schodach dajemy jeszcze komuś nasz stary adres..ma w artość 0 (stosowną | < jo ^ ie g o obiektu). zatem zmienna globalna.. :_ ----------------. Jeśli ich sam i nie zainicjalizow aliśm y jakąś w artością.przypominając obrazek o stosie .164 Rozdz.. nawet za chwilę. lokalnej..... ale jakby w biblioteczce . Z atem . 5. bloku funkcji lub bloku lokal­ nego). porozmawiamy w rozdziale o wskaźnikach. Jest o n o jed n ak rzad ko u ż y w a n e . w b lo k u hi nkcji definiujem y obiekt: ____ ____________ 4) O zwracaniu rezultatu będącego adresem.b ę d ą to z u p e łn ie p rz y p a d ­ kow e w artości. Inna spraw a. Właśnie się wyprowadza m y z dotychczasowego mieszkania. to w tych zm iennych auto m aty czn y ch tkw ią początkow o śmieci Dlatego: Ze zm iennych automatycznych nie należy odczytyw ać w artości ..zanim najpierw coś sensownego do nich nie zapiszemy. ■ . je ś li jej nie inicjalizowaliśm y specjalnie . Sytuację tę można porównać do takiego obrazka. Z obiektam i au to m aty c zn y m i łączy się słow o klu czo w e a u t o staw ian e p rzed definicją o b ie k tu w ew n ątrz jakiegoś bloku (np. . D okładnie to sam o dotyczy zw racan ia referencji (p rzezw isk a) zm ienne.. g d y ż ob iek ty tak d efiniow ane są au to m aty c zn e p rz e z dom niem anie. Funkcje W ybór zakresu ważności nazwy i czasu życia obiektu w an y na now o. że w zupełnie in n y m m iejscu p a rn ię ^ (stosu) A _ sk o ro obiekt ten przestaje istnieć. Ten obszar przed uruchomieniem programu jest zerowany. to nie ma sensu by funkcja zw racał a * jego a d re s 4 A dres po o p u szczen iu takiej funkcji o p isu je kom orkę.. że I zm ien n e au to m aty czn e nie są zerow ane w chw ili definicji (czyli w I ch w ili p ow oływ ania d o życia). k tó ra ju ż n ie należy do d aw n eg o właściciela... _.. P am iętać należy.■m c w iece.... nie znajdzie. P rzy ­ dziela się im ta m w y m ag an y dla d a n e g o obiektu o b szar ... W ytłum aczenie: zm ien n e au to m aty czn e p rzech o w y w an e są n a stosie.. zero).nie na biurku. ■ -y. Tymczasem pod tym starym adresem ju ż nas nikt.. Jeśli m im o ty ch ostrzeżeń coś s ta m tą d przeczytasz . 5) Czyli: .

#include <iostream> using namespace std.11. która nic nie robi. ty lk o pisze ile razy ją do tej po ry w yw ołaliśm y. ktory_raz++. Oto ilustracja. Z ałóżm y. C zyli chcielibyśmy. w ięc takiej zm ien n ej po w in n iśm y znow u n adać jakąś w arto ść początkow ą. a g d y kończy się w y k o n y w a n ie tej funkcji przestają istnieć. G dybyśm y te g o ostatniego w a ru n k u nie postaw ili . jaki mają zmienne (obiekty) globalne. biała(). by zmienna miała taki czas życia. biała(). cout << "Funkcja czerwona wywołana "<< ktory_raz « " raz\n". żeby była z n a n a tylko lokalnie w tej funkcji. C zasem taki p ro ced e r nas zad o w ala. czerwona () . tylko p rz y p o n o w n y m w ejściu do tej funkcji m ia ła taką w artość. P o n o w n e w yw ołanie tej funkcji pow oduje p o n o w n e u tw o rzen ie takiej zm iennej. że zm ienne lo k aln e dla jakiejś funkcji p o w o ły w an e są d o życia w m o m en cie ich definicji. / * -----. czasem jednak ch ciałoby się. ♦♦♦ Z d ru g ie j jednak strony chcem y. . jak p rz y ostatnim o p u szcza n iu tejże funkcji. to jest to ró w n o w a ż n e definicji int m.w ystarczy ło b y n am użyć zm iennej globalnej. ż e m a m y napisać funkcję. 5.* / int main() { to czerwona (). /* -----------------------------------------------------------------------------------------------------. S praw ę rozw iązujem y tu na dw a sposoby. ) //*********************»*************************************** void czerwona(void) static int ktory_raz. jej w arto ść stanow ią śm ieci. Funkcje 165 W ybór zakresu ważności nazwy i czasu życia obiektu auto int m. >. by zm ien n a lokalna dla d a n e j funkcji n ie g in ęła bez śladu. ♦♦♦ M usi m ieć więc w śro d k u jakiś licznik o czasie życia rozciągającym się na cały czas w y k onyw ania program u.d e k la ra c je f u n k c j i ------*/ void czerwona(void). // O void biała(void). II czerwona () .Rozdział.3 O biekty lokalne statyczne P o w ied zieliśm y .

w której została zdefin io w an a. g d y kończy się jego zak res w ażności jego nazw y. czyi p od staw ien ia w artości początkow ej. O d te pory ko m p ilato r m oże już n as sp raw d zać. K ażda m a zakrei w ażności og ran iczo n y do funkcji. że m im o iż obiekt jest lokaln] . D latego na górze p ro g ram u um ieściliśm y deklaracje tych funkcji. czy się nie p o m y liliśm y w linijkac w yw ołania tych funkcji. © Definicja obiektu statycznego w funkcji czerwona nie z aw ie ra inicjalizacji. Jakby zap a d a w stan hibernacji.kończy się zakres w ażn o ści n azw y obiektu. Słow o to nazyw a się też specyfikatorem albo modyfikatorem. . iż obiekt staje sij „nieśm iertelny". który raz = ktory_raz + 1. © W funkcji czerwona istnieje definicja zm iennej (obiektu) ty p u int.w idzim y. Funkcje W ybór zakresu ważności nazwy i czasu życia obiektu void biała(void) * static int ktory_raz = 100. . że obiekty takie . jak w funkcji czerwona. K iedy p o n o w n ie w ywołani zostaje funkcja. . lec w norm alnej pam ięci. G W funkcji biała także istnieje definicja takiego sam ego ob iektu.w rezultacie w ykonania na nim zw ięk szen ia o jedynkę w ypisaniu w artości na ekran . ab obiekt nie ginie. 0 Zw racam u w a g ę raz jeszcze . Z auw ażyłeś p rzy d o m ek static. . obiekt b u d zi się z zim ow ego snu i ma ta k ą w artość. Dzi«?- ki temu ko m p ilato r wie. . .jako obiekty przypo m inające czasem życia obiekty globalne . o nazwij który raz.Nie przeszkadza to n am jednak. W ynika stąd fakt. z jaką g< ostatnio zo staw iliśm y.nie p rzestaje on istnieć w m om encie. Na d o w ó d tego .nie są p rzec h o w y w an e na stosie. . cout « "Funkcja biała wywołana " « ktory_raz « " raz\n".(w p rz e c iw ie ń s tw :^ . 5. gdyżs< to obiekty lokalne. . Dzięki niem i definicja obiektu lokalnego m odyfikuje się tak. 0 W funkcji m a i n w idzim y serię w yw o łań funkcji cz e r w o n a i biała. O biekty statyczne . To on spraw ia. czyli zakres w ażności ich nazw jest lokalny. Z au w aż słow o kluczow e static. O biekt ma taką samą n azw ę. a ta k że jaki typ jest zw racan y jako rezultat w y k o n an ia tej funkcji. jaka jest liczba i typ a rg u m e n tó w w ysyłanych d o funkcji.166 Rozdz. że rzeczyw iście m am y coś w rodzaji licznika. . t . // © Po wykonaniu programu na ekranie pojawi się: Funkcja czerwona wywołana 1 raz Funkcja czerwona wywołana 2 raz Funkcja biała wywołana 101 raz Funkcja czerwona wywołana 3 raz Funkcja biała wywołana 102 raz mfr Przyjrzyjmy się poszczególnym punktom programu O Funkcje p rz e d pierw szym sw y m w yw ołaniem pow inny być ju ż z n a n e ko m p ila torowi.

ła tw o zobaczyć na ek ran ie p o w y k o n an iu takiej w ersji p ro g ram u Funkcja czerwona wywołana 1259 raz Funkcja czerwona wywołana 1259 raz Funkcja biała wywołana 101 raz Funkcja czerwona wywołana 1259 raz Funkcja biała wywołana 101 raz O biekty straciły nieśm iertelność. (N a Tw oim k o m p u terze będzie to na p e w n o jakaś inna liczba. int ktory_raz_cz. Raz. ż e obiekt g lo b a ln y je st d o stęp n y dla k ażd e g o . G iną w m om encie. m im o w szy stk o jednak.co z w ię k s z a ryzyko b łęd u . Co to oznacza . gdybyśmy z naszego programu usunęli słowa s t a t i c ? O bie zm ien n e k t o r y raz staną się w ó w czas ob iek tam i au to m aty c zn y m i. Z m ienna jest z a k ład an a za k ażd y m razem o d now a i za k ażd y m raze m n ad aw an a jest w arto ść 100. g d y k o ń czy się ich zakres w ażności. W idać to w y raźn ie na tekście w y p isy w a n y m z funkcji biała. Jeśli ta w a rto ść n am o d p o w iad a. . z a k ład an y jest n a stosie. n asz licznik zaczął liczyć o d w artości począt­ kow ej 100 C zy te g o sam eg o efek tu n ie m o g lib y śm y u z y s k a ć za pom ocą z m ie n n y c h g lobalnych? T ego sam ego nie. T ak że i o n staje się au to m a ­ tyczny i. Podsumowanie: Jeśli chcem y. czym były do tej pory. po zo stało ść p o poprzedniej treści stosu). jako tak i. 5.b e z p o śre d n io po definicji n ie zaw ierają żadnych „śm ieci". nie pam iętają n iczeg o . b o w iem nie m oże być d w ó c h o b iek tó w g lo b aln y ch o identycznej n azw ie . Stąd taka zd u m ie w a ją c a liczba. W p rz y p a d k u d efinicji O ta w arto ść n am jed n ak nie o d p o w ia d a ła . U ży w an ie z b y t w ie lu zm iennych g lo b aln y ch nie jest e leg an ck im rozw iązaniem i z d ra d z a zły sty l p ro g ram o w an ia. to m usim y ją zdefiniow ać jako staty czn ą. a d w a. że trzeba u w ażać. ty lk o m a ją w sobie w arto ść zero w ą. w ięc w staw i­ liśm y tam liczbę 100. by jakaś zm ienna (ogólniej obiekt) d efin io w an a w obrębie funkcji nie była po z ak o ń czen iu pracy funkcji niszczona i z a c h o w y w ała sw oją w artość do „n astęp n eg o ra z u " .Rozdział. M usielibyśm y w ięc zd efin io w ać d w ie z m ien n e glo b aln e o różniących się n a z w a c h np. P oniew aż je d n a k n ie nadajem y m u żadnej w artości początkow ej. a po p o w tó rn y ch n aro d zin ach . int ktory_raz_bi = 100. Co by było. W rezu ltacie zw iększenia o 1 na ekranie p o ja w ia się za k ażd y m razem liczba 101. Z obiektem z funkcji czerwona jest o w iele gorzej. by w ym yślić nazw ę d o tej p o ry jeszcze n ie istniejącą. to nie m u sim y je szc ze raz jaw n ie w sta w ia ć tam tego zera. Te śm ieci zw ięk szam y o 1 i w y p isu jem y na ekranie. Funkcje 167 W ybór zakresu ważności nazwy i czasu życia obiektu d o o b iek tó w n a stosie) . w ięc są w nim w stęp n ie „śm ieci". D zięki tem u.

że o dtąd p ro g ra m nie będzie ju ż W jednym pliku .są w stępnie inicjalizow ane zeram i O biekty lokalne: • —au to m aty czn e . jak definicja zm iennęj autom atycznej. • .168 Rozdz. 5. a w d ru g im pliku B reszta trzeciej. że w pierw szym pliku A b ęd zie funkcja pierw sza. za* żąd am y inicjalizacji inną w artością (1. tylko w tym o b szarze pamięci. że tak jak w naszym p rzy p ad k u . Jeśli jed n ak ponow nie funkcja ta zostanie w yw ołana. 5. P rzy ch o d zi jed n ak taki m om ent.7 o d b y w a się tylko jeden jedyny raz. Chyba. że przed definicją stoi słow o s t a t i c static double m = 1. Jakakolw iek m inim alna p opraw ka w y m ag a znow u tej d łu g ie kom pilacji. że k o m p i lacja trw a d ługo. Ten plik kom pilujem y i lin kujem y (z bibliotekam i system ow ym i) by otrzym ać p ro g ram w wersji gotow ej d o uruchom ienia. N ie m ożna więc dzielić tak.dzielisz go na d w a lub więcej. definicja taka w ygląda identycznie. Jak to zrobić? P rogram n a p isa n y w jednym pliku m ożna podzielić n a d w a pliki tylko w miej' scu m ię d z y definicjam i funkcji. c zw arta i piąta. W tedy m usisz podjąć decyzję. G dy po zakończeniu funkcji i ew entualnych m odyfikacjach tej zm iennej . potem zm ien n a statyczna p am ięta już sw oją ostatnią wartość). zastaniem y tę staty czn ą zm ien n ą z taką wartością. zatem obiekty te w stępnie za w ieraji „śmieci".a więc są w stęp n i* inicjalizow ane zeram i. ż e program rozrasta się tak bardzo. albo cała w pliku B. z tą różnicą.taka w łaśnie w artość czekał* będzie tam na nas.zakładane są na stosie. g d zie zm ienne globalne.p o niew aż mają pożyć dłużej. Funkcje Funkcje w program ie składającym się z kilku plików Jak p am iętam y. d ru g a i pół trzeciej. zak ład an e są w tym obszarze pam ięci. Taka zm ien n a nie jest już lo kow ana na stosie (jak zm ienne autom atyczne). z jaką ją ostatni raz zostaw iliśm y.12 F u n k c je w p ro g ra m ie s k ła d a ją c y m s ię z kilku p lik ó w D opóki nasz p ro g ram jest n ie d u ży nie ma problem u: całość m oże się zm ieścić vv jednym pliku dyskow ym . co obiekty globalne . a tam nic n ie jesl w stępnie inicjalizow anie. Funkcja trzecia m usi być albo cała w pliku A.opuścim y funkcję. Zapam iętaj: O biekty globalne | .7. obiekt ten stanie się dla nikogo niedostępny. zatem nie ma w niej „ ś m ie c i' tylko jest inicjalizow ana zerem . O czym jeszcze m usim y pam iętać?: .7) G dy d o funkcji w ejdziem y po raz pierw szy .statyczne . (Inicjalizacja w a rto ­ ścią 1.

c z y te ln ik u . D e k la ra c je te są p o tr z e b n e k o m p ila to r o w i w te d y . e x te rn c h a r z. to w ie d z .. to n a ra z ie d e k la ru ję . g d z ie d o k ła d n ie o n jest. k tó re z p lik u B b ę d ą u ż y w a n e . A b y m ó c się o d w o ła ć d o ja k ic h ś n a z w . c z y li m ó c się d o n ich o d w o ły w a ć .s łu ż ą d e k la ra c je w y k o n y w a n e za p o m o c ą s ło w a e x t e r n . G d z ie s ię te n o b ie k t z n a jd u je ? N ie m ó w ię te ra z . D o p ie ro n a e ta p ie lin k o w a n ia (łą c z e n ia ) tych p lik ó w z e s o b ą . jak na p rz y k ła d z m ie n n e .m u s im y ta m zam ieścić d ek laracje : e x te rn i n t n . ja k w ie m y .. D o te g o .Rozdział. b y fu n k c je z p lik u B m ia ły d o s tę p d o ja k ic h k o lw ie k z m ie n n y c h g lo b a ln y c h z p lik u A . T a k ż e n ie o k re ś ­ la m . n a jp ie rw m u s z ą w y s tą p ić d e k la ra c je z m ie n n y c h i fu n k cji z p lik u A. W p lik u B c h ce m y m ieć ty lk o d o nich d o s tę p . D efin icje (c z y li re z e rw a c ja na n ie m iejsca) o d b y ły się ju ż w p lik u A . c h a r z. W p r z y p a d k u d ek laracji n a z w y fu n k cji n ie p o trz e b a ju ż s ło w a e x t e r n . g d z ie ż to w p am ięci n a p r a w d ę b ę d ą o b ie k ty n . W s u m ie w ięc. k tó ry p o p ro stu b e z p o ś r e d n io p rz e d p ro c e se m k o m p ilacji je st w łą c z a n y d o p lik u B (a m o ż e i d alszy c h ). d a le j Ci. M ó w ią m u o n e m n iej w ięcej coś ta k ie g o : • Jeśli w b ieżąco k o m p ilo w a n y m p lik u B n a p o tk a s z n a z w ę n. ż e o z n a c z a o n a o b ie k t ty p u d o u b l e .ty ch .to ta k ż e m u s im y u m ie ś c ić w p lik u B d e k la ra c ję tej fun k cji. ż e o z n a c z a o n a o b ie k t ty p u i n t .a b y m ó c z n a z w x . ż e b y z p lik u B m o ż n a b y ło w y w o ła ć ja k ą ś f u n k c ję z p lik u A . k o d z p lik u B „ d o w ie się " .tak z w a n y m p lik u n a g łó w k o w y m .je s t o n o p rz y jm o w a n e jak o d o m n ie m a n e . • Jeśli w b ieżąco k o m p ilo w a n y m p lik u B n a p o tk a s z n a z w ę z.. 5. b o m o ż e n a w e t n a z e w n ą tr z ( e x t e r n ) te g o p lik u . o sz c z ę d z ę .n z k o r z y s ta ć w plik u B . w p r z y p a d k u o b ie k tó w ta k ic h . N ie w s z y s tk ic h .h " .trz e b a w p lik u B u m ieścić d e k la ra c je tych z m ie n n y c h . (A le to n ic p e w n e g o ). To a u to m a ty c z n e w s ta w ia n ie d o p lik u w y k o n u je z a n as s p e c ja ln a d y re k ty w a # in c lu d e " n a g łó w e k . z. to . II w s z y s t k o są d e fin ic je d o u b le x .m u s z ą o n e z o sta ć z d e k la ro ­ w a n e . Jeśli c h c e m y . // deklaracje ! e x te r n d o u b le x . Jeśli w ię c w p lik u A m a m y n a s tę p u ją c e z m ie n n e g lo b a ln e in t n. g d y b ę d z ie k o m p ilo w a ł p lik B. x .a n ie d efin icje.. ż e p o to. Funkcje 169 Funkcje w program ie składającym się z kilku plików P r z e d e w s z y s tk im o ty m . C z a se m jest w y g o d n e u m ieścić te w s z y s tk ie d e k la ra c je w o s o b n y m p lik u . z a n im w p lik u B p o ja w ią się jego fu n k c je . D e k la ra c je . • Jeśli w b ieżąco k o m p ilo w a n y m p lik u B n a p o tk a s z n a z w ę x.

Oto treść pliku afryka.bo n a z w a jest ujęta w cudzysłów ). /+★******★****★****************** * * * * * * * * * * * * ** * * * ** * * * ** * * * ** / void funkcja_kenijska() cout « "Jestem w Nairobi ! --------\n". Funkcje Funkcje w program ie składającym się z kilku plików Jest to tzw . cout << "Na swiecie jest " << ile_murzynow « " murzynów.pliku z deklaracjam i zm ien n y ch i funkcji znajdujących się w bibliotece w ejścia/w yjścia. h Oto przykład programu. hcader . o tych spraw ach d o p ie ro będziem y m ów ić. Co p ra w d a .y---\n". który podzielony został na dwa pliki: W szystkie deklaracje zeb ran o w osobnym pliku n ag łó w k o w y m o n azw ie n a g i . Najnowsza wersja tej biblioteki oferuje ów plik pod nazwą nie mającą już rozszerzenia *. cout << "Koniec programu \n". h) znajdujący się w bieżącym k atalogu (bieżącym . R o zszerzenie .. 1 Z***********************************’ ★ ★ *★ ★ ****★ ★ ****★ ★ ****★ *** / void funkcja_egipska() cout « "Jestem w Kairze !--.nagłówek [czytaj: 'heder' ]. int main() cout « "Początek programu\n". cout « "Na swiecie jest " « ile_murzynow 6) Będziemy o tym mówili w następnym rozdziale.170 Rozdz. iinclude "nagl. h to sk ró t o d angielskiego header1 - nagłów ek). funkcj a_niemiecka() . która b ezp o śred n io przed ro zp o częciem pracy k om pilatora w staw ia d o naszeg o pliku . jednak chyba ju ż z d ą ż y ­ łeś się o sw oić z linijką tinclude <iostream> która to w arzy szy naszym p ro g ram o m od dłu ższeg o czasu.cpp: #include <iostream> using namespace std. a jest niczym in n y m jak w staw ien iem d o naszych p ro g ram ó w . nie zapomniałem tu o rozszerzeniu. h jest zw yczajow ym ro z s z e rz e n k m d aw an y m plikom n ag łó w k o w y m (. 5. d yrektyw a prep ro ceso ra6.. 7) ang. oraz " « ile_europejeżyków « " europejczyków \n". h P lik ten jest w łączany d o obu plików p ro g ram u . Nie . .h" int ile_murzynow = 9.in n y plik o danej n azw ie (tu taj plik: n a g ł ó w e k . funkcja_francuska() .

5. ) |•k•k•k•k^k•k■k■k^k•k^k•k'k■k•k■•k•k•k■k•kit•kit^k•k■kic^^*^k^A■k•k•k'k•k•k•k•kir•k'k■kic•^c■^e•k•k•k•k'k^k•k•k■k•k•k•k•k•k■^e j A tak wygląda zawartość pliku nagl.c p p i af ryka . Funkcje 171 Funkcje w program ie składającym się z kilku plików << " murzynów. oraz " « ile_europejczykow << " europejczyków \n". otrzym am y g o to w y program . funkcja_egipska(). oraz " << ile_europejeżyków << " europejczyków \n". funkcja_kenijska(). #include "nagl. oraz " << ile_europejeżyków << " europejczyków \n". } A oto plik europa. void funkcja_niemiecka() . oraz 8 europejczyków Jestem w Nairobi ! -------- .Rozdział.h extern int ile_murzynow. extern int ile_europejczykow.cpp: #include <iostream> using namespace std. void funkcja_francuska() { cout << "Jestem w Paryżu ! *********************\n ». że na ekranie pojawi się następujący tekst Początek programu jGStsin w Paryżu ! +* + *★★***•★★★*■★★*■*•*■*★★ Na swiecie jest 9 murzynów. P ro g ra m ten po u ru ­ chom ieniu sp o w o d u je. y************************************************************* void funkcj a_niemiecka(void) { cout << "Jestem w Eerlinie ! *******************\n ". void funkcja_francuska(). void funkcja_egipska(). P o sk o m p ilo w an iu plików europa . cout << "Na swiecie jest "<< ile_murzynow << " murzynów. oraz 8 europejczyków Jestem w Berlinie ! ******************* Na swiecie jest 9 murzynów. cout << "Na swiecie jest " << ile_murzynow « " murzynów.h" int ile_europejeżyków = 8.cpp. o ra z po połączeniu (zlinkow aniu) ich ze sobą. oraz 8 europejczyków Jestem w Kairze !-------- Na swiecie jest 9 murzynów. void funkcja_kenijska().

P rz y p o m n ij s o b ie też. d o p lik u a f r y k a . ż e jesteś czu jn y . / /d e k la r a c ja . ale ty lk o je d n ą definicję. a z a ra z p o te m d e fin iu je m y z m ie n n ą i n t i l e _ m u r z y n o w w ła ś n ie w ty m p liku! To o s z u s tw o ! j B raw o . . T a k ż e z m ie n n e g lo b a ln e z je d n e g o pliku m o g ły być u ż y w a n e w in n y m p lik u (m ó w im y m o d u le p ro g ra m u ). (Ale to nic pewnego). o r a z 8 e u r o p e jc z y k ó w K o n ie c p ro g ra m u Isto ta p ro g ra m u p o le g ała n a p o k a z a n iu .. b ra w o . W szy stk o d la te g o . 5. że — d z ię k i d ek laracjo m — fu n k c je z je d n e g o p lik u p ro g ra m u m o g ą b y ć w y w o ły w a n e p rz e z funkcje z in n e g o p lik u s k ła d a ją c e g o się na p ro g ra m . / / d e fin ic ja . Gdzie się ten obiekt znajduje? Nie mówię teraz. T o s ło w o nie o z n a c z a . c p p . T o zn ac zy . ż e o b ie k t jest z d e fin io w a n y k o n ieczn ie n a z e w n ą trz .. N ie je st to o s z u s t­ w e m p o d w a ru n k ie m . że d e k l a r u je m y o b iek ty . / /d e k la r a c ja e x te rn in t k. P rz y p o m n ij so b ie n ie d a w n e m oje słow a: . że d o o b u p lik ó w e u r o p a . h z a w ie r a ­ jący d e k la ra c je funkcji i z m ie n n y c h . c p p w sta w iliśm y plik n a g łó w k o w y n a g i .M a m C ię! .. / /d e k la r a c ja i n t k. Z a te m p o p r a w n a jest tak a se k w e n c ja w p ro g ra m ie : e x te rn in t k.J a k m o ż n a w łączać p lik .172 Rozdz.. w k tó ry m z a ra z jest d efin icja i n t i l e m urzynów = 9. ż e m ó w iliśm y . . Funkcje Funkcje w program ie składającym się z kilku plików Na s w i e c i e j e s t 9 m urzynów . ż e d e k la ru je m y .zaw o ła łe ś ju ż p e w n ie triu m faln ie. c p p i a f r y k a . a le ich nie d e fin iu je m y . / /d e k la r a c ja e x te rn in t k.ty lk o je d n a ! e x te rn in t k.z n a c z y p o a n g ielsk u : z e w n ę trz n y ). iż o b iek t i n t o n a z w ie i 1 e _ m u r z y n o w jest g d z ie ś in d z iej (extemal . bo może nawet na zewnątrz ( e x t e r n ) tego pliku. O tó ż s ło w o e x t e r n z n a c z y tu ty lk o to. w k tó ­ ry m je s t linijka: e x t e r n i n t i le _ m u rzy n o w . iż o b ie k t m o ż e m ieć d o w o ln ą liczbę d e k la ra c ji. O to m o ja o b ro n a . ż e n ie b ie rz e m y na se rio s ło w a e x t e r n . N a jp ie rw m ó w im y .

S p raw ia on. . by przez przypadek nie wym y­ ślili w swojej części programu zmiennej globalnej o identycznej nazwie.co jest ch ara k tery sty cz n e dla definicji.Rozdział. a o so b n y d la e u r o p y .. Jest w tym p e w n a sprzeczność. nazwy funkcji. czy li tak sam o jakby był to zap is in t m = 4. ż e ow e n azw y nie m ogą być w ó w czas znane w m o d u łach innych niż mój. P ow odem .oznacza to. ale m o że być zn an a tylko w tym jed n y m p lik u . W yznam . Sposób ten n a d a l jest d o p u szcza ln y . Dotyczy to nie ty lk o n azw obiektów . ż e m usiały tu być jak ieś „w zględy h isto ry czn e". że jest to d efin icja. O to od p o w ied ź: K om p ilato r w id z ą c tak i zapis u zn a.czyli ostrzec.najczęściej . pisząc mój fragment. Ja. że ch o d zi tu o n azw y .1 N azw y statyczne globalne Jeśli w deklaracji n a z w y globalnej p o staw im y p rzy d o m ek s t a t i c . Teoretycznie powinienem wszystkich kolegów o tych nazwach także informować .nie m u sia ły dbać o u n ik aln o ść nazw . skoro c h o d z i tu o zu p ełn ie in n e zn aczen ie niż p o p rz e d n io . d laczeg o słu ży d o tego ten sa m p rzy d o m ek static. P od k reślam . Funkcje 173 Funkcje w program ie składającym się z kilku plików A jeśli i to Cię n ie p rzek o n u je.chęć. i od sło w a e x t e r n ż ą d a sz dosłow ności. które są d ek laro w an e g lo b aln ie (czyli na ze w n ą trz w szystkich funkcji). które oni mają z mojego modułu wywoływać. że nie ży czy m y so b ie. 5. W daw n y ch w ersjach języka C++ ten k ło p o t ro zw iązy w ało się staw iając p rz e d takim i globalnym i nazw am i p rzy d o m ek static.o sobny dla a f r y k i . b y inne m o d u ły (pliki) pro g ram u . Oto przykład: iv większym zespole piszemy program. Sądzę. Za k a r ę ! Zagadka Jak sąd zisz. czy p o p ra w n y jest taki zapis: extern int m = 4. bo z jed n ej strony u ż y w a m y sło w a extern - . Niektóre z tych nazw są rzeczywiście ważne i ustalane ze wszystkimi kolegami . Nie jest to chyba jasne. ale także n azw funkcji. Jednak oprócz takich nazw będą też nazwy moich globalnych zmiennych pomocniczych czy nazwy moich pomoc­ niczych funkcji. ż e nie w iem .12. '. O d tej pory nie m a w ięc obaw y o kolizję nazw. to zrół teraz d w a pliki n ag łó w k o w e .np. by g lo b aln ą nazw ę funkcji czy obiektu z a o p a try w ać w ten p rzy d o m ek static (czyli tutaj jakby: ściśle tajne) była . wymyślam jakieś nazwy potrzebne mi globalnie w moim module. by ta nazw a b y ła zn an a w innych plik ach (m odułach) składających się n a n asz program . które d an ej funkcji czy zm ien n ej n ig d y nie m ają u ży w ać .. Z a sp raw ą tego p rz y d o m k a n azw a jest n a d a l globalna.

72). .n ie m a n a z w y .to znaczy pow tórnif przebiegany. W sw oich program ach używ aj w tym celu anonim ow ej p rzestrzen i nazw . N ie jest to sp raw a tru d n a. 5. w ię c a n o n im o w a ^ in t x .174 Rozdz. którym jest kompilowana. Jeśli chcesz zapamiętać ten fakt. ra d z ę nie zap rz ątać sobie teraz tym głow y. Z atem . N ie m ają one naw zajem nic w spólnego.5. O pisyw ane tu zag ad n ien ie nie jest konieczne do zrozum ienia dalszej części książki.7. j P od su m o w an ie A nalizując starsze pro g ram y m ożesz się spotkać z n azw am i globalnym i z p rzy d o m k iem s t a t i c . to wyobraź sobie. //d eklaracja f u n k c j i 4 > K ażd y plik m oże mieć swoją anonim ow ą p rzestrzeń nazw . co oznacza po prostu gońca. Słowo to m a d u ż y zw iązek ze słow eni kurier. jeśli chcesz by d an a nazw a (obiektu. że taka przestrzeń nazw ma nazwę odpowiadającą nazwie pliku. Jest to p o p ro stu przestrzeń nazw . ale raczej algo ry tm ó w p ro g ram o w an ia. niż bieżący: namespace // <. ale potraktuj to jako ro zw iązan ie ju ż przestarzałe. 5. Inny plik to inna nazwa. albo funkcji) zn an a była tylko w tym je d n y m pliku. funkc ja. ale jeśli jesteś początkującym . w czasie w y k onyw ania funkcji m oże nastąpić w y w o łan ie innej funkcji. deklarujesz ją (lub definiujesz) w tak zw anej an o n im o w ej p rzestrz en i nazw . inna_f unkc ja nie m ogły być zn an e w in n y m pliku. str. P oro zm aw iam y teraz o w yw ołaniach rekurencyjnych. Funkcje Funkcje rekurencyjne Nowy standard wprowadził jednak lepsze rozwiązanie tego problemu Rozmawialiśmy już o tym w stępnie w paragrafie (§ 3. by nazw y x. więc tym sposobem te przestrzenie nazw są rozłączne. Teraz. g d y funkcja w y w ołuje sam ą siebie. N ie jest to zagadnienie dotyczące sam ego języka C++. Rekurencyjny . Sytuację taką nazyw am y rekurencją. której nie dajesz żad n ej n azw y .13 F u n k c je re ku re n cy jn e Jak w iem y. O to jak sprawić. po ro zm aw iam y o szczególnej sytuacji. Z atem bez w ahania m ożesz opuścić ten p arag raf i przejść na stro n ę 186. //d e fin ic ja o b ie k tu void funkcja (7 //d e fin ic ja f u n k c j i i II- double inna_funkcja (char z). poniew aż zbliżam y się już d o końca rozdziału o funkcjach. T eraz d u ż o le p szy m n arzęd ziem są tak zw an e przestrzenie n azw (namespaces).

v o id f u n ( i n t x) { i f ( x > 0) f u n ( x . to d o p ro w a d z im y do nieskończonej pętli w yw o łań . czyli f u n (1) R ozpocznie się w y k o n y w a n ie kolejnej w ersji. 5. w której n a stą p i kolejne w y w o ła­ nie. pośrednio. Jeśli w y w o łam y tę funkcję tak: f u n (3) to . że m a m y d o czynienia z rekurencją bezpośrednią. dzięki k tó rem u jej w yw oływ anie m a szan se się k ie d y ś zakończyć. F unkcja f u n będzie się w yw o ły w ała w nieskończoność. czy w y w o ła ć sam ą siebie (po raz kolejny) czy nie. w ięc. która też w y k o n a się d o końca i tak dalej.1 = 0 ) f u n (0) Ta w ersja fu n k cji sp raw d zi w aru n ek i f (x>0) . gdy funkcja . Jeśli funkcja w y w o łu je sam ą siebie ..1 = 2. O czyw iście.m a w ś ro d k u g d zieś w a ru n e k .ja k w id z im y z ciała tej funkcji . Z acznie się.i o k a ż e się o n niespełniony. p ro b le m w tym . tym razem z a rg u m e n te m 2 .Rozdział. k tó ra g w a ra n tu je n a m tak ie kłopoty: v o id f ( i n t x) { f (x) . w k tórym de­ cyduje. Funkcja w y k o n a się d o końca.w y w o ła on siebie s a m ą z a rg u m e n te m 3 .m ów im y. } A by nie s p o w o d o w a ć nieskończonej p ętli w y w o łań . Funkcje 175 Funkcje rekurencyjne X W łaściw ie k a ż d a funkcja m oże w y w o łać sam ą siebie.funkcja p rzezn aczo n a do rek u ren cy jn eg o w y w o łan ia . Rekurencja m o ż e nastąpić ta k że w ted y . Bezpośrednio.l ) . tym razem z arg u m en tem zero (bo: 1 . N azy w am y go warunkiem zatrzymującym rekurencję. ta funkcja m a w aru n ek i f (x > 0 ) . jeśli nierozsądnie w y w o łalib y śm y funkcję z argum entem ujem nym f u n (-5 0 ) to w aru n ek x > 0 n ig d y nie p rz e rw ie rekurencji. w ięc d alsze w y w o ła n ie już nie nastąp i. p o n o w n e w y k o n y w a n ie funkcji f u n (2) W niej n astąp i k o lejn e w yw ołanie. 1 Jak w idać. O to p rz y k ła d funkcji. czyli d o w yczerpania lim itu pam ięci. po czym pow róci d o p o p rzed n iej.1 = 1. że jeśli nie p rzy g o tu jem y jej na taką pracę..

d r u g a bard ziej p rz y d a tn a . W p rz y p a d k u w y w o łań rek u ren cy jn y ch jest p o d o b n ie. . (czyli zer i jedynek). k tó ra z kolei w y w ołuje tę pierw sza. char znak). Obiekty definiowane w funkcji rekurencyjnej W iem y . M ów im y w ted y . // void schodki(int ile. I y************************************************************* #include <iostream> using namespace std . int sumator(int jeszcze_krokow. to lo k a ln e z m ien n e a u to m a ty c z n e fu nkcji A (p rzech o w y w an e na stosie) n ie giną. K rótko m ó w ią c . to z n a c z y . Jeśli jednak ja k a ś zm ien ­ n a (obiekt) jest z d e fin io w a n a w tej funkcji z p rz y d o m k ie m static (staty czn a). ♦♦♦ Pierwsza funkcja s u m a t o r służy do sumowania liczb naturalnych od ( d o n. w k tó ry m są d w ie funkcje rek u ren cy jn e . O czyw iście ' b ędą to zupełnie odrębne zm ienne.. // void dwójkowo(int liczba). G dy funkcja A w y w o łu ­ je sie b ie sam ą. jeśli je d n a funkcja A w yw oła funkcję B. MPHt D rugie w yw ołanie spow oduje. P o zak ończeniu p racy funkcji B jej lo k aln e z m ie n n e a u to m a ty c z n e są u s u w a n e z e sto su .. ż e jest ona "nieśm iertelna". im nm rn w o n m w w iiu iim h » i i * i iM >wiim rr—i t m w W Z o b a c z y m y teraz p ro g ra m . ż e w zw y k ły ch sy tu acjach . jaką m iała o statn io w p o p rzed n im ... Funkcje Funkcje rekurencyjne w y w o łu je inną funkcję. g d zie n jest w arto ścią p o d an ą p rz e z u ż y tk o w n ik a p ro g ra m u D ru g a funkcja dwój kowo p ozw ala na w y św ie tlan ie na e k ra n ie liczby w postaci binarnej. Jeśli ta funkcja B zd efin iu je jakieś sw oje lo k aln e zm ienne (obiekty) .ta k ż e poja­ w iają się o n e na stosie. int suraa_dotychczas). a funkcja A p racuje na tych sw oich. 5.taka. że na stosie pojawią się nowe zm ienne autom atyczne .176 Rozdz. ż e jest to rekurencja pośrednia. czyli p rz y kolejnym wejściu d o funkcji m a o n a ta k ą w artość. C ie k aw o stk a: T ak b ę d z ie w p rz y p a d k u z m ien n y ch au to m aty czn y ch .p ierw sza b a rd z ie j w id o w isk o w a . ale je s t jakby wspólna dla w szystkich rekurencyjnych w yw o ła ń tej funkcji. na stosie są ju ż zm ie n n e a u to m a ty c z n e będ ące w łasn o ścią p ierw szeg o w y w o łan ia. . (czyli d ru g i raz funkcję A ).zm ienna statyczna je st nie tylko nieśm iertelna (nie ginie po zakończeniu d zia ła n ia funkcji).będące w łasnością tego drugiego wywołania. k tó re n a nią czek ały .

to ostatni krok../ •• • • ». //O © // warunek zatrzym ujący rekurencję i f (j e s z c z e _ k r o k o w > 0 ) //O © // kontynujem y wywołania rekurencyjne rezultat = s u m a t o r (j e s z c z e k r o k o w . s u m a _ d o t y c h c z a s ) . 0) // © << endl. cout << "\n" << liczba << " to dwojkowo dwojkowo(liczba). cout << "\n" << liczba << " to dwojkowo dwojkowo(liczba). . int s u m a t o r (int jeszcze_krokow..Rozdział. schodki(to_pietro_nr. int n = 0 .. liczba = 30942. // o static int krok_rekurencji . // © cout << " \nSuma pierwszych " << n << " l i c z b naturalnych to = " << sumator(n.■‘ i . // zatrzym ujem y cout << " ... rezultat = suma_dotychczas . // © int t o _ p i e t r o _ n r = krok_rekurencji . cout << endl . f/o% cout << suma_dotychczas << "+ " « to_pie t r o _ n r « " = " << (suma_dotychczas + t o _ p i e t r o _ n r ) << e n d l . // © krokrekurencji++ . Funkcje 177 Funkcje rekurencyjne int m a i n () { cout << "Ile pierwszych liczb n a t u r a l n y c h " "chcesz posumować?: ". int suma^dotychczas) // © .1 . cout << endl .. //O © } else { . • • int rezultat = 0 . //O © ) . // właściwa operacja sumowania suma _ d o t y chczas += t o _ p i e t r o _ n r . 5. return 0 . cin >> n. // zupełnie inny przykład funkcji rekurencyjnej //------------------------------------------------------ int liczba = 241 . . wracamy << endl..

m++) ( cout << znak << " " . // // 88 z/************************************************************ " void dwojkowo(int liczba) //O ® < int reszta = liczba % 2 .... 5.. wracamy . krok_rekurencji— . //O ® cout << endl. y/********************* **************************************** void schodki (int ile. '<’). char znak) //©O { cout « ile << " piętro: " . return rezultat . ) cout « " " . m < ile . //©<G> if{liczba > 1 ) // w a r u n e k z a tr z y m u ją c y © O { dwojkowo(liczba / 2 ) ... //© € > return . //w y w o ła n ie re k u re n c y jn e © © } cout << reszta . □ W trakcie wykonania tego programu na ekranie zadane zosta­ nie nam pytanie i pojawi się następujący tekst Ile pierwszych liczb naturalnych chcesz posumować?: 8 1 piętro: > 0+ 1 = 1 2 piętro: > > 1 + 2 = 3 3 piętro: > > > 3 + 3 = 6 4 piętro: > > > > 6 + 4 = 10 5 piętro: > > > > > 10+ 5 = 15 6 piętro: > > > > > > 15+ 6 = 21 7 piętro: > > > > > > > 21+ 7 = 28 8 piętro: > > > > > > > > 28+ 8 = 36 9 piętro: > > > > > > > > > 36+ 9 = 45 . for(int m = 0 ..178 Rozdz...to ostatni krok.. Funkcje Funkcje rekurencyjne //++++++++++++++++++++++++++++++++++++ schodki(to_pietro_nr. 9 piętro: < < < < < < < < < 8 piętro: < < < < < < < < 7 piętro: < < < < < < < 6 piętro: < < < < < < 5 piętro: < < < < < 4 piętro: < < < < 3 piętro: < < < 2 piętro: < < 1 piętro: < Suma pierwszych 8 liczb naturalnych to = 45 241 to dwojkowo 1 1 1 1 0 0 0 1 30942 to dwojkowo 111100011011110 ...

g d z ie funkcja w yw ołuje siebie sam ą. Jak w id zisz w funkcji m ain . . (Jej deklaracja je st na samej górze prog ram u O ). Funkcja nie będzie w yw o ły w ała siebie sam ą w nieskończoność. iż rozw iąże ona zag a d n ien ie m etodą rekurencji. A rg u m en t ten nazyw am y tutaj j e s z c z e _ k r o k ó w (ile jeszcze kroków rekurencji m a się odbyć). Z w róć u w ag ę. Jest ono um ieszczo n e w ram ach instruk­ cji w ypisującej na ek ran . Wartością domniemaną powinno być oczywiście zero.. k tó rą sobie użytkow ­ nik zażyczył. bo jest tam w a ru n e k zatrzym ujący O© O m ów m y sobie je d n a k tę funkcję po kolei. argum ent domniema­ ny. to po prostu w y k o n am y su m o w an ie 100 + 1 + 2 + 3 + 4 +. Tym sam ym b ę d z ie to liczba rek u ren cy jn y ch kroków . Rzuć okiem na ciało tej funkcji . O W yw ołanie funkcji o nazw ie s u m a to r . Funkcje 179 Funkcje rekurencyjne Przyjrzyjmy się ciekawszym miejscom tego programu © W tym m iejscu p ro g ra m zadaje p y ta n ie ile liczb m a zostać p o d sum ow anych. że w yw ołując funkcję suma tor nie m usim y się n aw et dom yślać. bo u rucham iając tę funkcję po raz pierw szy zaczy n am y d o d aw ać do zera (Jeśli b y śm y tam postaw ili n p . 8) Ten argument suma dotychczas -to doskonały kandydat na tzw. D rugi a rg u m e n t ma nazw ę su m a d o t y c h c z a s i słu ży ł będzie do p rzen iesien ia dotychczasow ego w yniku su m o w an ia z w y w ołania na w yw ołanie.Rozdział. w p ierw szy m w yw ołaniu tej funkcji © arg u ­ m entem a k tu a ln y m jest zero. int suma_dotychczas). a zw racającą rezu ltat ty p u i n t . jest to funkcja rekurencyjna. ale jeśli to w y d a je Ci się za tru d n e w an alizie . •i* P ierw szy arg u m e n t tej funkcji to liczba sum ow ań. © O to definicja funkcji o nazw ie sumator.jest ta m miejsce 0 0 . P rzeczytajm y d ek larację tej funkcji int sumator(int jeszcze_krokow. O W funkcji s u m a t o r definiujem y sobie (lokalny) obiekt au to m aty c zn y typu i n t o nazw ie r e z u l t a t . 0). 5.. In n y m i słowy.). 100. cout << "\nSuma pierwszych " << n << " liczb naturalnych to = " << suma « endl. że za m ia st tej instrukcji są d w ie takie+ int suma = sumator(n. s u m a t o r jest funkcją w y w o ły w an ą z d w o m a arg u m e n tam i typu i n t .w yobraź sobie.

O c z y w iśc ie m o g ą też się p o ro z u m ie w a ć z a p o m o c ą a r g u m e n tó w w y w o ła n ia . które to już jest kolejne w y w o ła n ie . © Definicja obiektu autom atycznego o nazw ie t o _ p i e t r o _ n r . gd zieś m u si być w arunek zatrzym ujący rekurencję .czyli warunek. To w łaśnie o d b y w a się tutaj. Przydom ek s t a t i c sprawia. to znaczy. N atom iast dopiero seg m en t e l s e tej . że rzeczyw iście m am y tu d o czynienia ze spiętrzaniem się w yw ołań . Ma on nam su gerow ać w stępo­ w a n ie na dalszy (w yższy) poziom rekurencji. Spójrz jeszcze raz na ekran. Za pomocą takiego obiektu poszczególne w yw ołania mogą się m iędzy sobą porozum iew ać. Zatem przy p ierw szym w yw ołan iu wartością te zm iennej stanie się 1. W naszym przypadku jest to obiekt o nazw ie k r o k _ r e k u r e n c j i i s łu ż y on do tego. © W funkcji tej tw orzym y też obiekt typu i n t z przydom kiem s t a t i c . Funkcje Funkcje rekurencyjne Skoro ta zm ienna jest autom atyczna. Jej definicję w id zisz w miejscu © O . Jest w ięc on jakby w spólny dla w szystkich rekurencyjnych (i nie rekurencyjnych) w y w o ła ń tej funkqi. © Jak pam iętam y. przygotow ałem funkcję o nazw ie s c h o d k i . piąte piętro rekurencji. D rugim argumentem w yw ołania jest znak '>'. Tutaj w łaśnie to w id z im y . To ta funkcja w łaśnie odpow iada za narysowanie jakby w znoszącej się piram idy w yw ołań . Akurat w tym przypadku w w yrażeniu instrukcji i i 7jest warunek m ów iący c zy kontynuować. O © By rekurencja nie odbyw ała się w nieskończoność. to tutaj do dotychczasow ej sum y dodana jest wartość 5. 5. ♦♦♦ jeśli zaś jest to np. w którym decydujem y c z y ma być następn e w yw ołanie. ż e każde w yw ołanie tej funkcji będzie tw orzyło swoją w łasną. Jeśli argument form alny j e s z c z e _ k r o k ó w jest różny od zera.180 Rozdz. U w aga: N ie traktuj jednak dosłow nie słó w "warunek zatrzymujący". czy nie. że d o jd zie d o kolej­ n e g o w yw ołania rekurencyjnego. T u sprawa jest zupełnie inna. lokalną wer­ sję tej zmiennej. O © W łaściw e działanie tej funkcji to sum ow anie. O czyw iście nie ma ona żadnego znaczenia dla obliczania naszej sum y. a le ch ciałe m tu p o k a z a ć ta k ż e te n sp o só b . ż e jest to obiekt "nieśmiertelny". To tylko po to. byś zobaczył. to znaczy. czyli jakby: na które piętro rekurencji się w łaśnie w sp ięliśm y. ♦♦♦ jeśli jest to p ierw szy krok rekurencji. . W nim dana funkcja zapamiętać m oże sobie swój numer piętra w tej rekurencji O O A by to w szystko było bardziej przekonujące. że od razu po wejściu do funkcji wartość obiektu k r o k _ r e k u r e n c j i jest inkrementowana. Tutaj w id zisz. to d o dotychczasow ej sum y (0) dodana jest w artość 1. obiekty s t a t i c w stępnie zawierają zero.nie ginie po zakończeniu wykonania funkcji). (czyli w przeciw ieństw ie do obiektów autom atycznych . by każda funkcja w iedziała.

to wywołuje następną mówiąc jej. Z a u w a ż . ale zm n iejszo n ą o jeden. P rzy p o m in am .w y starcza. a n astęp n ie kolejne zejścia w dół. O © R ekurencyjne w y w o ła n ie funkcji p rz e z sam ą siebie. (Z obacz d o linijki © O jak o d b ieran y je st ten rezultat). że in stru k c je od początku funkcji. ż e nie m am y tu nic sp ecjaln eg o do zro b ien ia. g d y n astęp u je decyzja o zan ie­ c h a n iu d alszy ch w y w o łań . o m in ęliśm y w y w o łan ie re k u ­ rencyjne i tutaj zap a m ię tu je m y n asz ostateczny urobek (d o ty ch czaso w ą sum ę). że n ajp ierw są w y d ru k i z fazy w stęp o w an ia. T eraz b ęd ą in stru k cje. (Pam iętasz w y w o łan ie funkcji s c h o d k i z a rg u m e n te m '>'?). Jest to także sp o só b k o m u n ik o w a n ia się poszczeg ó ln y ch w y w o łań . T en re z u lta t s u m o w a n ia teraz m usi w ró cić to tego. ja sn o tu w idać. Z au w aż . R zu t oka na te n fra g m e n t funkcji . o o K ró tk o p rz e d z a k o ń c z e n ie m fu n k cji. by stw ierdzić. ż e funkcja nie w ysyła jako a r g u m e n t tej sam ej ilości k ro k ó w . Je d y n ie w y w o łu ­ jem y tutaj fu n k cję s c h o d k i . Spójrz na e k ra n . Funkcje 181 Funkcje rekurencyjne in stru k c ji w y k o n y w a n y je st w te d y . n a stę p u je d e k re m e n ta c ja zm ien n ej k r o k _ r e k u r e n c j i . zatem równie dobrze tej dekrementacji mogło by tu nie być.o d w y w o łan ia rek u re n c y jn e g o do końca funkcji . że ma być jeszcze tylko 6 kroków. T ak o d b y w ało się su m o w an ie na kolejnych etapach i w re z u lta c ie otrzy m aliśm y o stateczn y w y n ik . które w y k o n y w a n e są p rzy z stę p o w a n iu na dół. Czyli jeśli bieżąca funkcja dowiedziała się.rek u ren cja m a szanse się kiedy ś zak o ń czy ć. teraz z a rg u m e n te m '<' su g e ru ją c y m pow rót. czy li jakby nasz d o ty ch czaso w y u ro b e k . . jak na p o n iż sz y m rysunku.Rozdział. U nas akurat funkcje w trakcie powrotu nie interesują się wartością tego obiektu. ż e liczb a dalszych k ro k ó w m aleje . O © Jeśli zaś n astąp iła d ecy z ja o z a trz y m a n ia rekurencji (czyli w O © ) okazało się. że ma być jeszcze 7 kroków. że liczba d alszy c h k ro k ó w nie jest w ięk sza od zera. O © T ak się tu sk ład a. je st to obiekt staty czn y . d o w y w o ła n ia rek u ren cy jn eg o - były w y k o n y w a n e przed w stąp ien iem n a kolejne p iętro rek u ren cji. O © Funkcja zw raca r e z u l t a t su m o w an ia. czyli p o pow rocie z w y w o łan ia p o p rz e d n ia w ersja (p o p rz e d n i krok rekurencji) zo b aczy efekt tej dekrem entacji. 5. kto su m o w a n ia zażąd ał. D ziałanie tej rek u ren cji m ożna sobie g rafic zn ie w yobrazić tak. D zięki te m u . ż e kolejne p o w ro ty z w y w o ła ń rekurencyj- nych p o w o d o w a ć b ę d ą w y d ru k o w an ie sch o d k ó w i p rz e k a z a n iu (nie zm ienia­ n eg o już) w y n ik u su m o w an ia. D ru g im a rg u m e n te m w yw ołania jest d o ty ch czaso w a s u m a .

. W p rz y p a d k u pętli for nie ma takiej m ożliw ości. / / p ę tla " p o w r o tó w " N ib y w ięc m o żn a by zro b ić to sam o. i >= początek .w p rz y p a d k u rekurencji .czyli za pom ocą tzw. a sk o rzy stać z nich w trak c ie pow rotów . A p rz e c ie ż nie zaw sze w stę p n ie w iad o m o ile b ęd zie potrzeba p ię te r zag n ieżd że ń .. i < koniec . ale zw róć u w a g ę . jeśli zasto su jem y n a stęp u jący algorytm . N ie trzeba było u ciek ać się d o rekurencji.. i++). F u n k cja jest b a rd z o p ro sta O © . naj­ p ie rw m u sim y p o ro z m a w ia ć o alg o ry tm ie za m ia n y liczby d zie sią tk o w e j na d w ó jk o w ą. i <= koniec . i++) . k tó ry m m o ż e n ad ać jakieś w arto ści obliczone p rz y w stę p o w a n iu .m o im zd an iem . że .. Jeśli je st taka sytuacja. to łatw o dojść d o w n io sk u .ale. / / p ę tla " w stę p u ją c a fortint i = koniec . że to sam o su m o w an ie m o ż n a było zrobić z a p o m o c ą zw ykłej pętli f o r . Jeśli m a m y d o w o ln ą liczb ę całkow itą d o d a tn ią . iteracji. za p o m o cą dw óch takich p ę tli.182 Rozdz. pętlą for)? P ętla p rzebiega o d jed n ej w artości (początkow ej) d o innej (końcow ej) i n a tym kończy. i— ). k tó ra m eto d ą rek u ren cji w y p isu je na e k ra n ie d a n ą liczbę w zap isie b in arn y m . N ato m ia st rek u ren cja sk ład a się z w y w o ła ń i z p o w ro tó w . 5. Jaką p rzew ag ę m a .rek u ren cja n ad iteracją (np.. ab y z ro z u m ie ć . . O to przykład: Zobaczmy teraz inną funkcję rekurencyjną B ędzie to funkcja. Funkcje Funkcje rekurencyjne Co wybrać ? K iedy chw ilę się zasta n o w ić n ad tą funkcją. . for(int i = początek .d a n y poziom m a sw ój w ła s n y zestaw zm ien n y ch . Tutaj trzeb a by b y ło specjalnie p rz y g o to w a ć ze sta w o b iek tó w na w y n ik i p o śred n ie. d ecy d u ję się na rek u ren cję. W ów czas rzec zy w iśc ie u daje s ię uprościć z ag a d n ien ie. cz y li jest jakby zło żen iem dw óch p ętli forfint i = początek . to łatw o m o ż e m y ją p o k aza ć na e k ra n ie binarnie.

jaka jest (ta n o w a) liczba. p o w tó rn ie w y k o n u jem y czy n n o ści opisane w p u n k cie 1. jak je o trzy m y w aliśm y . Funkcje 183 Funkcje rekurencyjne 1. to: 1) O bliczam y resztę z d zielen ia p rz e z 2. K ró tk o m ów iąc ch o d zi o takie dw a d z iałan ia reszta = liczba %2 . 5. W prak ty ce w y g lą d a to po prostu tak. P o w stan ie z nich w ó w czas na ekranie liczba w zapisie d w ó jkow ym . Omówimy to teraz Jeśli m am y np. (W ywołanie rekurencyjne). przeczytaj o d razu w yjaśnienia poniżej. • Jeśli jest inna. //d zie le n ie je s t c a łk o w ite W yk o n aw szy to p rzec h o d zim y d o p u n k tu 2. Po praw ej jest g raficzn e w yjaśnienie. to zap a m ię tu jem y ją i p rzech o d zim y do p u n k tu 3. Reszta ta m o ż e być albo 1 albo 0. (Warunek zatrzymania rekurencji): S p ra w d z a m y . 14 % 2 = 0. O trzy m u ­ jem y w te d y rezu ltat d zielen ia (całkow ity) o raz resztę. R esztę tę zap am iętu ­ jemy. Rys. liczba = liczba / 2 . Z ap am iętu jem y tę resztę. (Czyli piszemy ją po prawej stronie pionowej kreski) . 3. D zielim y tę liczbę p rz e z 2 na za sa d z ie d zielen ia z resztą. N a to m ia s t rezu ltat całk o w ity zastęp u je d o ty ch czaso w ą liczbę. A by go zro zu ­ mieć. 2. W y p isu jem y na ek ran ie o w e reszty w o d w ro tn ej kolejności od tej. liczbę 14 i chcem y ją p rzed sta w ić w za p isie b in a rn y m . co się dzieje z ty m i liczbam i.Rozdział. • Jeśli jest w iększa o d 1. 5-3 liczba reszta liczba reszta 74 O 7 7 3 7 7 7 "1 4 ( 10) = 1 1 1 0 (2) Z lewej stronie na po w y ższy m ry su n k u w id zisz jak to robię n a papierze. jak na p o n iż szy m grafie.

Zobaczmy jak to zostało zrealizowane w programie.. ♦♦♦ 4) O b liczam y resztę 7 % 2 = 1 i zap a m ię tu jem y ją. czy li w y n ik i o trz y m a n e w p u n k ta c h 10). Tak powinno być. w ięc k o n ty n u u jem y . W rezultacie n a p isa n a zostaje n a stę p u ją c a liczba dw ój­ k o w a: 1110. p rz y p o m n ijm y so b ie ją tutaj b ę d z ie łatw iej ro zm aw iać. . } met pj y liwćr P ierw sze w ra ż e n ie je st takie. że funkcja je st raczej p ro sta. z astę p u je d o ty c h czaso w ą liczbę 7.. ♦♦♦ 7) O b lic zam y resztę 3 % 2 = 1 i zap a m ię tu je m y ją.czy li liczba 3. re tu rn . 4).z a te m d ziała w a ru n e k z a trzy m u jący rekurencję. Ten rezultat 1 zastę p u je d o ty c h czaso w ą liczb ę 3. a 8) S p ra w d z a m y czy 3 > 1. ❖ 10) O b liczam y resztę 1 % 2 = 1. w ięc k o n ty n u u je m y .zawsze się zastanów czy rzeczywiście uzycu rekurencji w tym algorytmie ma sens. T en re z u lta t z astę p u je odtąd naszą p ie rw o tn ą liczbę. * 11) S p ra w d z a m y czy 1 > 1 Nie! . jej d ek larację w id z im y w © . Poniew aż jest k ró tk a . Funkcja rekurencyjna powinna stanowić proste roz­ wiązanie skomplikowanego algorytmu. Z ap a m ię tu jem y ją. R ealizuje je fu n k q 'a o n azw ie dwój kowo. (Piszę ją pod spodem. W ich trak cie na ekranie (lu b k artce p ap ieru ) w y p is a n e zostają k o lejn e re sz ty z dzielenia.184 Rozdz. R ezu ltat. void dwójkowo(int liczba) * int reszta = liczba % 2 ©O if(liczba > 1 ) // warunek zatrzymujący // wywołanie rekurencyjne 0© dwójkowo(liczba / 2 ) } c o u t << r e s z t a . pod tamtą 14). Jeśli więc Twoja funkcja rekuren­ cyjna nie będzie prosta . ♦♦♦ 5) S p ra w d z a m y czy liczba 7 jest w ięk sza od 1 (Jest!) <► 6) D zielim y liczbę przez dw a ( 7 / 2 = 3). Z aczynają się te ra z p o w ro ty . 1). Funkcje Funkcje rekurencyjne ♦> 2) S p raw d zam y : czy 14 jest w ięk sze od 1 ? Tak. 5. 7). 3) D zielim y liczbę przez dw a (n a sposób całkow ity) 14 / 2 = 7. Tak. O © Tu jest definicja tej funkcji. 9) D zielim y 3 / 2 = 1.

g d y liczba p r z e s ta n ie b y ć w ię k s z a o d 1 © 0 Jeśli p o w o d u d o z a tr z y m a n ia n ie b y ło . © O W a ru n e k z a tr z y m u ją c y re k u re n c ję . N p . Ciekawe. Jak w id z is z . Jeśli trzecia bramka sprawdzi.n a s tę p u je w y w o ła n ie re k u re n c y jn e . Jak w id z is z . łubie ją stosować do zestawu tak zwanych bramek. to ju ż wiadomo. Rozmawiam tylko z jedną. (N a to ­ m ia s t z tej r e s z ty s k o r z y s ta m y w tra k c ie p o w ro tó w ). przed odpowiedzią. 5. C zy ja k b y o d p r a w e j d o lew ej. Jest to d z ie le n ie lic z b c a łk o w ity c h . a w ię c b ę d z ie o n a w y k o n y w a n a w tr a k c ie p o w ro tó w . Natom iast ona. Jest to ra c z e j z a a w a n s o w a n a te c h n ik a . że koniunkcja brameknie jest spełniona. R e k u re n c ja p o z w a la c z a se m n a p ro s te w y k o n a n ie s k o m p lik o w a n e g o a lg o ry ­ tm u . N a s tę p u je tu w y p is a n ie n a e k ra n ie z a p a ­ m ię ta n e j w c z e ś n ie j 0 © re s z ty z d z ie le n ia . D la c z e g o w y p is u je m y d o p ie ro te ra z ? D la te g o . . Jeśli chciałbym sprawdzić czy jakaś dana z układu pomiarowego spełnia koniunkcję jakichś warunków (zwanych często bramkami). że nie jest spełniona. a g d y n a s tę p u je w a r u n e k z a trz y ­ m a n ia . S p ó jrz n a e k ra n . w k tó r y m p rz e c h o w u je m y o tr z y m a n ą tu resztę z d z ie le n ia . w ię c n a s tę p u je o b cięcie c z ę śc i u ła m k o w ej. Ostatecznie pierwsza bramka odpowiada mi. to pytam o to tylko pierwszą bramkę. z przesłaniem odpowiedzi "fałsz". ż e p o sz c z e g ó ln e c y fry liczb y d w ó jk o w e j o trz y m y w a liś m y o d c y fry n ajm n iej z n a c z ą c e j.Rozdział. tamta znowu n a stęp n ą -a ż pytanie dotrze do ostatniej. d o tej w y w o ły w a n e j fu n k q 'i w y s y ła się lic z b ę p o d z ie lo n ą p rz e z d w a . Funkcje 185 Funkcje rekurencyjne 0 © D efinicja lo k a ln e g o o b ie k tu . pyta ewentual­ ną następną. Dzięki temu wcale nie muszę pamiętać z iloma bramkami mam rozmawiać. w mojej praktyce. Z a tr z y m a n ie to n a s tą p i w te d y . Potem zaczyna się zwracanie odpowiedzi. s to s o w a n a s to s u n k o w o rz a d k o . O p e ra c ja ta o d b y w a s ię przed w y w o ła n ie m r e k u re n c y jn y m . a ona załatwia m i (rekurencyjnie) resztę. tylko zaczyna powroty.: 7 / 2 = 3 0© In stru k c ja w y k o n y w a n a ju ż po w y w o ła n iu re k u re n c y jn y m . © M iejsce w fu n k c ji m a in . że koniunkcja prawdziwa być nie m oże-zatem w tedy trzecia bramka ju ż nie zadaje pytania czwartej. Ja. te warunkiem zatrzym ania mojej rekurencji wcale nie m usi być dotarcie pytania do "tej ostatniej" bramki w łańcuchu. w ta k i o to c h y try s p o s ó b s k o rz y s ta liś m y z f a k tu . g d z ie k o r z y s ta m y z n aszej fu n k cji. ż e rek u re n c ja n a jp ie rw c o ra z b a r d z ie j się " z a g n ie ż d ż a " . T y m c z a s e m n a e k ra n ie (i n a p a p ie r z e ) p isz e się lic z b ę o d lew ej d o p ra w e j. p o ja w iły s ię ta m d w ie liczby w z a p is ie d w ó jk o w y m ( b in a rn y m ). d o n a jb a rd z ie j z n a c z ą c e j. z a c z y n a ją s ię p o w ro ty z ty c h " z a g n ie ż d ż e ń " .

Funkcje Funkcje biblioteczne 5. Jest jednak coś. k tó re ktoś tam napisał. jak an alo g iczn e funkcje w innych w ersjach kom pilatora. Dygresja: Nazwa pochodzi od angielskiego określenia liter małych jaku „lower case (niższa kasetka) .'A'. w iedzieć jakie są operatory i jeszcze p a rę drobnych rzeczy. A oto. która zam ienia litery w tak i sposób. co zaw sze leżeć będzie na T w oim biurku: opis funkcji bibliotecznych. Przykładow o: K iedyś ktoś napisał funkcję. jak w y g ląd a n asza funkcja: I /************************************************ ************* char tolower(char znak) int różnica = 'a' . if ( (znak >= 'A') && (znak <= 'Z') ) return (znak + różnica). else return znak. w y starczy o p an o w ać tych kilkanaście instrukcji. . które w ykonują p e w n e stan d ard o w e u słu g i i w d o d atk u poszczególne fu n k cje m uszą nazyw ać się tak samo. R obim y to p rzez s p ra w d z e n ie czy k o d ASCII przy słan eg o z n a k u jest w ięk szy lu b ró w n y kod o w i zn ak u 'A ' i ró w n o cześn ie m niejszy lu b ró w n y k o d o w i z n a k u Z . Funkcje biblioteczne nie są częścią języka C++. a okazały się tak d o b re i tak często p rzy d atn e. że k ażd y p ro d u cen t kom pilatora C++ m usi ją także dostarczyć.wielkie litery nazywają się „upper case (xvyższa kaset­ ka). C zyli funkcja z wielkich liter ro b i małe. Kasetka z małymi literami. Litery takie znajdowały się w dwóch kasetkach z prze­ gródkami. M u szą być w niej funkcje. jako częściej używanymi.14 F u n kcje b ib lio te c zn e Program ow ać w C czy C++ to w zasad zie żadna sztuka. Określenia te pochodzą od pracy zecerów dawniej składających teksty w drukarni ręcznie. // ************************************************ Jak ta funkcja d z ia ła ? P rzy sy łam y do niej k o d zn ak u (jego rep reze n tację liczbo­ w ą). N atom iast m ały m literom nie szk o d zi. Są to po p ro stu funkcje. że jeśli w y ślem y jej jako a rg u m e n t w ielką lite rę ' W .Z . 5. natomiast po litery wielkie musiał on sięgać wyżej. znakom specjaln y m itd.d o niższej). N azy w am y ją t o l o w e r (ang. leżała bezpośrednio przed zecerem. Z w raca je jako m ałe. N ie szkodzi też cyfrom . ż e zrobiono z nich stan d ard o w ą bibliotekę. O to realizacja takiej funkcji.186 Rozdz. N astęp u je s p ra w d z e n ie czy jest to z n a k z p rz ed z iału A . to w o d p o w ied zi jako re z u lta t dostaniem y m ałą literę 'w 7. Biblioteka ta stała się tak p o p u la rn a w śró d p ro g ra ­ m istów . to lo w e r. Po k ró tk im czasie nie będziesz m usiał w trakcie p ro g ram o w an ia zag ­ lądać d o p o d ręczn ik a.

Rozdział. n ie z a b ie r a m y się d o p isan ia! B ie rz e m y d o rę k i o p is fu n k cji b ib lio te c z n y c h d o s tę p n y c h w n a s z y m k o m p ila to rz e . w y s ta r c z y d o d a ć d o jego k o d u tę w ła ś n ie ró żn icę) 32 U c z y li: 97 . że o b o k fu n k c ji t o l o w e r je st fu n k c ja toupper.90 z . b e z z m ia n . to d o k o d u z n a k u d o d a je m y liczb ę r ó żnica. ż e te ra z je s t w b ib lio te c e s ta n d a r d o w e j. a k o d e m o d p o w ia d a ją c e j jej litery m ałej je st z a w s z e stała. c z a sa m i p o d z ie lo n e n a r o z d z ia ły w e d łu g teg o . z ja k im i a rg u m e n ta m i n a le ż y ją w y w o ły w a ć i ja k i ty p fu n k cja ta z w ra c a . J e d n a k p o w ie d z m y jasno: w o p isie n ie z n a jd z ie m y te k stu (ciała) fu n k cji. Jeśli n a to m ia s t p rz y s ła n y d o fu n k cji z n a k nie je st z in te re s u ją c e g o n a s p r z e d z ia ­ łu . T y m lepiej. co ta fu n k cja ro b i. P r a w ie w s z y s tk o m o ż e s z p rz e c ie ż s o b ie n a p is a ć sa m e m u . to g o p o p r o s tu z w ra c a m y . ta k ie g o jak to n a p r z y k ła d n ap isaliśm y d la fu n k c ji tolower.97 B . N ie m u s is z ich z n a ć . ż e trz e b a d o d a ć w ła ś n ie ty le ? Z ta b lic y k o d ó w z n a k ó w A SC II. ż e ró ż n ic a m ię d z y k o d e m lite r y w ielk iej. T eg o w ła ś n ie s z u k a liś m y . Jest ta m ty lk o o p is a n e . Funkcje 187 Funkcje biblioteczne Jeśli ta k . O k a z a ła się tak p r z y d a tn a . K toś k ie d y ś n a p is a ł ta k ą fu nkcję. B ę d z ie to je d n a k w y w a ż a n ie o tw a rty c h d rz w i. 5. c o d o sw o jej n a z w y . a b y z e z n a k u A SC II r e p re z e n tu ją c e g o lite rę w ie lk ą zro b ić z n a k r e p r e z e n tu ją c y lite rę m a łą . k tó r a z a m ie n ia lite rę m a łą na w ielk ą. d o cz e g o s łu ż ą . ż e A .66 b . W o p is ie fu n k c ji b ib lio te czn y ch .67 c .65 W e w s z y s tk ic h in n y c h p o w s z e c h n ie s to s o w a n y c h k o d a c h p o w in ­ n a r ó w n ie ż b y ć z a c h o w a n a z a s a d a . fu n k c je tak ie są c z a s a m i u s z e r e g o w a n e a lfa b e ­ ty c z n ie . W o p is ie ty m s p is a n e są w sz y stk ie d o s tę p n e s ta n d a r d o w e fu n k c je b ib lio te c z n e . C o z a te m ro b im y ? N ie. b o k o m u ś .65 a .99 Z . S k ą d w ie m y . O d n a le z ie n ie w łaściw ej n ie jest rzeczą tr u d n ą . . ż e k o le jn e lite ry a lfa b e tu r e p r e ­ z e n to w a n e są k o le jn y m i k o d a m i lic z b o w y m i. N a to m ia s t nie m ó w i się jak je s t to z re a liz o w a n e . Z a łó ż m y je d n a k . ż e in teresu je C ię e w e n tu a ln a z a m ia n a lite r m a ły c h n a w ie lk ie . W n a s z y m p r z y p a d ­ k u ła tw o d o jd z ie m y .122 N ie je st to p r z y p a d k ie m . D z ię k i te m u . Z ta b licy tak iej ła tw o z n a jd z ie m y .98 c . nie m u s is z ich n a w e t u ż y w a ć .

188 Rozdz. Plik ten trzeba dołączyć w czasie lin kow ania (czyli łączenia). Jest to nazw a funkcji . Jak w id ać z fu n k cjam i bibliotecznym i s p ra w a jest prosta: n ajp ierw szu k am y funkcji w opisie2. Po co ta inform acja? W zasadzie m ó w iliśm y już o tym kilkakrotnie. iż każda nazw a w języku C++ m usi b y ć z a d e k la ro w a n a zanim zostanie u ży ta. jakby to była n asza w łasna funkcja. ale tu niestety nie m o g ę Ci nic pom óc. (K om pilator klasy czn eg o języka C b y n am to podarow ał. Jak to zro b ić . ale ja osobiście taką pobłażliw ość k o m p ilato ra C o k u p iłem ju ż kilkom a g o d z in a m i p o szu k iw ań błędów w p ro g ram ie. Funkcja jest je d n a k zd efin io w an a w plik u bibliotecznym . P am iętasz zap e w n e. 5. T ak. Jest to zw y k le b a rd z o p ro ste. Funkcje Funkcje biblioteczne kto chce p o słu ży ć się daną funkcją. h W ystarczy w ięc w staw ić ten plik n ag łó w k o w y do tekstu n aszeg o p ro g ra m u za pom ocą d y re k ty w y preprocesora #include <ctype.zn ajd zie sz w opisie sw ojego kom pilatora. A byśm y nie m usieli pisać jej sami (przepisując z opisu biblioteki). D odatkow o p rz y opisie danej funkcji bibliotecznej zn ajd ziem y też inform ację. Jeśli jednak zamiast tego pliku nagłówkowego użyjemny inny: #include <cctype> to nazwa tej funkcji pojawi się w przestrzeni nazw s t d : : Krótko mówiąc będziemy musieli używać dłuższej nazwy s t d : : to lo w e r chyba. zo stała ona już w p isa n a do pliku nagłów kow ego o nazw ie c t y p e .h> i spraw a jest załatw io n a. którym i p o słu ży ł się piszący tę funkcję. 12. gdzie znajduje się deklaracja tej funkcji. w § 3. iż nie trzeba w y d aw ać sp ecjaln y ch rozkazów . a n astęp n ie p o słu g u jem y się tą funkcją w pro g ram ie.7. Najczęściej je d n a k jest to tak z in te g ro w a n e z k o m p ilato rem .m u si więc znaleźć się w p ro g ram ie deklaracja tej funkcji. p o tem w staw iam y d o p ro g ram u plik n ag łó w k o w y z jej d ek la­ racją. to k o m p ilato r C ++ nam tego nie p o d aru je i u p o m n i się o nią. W naszym p rzy p ad k u t o u p p e r to też taka n azw a. Jeśli byśm y o ty m zapom nieli.__________________ 9) zwanym po angielsku: R c fc re n c e M a n u a ł . D latego w olę te ra z ten bardziej k ry ty c z n y język C++). O namespace rozmawialiśmy już na str. U w aga dla zaaw an so w an y ch : Jeśli użyjemy właśnie tego pliku nagłówkowego.5. n ie jest potrzebna zn ajo m o ść w szystkich sprytnych sztu czek . że zastosujemy dyrektywę u s i n g n a m e sp a c e . to nazwa to lo w e r stanie się nazwą globalną.

Rozdział. Osobiście za w sz e . a w ciele tej funkcji znajduje się instrukcja r e t u r n 4. Które z nich są niepoprawne? a) in t t a (). i n t . Czy przed tym wywołaniem powin­ na wcześniej nastąpić definicja tej funkcji.2 . c h a r. Jaką wartość zwróci funkcja f ? Co się stanie. abyś z tego paragrafu zapamiętał: To m ianow icie. i n t . 5. ch ar) . i n t ) . c) v o id f c ( v o i d ) . O prócz funkcji n ap raw d ę stan d ard o w y ch takich jak np. że opis (leksykon) funkcji bibliotecznych będ zie Twoim najlep­ szym przyjacielem .15 Ć w iczen ia W danym miejscu programu wywołujemy funkcję f. k tó re posłużą nam do narysow ania n a błękitnym ekranie białego kółka w y p ełn io n eg o deseniem z czerw onych serd u szek . b) v o id f b ( i n t ) . h) i n t f h ( d o u b le w sp o lcz. czym różni się wywołanie funkcji od podania jej nazwy ? Przeczytaj następujące deklaracje funkcji. jeśli w funkcji v o id f 5 ( ) . Jaką wartość zwróci funkcja f ? Mamy deklarację funkcji d o u b le f 2 ( ) . obliczenie x d o potęgi 17/23. Trochę tak. e) f e ( d o u b le . g) v o id f g ( i n t l i c z b a ) . Mamy deklarację funkcji in t f (). znaleźć tam m ożna też takie. a w ciele tej funkcji znajduje się instrukcja « re tu rn 4 . jak tylko przyjdzie m i pracow ać na no w y m typie kom putera. f) v o id f f (d o u b le . d) d o u b le f d ( i n t . i n t c h a r z n a k ). znajdzie się instrukcja . Funkcje 189 Ćwiczenia Co chciałbym. 5. Z najdują się tam b ardzo różne ciekaw e funkcje. łapczyw ie rz u c a m się na opisy funkcji bibliotecznych. i n t . v o id ) . czy deklaracja tej funkcji? Jak wygląda operator wywołania funkcji? To znaczy. jak „ściąga" na kolokw ium .

in t k). oraz in t m a i n () Która z nich jest poprawna? W naszym programie. 7). . d o u b le druga(char z. Czy poprawne są następujące deklaracje a) int mani () b) man 2 () .) . vo id p i e r w s z a () char cc = x' d ou b le r = druga(cc.190 Rozdz. oprócz funkcji m ain mamy funkcje f f f o następującym ciele d ou b le fff( in t m = 6 + 3 main (). Czy to poprawne? Funkcja main jest zdefiniowana w taki sposób int main return 33. 5. Funkcje Ćwiczenia return C. c) int main(). Gdzie dotrze wynik pracy tej funkcji (czyli ta liczba 33)? Co to są argum enty formalne funkcji? XIII Co to są argum enty aktualne funkcji? Co to są argum enty wywołania funkcji? Oto dwie funkcje: void pierwsza. Gdzie w programie jest deklaracja funkcji m ain ? Mamy takie dwie realizacje funkcji m a i n in t m ain ) return 1 .

int b = 2. Który może zmody­ fikować wartość obiektu wysłanego do funkcji.3). fl(liczba). Mamy dwie funkcje void fl(int n) { n++. Można ją wywołać na przykład tak: f(l. wielokrotnie używana jest funkcja mająca jeden argument domniemany typu double. W którym miejscu programu powinna się znaleźć informacja o domniemanej wartości tego argumentu? XIX Czy możliwa jest funkcja. która ma domniemaną wartość rezultatu? Funkcja ma mieć dwa argumenty. jaką nadaje powyższe wywołanie. Jego domniemana wartość to 7. Widzisz tu dw a wywołania funkcji druga. Wymień wszystkie pozostałe możliwe sposoby wywołania tej funkcji nadające argu­ mentom formalnym tę samą wartość. Wymień dwa poznane dotychczas sposoby przesłania argumentów.cpp Wiemy. W jakiej kolejności mogą one wystąpić w deklaracji tej funkcji? Dana jest funkcja void f(int a. z którch jeden ma mieć wartość domniemaną.5 Funkcja ta zdefiniowana jest w pliku zzz. Funkcje 191 Ćwiczenia double y = druga('h'. .Rozdział. f2 (liczba). że deklaracja tej funkcji musi się znaleźć w każdym pliku. (albo w jednym pliku nagłówkowym włączanym do wszystkich tych plików). który z tej funkcji zamierza skorzystać. Dla obu przypadków wywołań wymień nazwy argum entów formalnych funkcji druga. int c . która ma wszystkie argumenty domniemane? Czy możliwa jest funkcja. 3). m) . Dla obu wywołań wymień jej argu­ menty aktualne. cout << "liczba= << liczba << endl. 5. cout << "liczba= « liczba << endl. a który nie? W programie składającym się z wielu plików. drugi jest zwykły. 2. 1 void f 2 (int &n) n++. Jaki otrzymamy wydruk na ekran pochodzący z poniższego fragmentu programu? void g() 1 int liczba = 1 0 .

d o u b le b = x ) . ale dawał się j kompilować poprawnie? XXVI Czy możliwe jest. char c = '2'). I .192 Rozdz. że poprawna jest deklaracja umieszczona poniżej w pierwszej linii.należy umieścić definicję funkcji i n l i n e ? Jak postąpić. Czy poprawny jest następujący prosty program? i i n c lu d e < io stream > u s in g nam espace s t d . Drugi jest typu d o u b le i jego wartością domniemaną jest 12. fun(zero). by jego działanie się nie zmieniło. Funkcje Ćwiczenia Napisz deklarację funkcji o nazwie f x. 5. by funkcja. d o u b le . 8 . c h a r c) .l . która zwraca rezultat typu b o o l. d) v o id flint a. gdy program składa się z kilku plików? I Napisz program składający się z funkcji main i funkcji d r u g a będących w dwóch różnych plikach. d o u b le = 3. d o u b le x = 1 . b) v o id flint a. a wywoływana! jest z dwoma argumentami. wskaż błędne. f u n () . c) v o id f (in t a. 6 ) .5 Jeśli przy pisaniu tej deklaracji pomogłeś sobie wymyślając (dowolne) nazwy tych argumentów. w której nazwy argumentów nie występują (przecież nie muszą. i f ( 2 > z e ro ) { v o id f u n ( i n t a. ( v o id f u n (i n t a = . d o u b le . //**************************************************** i n t main() 1 n i n t z e ro = 0 . ważne są tylko ich typy). d o u b le — 3. 6 . której deklaracja nie przewiduje żadnych argumentó domniemanych. v o id f u n ( i n t a. d o u b le b = y ) . Załóżmy. że jeden z argumentów formalnych funkcji f nie będzie w niej _ użyty mimo że inne funkcje tę funkcję f często z odpowiednim argumentem aktualnym 1 wywołują. Pierwszy z nich jesttypu char i jego wartością domniemaną 1 jest 'g'. w jakimś lokalnym zakresie mała zdefiniowane argumenty domni umanę? ia tiv • Jeśli zdecydowaliśmy. to dlaczego? Jak go poprawić. to gdzie należy zrobić zmianę określającą dany argum ent jako nienazw any?! W definicji czy w deklaracji funkq'i? ■ xxvni W którym miejscu programu składającego się z jednego pliku . c h a r = ' 6 ' ) . c h a r c ). napisz także deklarację. a) v o id flint a .1 . Jeśli nie. f u n (1. Czy] poprawne jest wystąpienie zaraz za nią tych następnych w takiej właśnie kolejności? Jeś li nie. d o u b le b) { ) d o u b le v — 8 .

Napisz program. f o r ( i n t i *= 0 . Czy można w tym pliku nagłówkowym umieścić instrukcję: e x t e r n i n t zm ienna = 12. by każda z nich pracowała choć raz. Mają się tak wywoływać.najpierw wypisze na ekranie wartość każdej z sześciu zmiennych globalnych. Funkcja ma i n ma wywoływać tę funkcję 100 razy. która przyjmuje dwa argumenty typu i n t . . używając pliku nagłówkowego włączanego dyrektywą # i n c l u d e . W każdym plików mają być po trzy zmienne globalne typów: i n t . Jeśli wywołamy ją tak: sumuj (4) — to czy można powiedzieć jaka będzie wartość zwracana przez nią? Mamy następujące obiekty: globalny. Mamy plik nagłówkowy z deklaracjami.cpp naszego programu (jak w poprzednim zadaniu). Niech każda z funkcji tego programu: . W każdym z nich mają być po dwie funkcje. Zrób to na dw a sposoby: 1. O których z nich można powiedzieć. (w sumie zatem będzie ich sześć). } r e t u r n sum. Porównaj czas życia obiektów zdefiniowanych w ciele funkcji bez przydomka s t a t i c i z przydomkiem s t a t i c .przy co dwunastym wywołaniu . bez użycia pliku nagłówkowego. a jako rezultat zwraca większy z nich. Plik ten włączany jest dyrektywą # in c lu d e w trakcie kompilacji kilku plików *.ponownie wypisze na ekranie wartość każdej z sześciu zmiennych globalnych. w którym będzie funkcja v o id f () . i < i l e .h. d o u b le . statyczny. . "nowy tu z in " ).Rozdział. skompiluj i uruchom program. 5. który będzie się składał z dwóch plików źródłowych *. jak i z funkcji d ru g a. że zawierają śmieci. Funkcje 193 Ćwiczenia Następnie napisz definicję funkcji i n l i n e o nazwie w ię k sz a . automatyczny. c h a r . lokalny. i++) ( sum += i . o których. Czy poniższą funkcję uda się skompilować poprawnie? in t sumuj(int ile) i n t sum.zmieni wartość ich wszystkich. Wywołania tej funkcji mają być zarówno z funkcji m ain. 2.cpp. Posłuż się plikiem nagłówkowym ł .(main to też funkcja). że wstępnie inicjalizowane zerami. a o których nic takiego nie można powiedzieć? Używając dostępnego Ci kompilatora napisz.wypisywać na ekranie stosowny tekst (np. Jaki zakres ważności ma nazwa zdefiniowana w pliku programu poza wszelkimi funkcjami? Jak rozciąga się ten zakres ważności? Porównaj zakres ważności nazw obiektów zdefiniowanych w ciele funkcji bez przydom- ka s t a t i c i z przydomkiem s t a t i c . . Funkcja f ma wiedzieć ile razy została już wywołana i . w którym wystąpią potrzebne deklaracje.

* .nie zawsze będą miały pełną (czterobitową) grupę. którzy przeczytali paragraf o rekurencji XXXVIII X Co to jest rekurencja (bezpośrednia lub pośrednia)7 X Co sprawia. realizującą wydruk liczby całkowitej w postaci dwójkowej. zastosowaliśmy trzy możliwości komunikowania się między sobą poszczególnych wywołań rekurencyj* nych funkcji sum ator. Zmień tę funkcję tak. by wypisywała poszczególne bity grupując je w czwórki. Funkcje Ćwiczenia Jaki odniesie to skutek? (Co na to kompilator? Co na to linker?) Ćwiczenia dla tych.czyli by liczba: 10110111110111 została wypisana tak: 10 1101 1111 0111 Jak widzisz. który posługując się rekurencją obliczy wartość wyrażenia n! (n-silnia). Poszczególne czwórki powinny być oddzielone spacjami . 5. grupowanie zaczyna się od prawej stronie liczby. Oczywiście najbardziej znaczące bity . gdzie n będzie wartością podaną przez użytkownika z klawiatury.194 Rozdz. X W programie przykładowym. X W paragrafie omawiającym funkcje rekurencyjne zobaczyłeś funkcję rekurencyjną. w paragrafie omawiającym rekurencję. że rekurencja ma szansę się zakończyć? X Napisz program. Wymień te trzy sposoby.

którzy takich z n a k ó w na klaw ia­ turach nie mają. by prep ro ceso r w ykonał jakąś akcję. N a p rz y k ła d w ielokrot­ nie w ystępow ała ju ż w naszych p ro g ram ach dyrektyw a tinclude <iostream> D yrektyw y są żąd an iam i. P rzed tym zn a k ie m m ogą być w linijce tylko spacje i tabulatory. W z a sa d z ie byłby dla nas n iezau w ażaln y i n ieisto tn y . O ty m m ów i poniższy p aragraf. Z anim k o m p ilato r przys­ P tępuje d o akcji. a ich zn ak iem szczególnym jest to. gdyby nie kilka przy słu g .1 Na p o m o c ro d a k o m Jeśli Twój k o m p u ter m a na klaw iaturze znaki: \ A [ 1 1 1 ! to m ożesz opuścić ten paragraf i zacząć czytać następny. że pierw szym nie-białym zn ak iem takiej linijki jest z n a k #. 5.Rozdział. Z niektórym i tak im i dyrektyw am i już się osw oiliśm y. bez jakiejkolw iek inicjatywy z naszej strony. . Jest jednak akcja. która zostanie w yk o n an a przez n iego samoczynnie. d ecy d u jem y za p o m o cą tak zw anych dyrektyw preprocesora. D yrektyw y tak ie są um ieszczane p rz e z nas w stoso­ w nych miejscach p ro g ram u . Preprocesor podejm uje ją zw y k le na nasze w yraźne żąd an ie. co m a zrobić d la nas preprocesor. tekst program u jest p rzeg ląd an y p rz e z preprocesor. Z w ykle p rep ro ceso r w kracza do pracy sam . Preprocesor 195 N a pomoc rodakom 6 Preprocesor reprocesor to jak b y przednia straż kom pilatora. 6. O tym . jak preprocesor pom aga program istom . k tóre m oże nam oddać. M ów ić tu będziem y o tym .

sekwencja ?? ( oznacza to samo. c h a r t a b l ? ? (30??) .0 . f o r ( i = 0 . ż e odlegle przypominają znak. i < 30 . jeśli nie masz na klawiaturze tych znaków. . gdyby nie to. co znak [ Oto zebrane sekwencje i ich odpowiedniki: ??= # ??( 1 ??/ \ ??) 1 - ??< { ??! I ??> ) Prosty program wygląda z użyciem tych symboli tak: ? ? = in c lu d e < io s tre a m > u s in g n am esp a ce s t d . Wiemy. że twórca. a •• o Pewnie nikt by się biednymi Duńczykami nie przejął. gdzie w tych miejscach są znaki typV: A d E •• e O a o . Np. 6. Są one tak dobrane. i ++) ??< tabl??(i??) = ' a ' + i. c o u t « " z a ł a d o w a n i e do e le m e n tu " « i « " w a r t o ś c i " << t a b l ? ? ( i ? ? ) << e n d l . Preprocesor N a pomoc rodakom w Zatem.. i ++) ^ i f ( ( t a b l ? ? ( i ? ? ) ==' k ’ ) ??!??! ( t a b l ? ? ( i ? ? ) ==' m ' ) ) ??< c o u t « " Znak " « t a b l ? ? ( i ? ? ) << " j e s t w e le m e n c ie " << i << e n d l . to po pierwsze bardzo Ci współczuję i zastanawiam się. języka C++ Bjarne Stroustrup pochodzi z Danii.196 Rozdz. który mają imitować. w niektórych krajach komputery mają w miejscu tych znaków swoje znaki narodowe. ??> cout « " P o s z u k i wa n i e l i t e r y k l u b m ? ? / n " . Przykładem niech będzie Dania. N ieste­ ty. for( i . jakim cudem dobrnąłeś w tej książce aż tutaj. i < 30 . ??> 1) Mieszka w USA i pracuje w AT&T. o które nam chodzi. i n t ma i n ( ) ??< int i .1 Także w innych krajach mogą być na klawiaturach jakieś inne znaki —zamiast tych. jak bardzo ważne i częste są te znaki w programowaniu w C++. C o wtedy? Wyjście jest takie: Nieobecne na klawiaturze znaki można w programie uzyskać zastępując je tak zwanymi sekw&ticjawii trzyzYidkowytni.

c o u t << "Mówiłem c i t o CZTERY r a z y ". c o u t « "Mówiłem c i to CZTERY r a z y ".2 D y re k ty w a #def ine Ta d y rek ty w a prep ro ceso ra ma postać: #de f i ne wyraz ciąg znaków zastępujących go D yrektyw a d e f i n e 2 pow oduje. ale w zu p e­ łnie innych znaczeniach i kontekstach. f u n k c j a (4 . 6. jak ten zastęp o w an y . Lepiej w ięc. funkcja(CZTERY. O czyw iście nie m usi być to koniecznie w yraz. Z w yczajow o w y razy zastępow ane pisze się w ielkim i literam i po to.. stałych tekstow ych).. W ew nątrz stringów bow iem . zupełnie p rzy p ad k o w o mogą się pojaw ić identyczne w y razy . Z au w aż. że dyrektyw a d e f i n e nie penetruje w n ętrza stringów (czyli tzw . i = 4 + 2 * 4. co jest ciągiem znaków zastępujących. Pow tarzam . zostan ie p rzez p rep ro ceso r autom atycznie zam ieniony na: 9 ) £ ! r ' ' 1• i ?J * Vv * ?. f l o a t tablica[CZTERY] . Jest to oczyw iście zu p ełn ie logi­ czne.m usisz pom yśleć o zm ian ie k law iatu ry Tw ojego kom putera. to nie m a ra d y . 3 ) . 3 ) . N a p rzy k ład p o n iż szy fragm ent: i d e f i n e CZTERY 4 II . że d e f i n e nie m a d o nich dostępu. że w k o m pilow anym pliku k a ż d e następne w y stąp ien ie słow a -wyraz będzie zastęp o w an e w yszczególnionym ciągiem z n a­ ków . .jest to tylko zwyczaj. R ów nie d o b rze m ożna pisać litery małe.0 . .Rozdział. m o że m ieć w środku białe znaki. To natom iast. b y w tekście pro g ram u p rzy p o m n ieć sobie.i >t V ' II . f l o a t t a b l i c a [4]. 6. lecz o działanie d y rek ty w y d e f i n e . O to dalsze p rzykłady: 2) [czytaj: „dyfajn"] . że nie ch o d zi tu o nazw ę obiektu. i = CZTERY + 2 * CZTERY. Preprocesor 197 Dyrektyw a # d e f i n e ??> Jeśli p o w y ższy p ro g ra m w ydaje Ci się m ało czytelny. M usi być to jednak g ru p a zn ak ó w bez białego znaku w środku.0 .

Tym sposobem d y re k ty w a m oże się ciągnąć p rzez w iele linijek. float ta b lic a [4. ten sam fra g m e n t w yglądałby następująco: II . Preprocesor D yrektyw a # d e f i n e # d e f i n e MAX_LICZ_PASAŻER 250 # d e f i n e LICZB_STEWARD 8 i d e f i n e PASAZ_NA_STEWD (MAX__LICZ_PASAZER/ LICZ_STEWARD) Jak w id ać. że linia p o w in n a się skończyć . w ięc nie jest to groźne. Jeśli przez z a p o m n ien ie postaw im y ś re d n ik i na końcu. D yrektyw ą d e f i n e m o żn a d efiniow ać zastęp o w an ie dow olnego ciągu z n a ­ ków. Czyli d y re k ty w ą d e f i n e m o żem y sobie oszczędzić tro ch ę pracy p rzy p isan iu długich.. 3 ) . Z au w aż. a często w ystępujących instrukcji. N ie m a p ro b le m u : g d y u z n a m y . C zy li w j p rzy p ad k u naszej definicji t d e f i n e CZTERY 4. ż e nie jest to n o rm a ln a instrukcja p ro g ra m u . Z EG A R EK . O czyw iście na sk u tek w staw ienia tego średnika.po takiej dyrektyw ie i d e f i n e ZEGAREK ( w h i l e ( ! z a j e t y ) c z a s ( ) . co o d p o w ia d a zapisow i f u n k c j a _ a (). i =15 * c z y n n i k . ż e d y rek ty w a d e f i n e nie ma na k o ń cu średnika. 6. (while (!za jęty) czas(). Bardzo długie dyrektywy M oże się z d arz y ć. . i = 4. "bekslesz") i konty n u u jem y p isan ie d y rek ty w y w linijce następnej. z n a la z ł się on w z u p e łn ie n ieo d p o w ied n ich dla siebie m iejscach . .w yw ołując w trak c ie kom pilacji k o m u ­ nikaty o b łęd ach . c o u t << "Mówiłem c i to CZTERY r a z y ".J. . f u n k c j a (4. P rzy k ład o w o . ) m ożna w p ro g ram ie zastosow ać zap is funkcja_a ( ) . + 2 * 4.um ieszczam y na jej k o ń c u zn ak \ (o d w ro tn y ukośnik.198 Rozdz. x = 15 * l o g ( 1 7 ) . ).0 . To dlateg o . I lecz d y re k ty w a dla preprocesora. n astęp n e d y rek ty w y d e f i n e m ogą k orzystać z w łaśnie z d e fin io w a ­ nych w cześniej nazw . Taki błąd jed n ak w y k ry w a się n a ty c h m ia st. i =15 * c z y n n i k . . że ciąg zn ak ó w zastępujących jest d łu g i i z tego p o w o d u tru d n o um ieścić d y rek ty w ę w jednej linii. to zostan ie on u z n a n y jako jeden ze zn a k ó w zastępujących. x * 15 * l o g ( 1 7 ) .

Ż a d e n o b iek t tutaj nie pow staje. T akże o tym b ę d z ie m y m ów ili n ieb aw em . S ta ry styl: #define ROZDZIELCZOŚĆ 8192 long widmo[ROZDZIELCZOŚĆ] . Jak w idać. Z asto so w an ie m . że definicja to jest m o m en t. N a u sp raw ied liw ien ie d o d a m . T utaj ty lk o okreś­ lam y . O to p o ró w n an ie. jest m ięd zy in n y m i definiow a­ n ie sym boli dla kom pilacji w arunkow ej.czyli inaczej. T y m czasem tutaj sło w o define znaczy coś z u p ełn ie innego. Z apytasz: g d zie tu konsekw encja? N ie m a żad n e j konsekw encji i p rzep rasza m C ię za to. lepszy: m ian o w icie obiekty typu const. 6. że jak n ap o tk a się jeden ciąg zn ak ó w . To także nie w y trz y m a ło p róby czasu . D użo się n ap raco w ałem by w p o ić C i zasadę. N ie w ym agajm y w ięc konsekw encji od jego głu p szeg o służącego. To z n a m y od d aw n a. to należy go zam ien ić n a inny ciąg z n ak ó w .czyli: p ro sz ę o p o b łażliw o ść w linijkach zaczynających się od zn ak u # .p rep ro ceso rze. ż e c h w y t ten sto so w ać trzeb a tylko w obec d y re k ty w y p rep ro ­ cesora. Definiowanie stałych W języku C d y re k ty w a ta tradycyjnie u ż y w a n a była d o d e fin io w a n ia stałych. In n y m p o w a ż n y m zasto so w an iem d y re k ty w y define było d efin io w an ie tak z w an y ch makrodefinicji. long w i d m o (rozdzielczości. o c z y m po ro zm a­ w ia m y za chw ilę. k tó re p ró b ę czasu w y trzy m a ło . g dzie d a n y o b ie k t się rodzi.Berlin 39. W skrócie Jo m o żn a streścić tak: Stosując defin io w an ie stałych jako obiekty ty p u const dajem y k o m p ila to ro w i w iększe szan se w ykrycia n aszy ch e w en tu a ln y ch om yłek. O tym . W N a koniec jeszcze je d n a uw aga. . W języku C ++ o p ró cz te g o sposobu m am y in ny. Glienickerstr 100 Z w racam u w a g ę . jest to miejsce w p ro g ram ie. Preprocesor 199 Dyrektyw a # d e f i n e tdefine HMI Hahn-Meitner Institut\ fuer KernforschungN W. N o w y styl: const int rozdzielczość = 8192. Z w y k łą in stru k c ję p ro g ram u m o ż n a p rzecież sw o b o d n ie u m ieszczać w kilku linijkach. W tym ro zd ziale ro zm a w iam y o jeg o słu żący m . nieco innym językiem m ó w i się d o p rep ro ceso ra . 82).Rozdział. który p rz y c h o d z i jeszcze za n im z jaw ia się p raw ­ d z iw y k o m pilator. żeb y nie u ż y w a ć define jako sp o so b u d ek laro w a n ia sta ły c h m ów iliś­ m y już p rz y okazji d efin io w an ia ob iek tó w ty p u const (str. że tam to m ó w iłem o kom pilatorze. g d y rezerw uje się d la jakiegoś obiektu m iejsce w p a ­ m ięci .

ta: definicja) obow iązuje od m o m en tu w ystąpienia tej linii w p ro g ram ie..zam ien ia w tekście p ro g ram u w szelkie w ystąpienia w yrażenia KWADR (parametr) na w y rażen ie ( (parametr) * (parametr) ) 3) [Skrót ten czytamy: „andef"]. że ta dyrektyw a najczęściej p rzy d aje się w trakcie tw orzenia pliku. d o którego ten nasz zostaje w łączony ..na końcu naszego pliku u n ie w aż n iam y je za pom ocą #undef. Jak to działa? O tóż p rzed przystąpieniem do w łaściw ej kom pilacji . W tym pliku m ożem y p rzecież sobie roboczo definio­ w ać jakieś n azw y .200 Rozdz. Począw szy o d tego miejsca w program ie. jakbyśm y poprzedniej dyrektyw y # d e f i n e wyraz . by obow iązyw ały one n ad al w pliku. C zasem jed n ak m oże nam zależeć. aby preprocesor zapom niał o poleceniu w y d an y m m u dyrektyw ą d e f i n e . lub m akrodefinicje .a jeśli nie chcem y. p rzetw arzan ie dalszych linijek będ zie się o d b y w ało tak. a w ażne jest d o końca pliku. k tó ry ma być w łączany do innego (za pom ocą # i n c l u d e ) . .. Preprocesor Dyrektyw a # u n d e f 6 ..preprocesor (czyli straż p rzed n ia kom pilatora) . d y rek ty w a d e f i n e m oże służyć do tw orzenia m akrodefinicji. R ozw ażm y tak i przypadek: #define KWADR(a) ((a) * (a)) M ów im y. to ow o polecenie (nie chce m i przejść p rz e z g a r d ło . 6..3 D yrektyw a # u n d e f Jeśli d y re k ty w ą d e f i n e określiliśm y jakąś nazw ę. 6.. nie w y d aw ali W ydaje mi się. undefinr. tak i tu w C++. W tym celu w y starczy użyć dyrektyw y: # u n d ef wyraz To oczyw iście skrót od ang. że słow o KWADR jest n a zw ą tej makrodefinicji.4 M ak ro d efin ic je P odobnie jak w języku C.

R ozw ażm y taki p rz y p a d e k . Biały z n a k bow iem k o ń czy określenie m akrodefinicji. k tó ra n a m to w szystko zag w aran tu je.u p ro ścić go sobie.Rozdział. inline contra makrodefinicja P arag raf ten p isz ę m ię d z y innym i d lateg o .c) ( (a) * (b) * (c) ) P rzy p o m in am .4)). N a p ew n o . b y o brzydzić Ci o ch o tę d o uży w an ia m akrodefinicji. o któ­ rych ro zm a w ialiśm y w p o p rzed n im ro zd ziale.ogólniej . Dla wtajemniczonych: IVmakrodefinicja (w przeciwieństwie do funkcji) . d ro g i C zy teln ik u . W m akro d efin icji m o ż e być też w ięcej p a ra m e tró w #define ILOCZYN(a. Praw ie to sam o . 6. To z p o w o d u tych różnic szy k u ję c z a rn ą p ro pagandę. M am y n aszą m akrodefinicję: #define KWADR(a) ( (a) * (a) ) i zastosujem y ją w tak im w yrażeniu: int x = 4. p om yślałeś ju ż o funkcjach ty p u inline. N ajw ażniejsza ró żn ic a to to. ale są różnice. Lepiej zasto so w ać funkcję typu i n l i n e . 4) * (m+5. ani .białych z n a k ó w w w y ra­ żeniu ILOCZYN ( a . b .4). x teraz = " << x. N ie m a tu sp raw d za­ nia typ ó w p a ra m e tró w (jakby arg u m en tó w ). c \ . Z aw ołasz p ew n ie: „To przecież to sam o!" N ie. cout << "p = " << p << ". ż e nie m o że być spacji. K om pilator nie m o że n as ostrzec czy p o p ełn iliśm y jakiś błąd. a w dodatku jej nazwa nie może być przeładowywana. Preprocesor 201 M akrodefinicje P o takiej z a m ia n ie p rz y stę p u je się d o w łaściw ej kom pilacji. D o czego m o że s łu ż y ć taka m akrodefinicja? N a p rz y k ła d d o teg o . Inaczej m ów iąc. M yślę. że m ak ro d efin icja jest jakby tę p y m narzędziem . I (N a p ra w d ę to ciało n az y w a m y rozwinięciem m akrodefinicji). D latego m ak rodefinicji nie rad zę u ży w ać. czy m ma o n a być zastą p io n a. a z ac zy n a określenie tego.b. n ie to sam o. Czyli jakby o tw iera ja k b y ciało tej „funkcji". . cout « ((m+5. m echanicznym zam ien ian iem jed n ego strin gu na drugi. cout << KWARD(m+5. zam ien ią się a u to m a ty c z n ie na linijki: a = ( (c) * (c)) + ((x) * ( x ) ) . D rugi p o w ó d to n ie o c z e k iw a n e efe k ty u b o czn e . p. by zam iast stosow ać w linii sk o m p lik o w a n y za p is . ż e nie p rzy jd zie m i to tru d n o . n astęp u jące linijki p ro g ra m u : a = K W A D R (c ) + KWADR(x) . p = KWADR(x++).nie może mieć wywołań rekurencyjnych. nie ma s p ra w d z a n ia zak resu w aż­ ności u ży ty ch n azw .

jako fu n k cję ty p u i n l i n e . . W ym agałoby to zap ew n e n a p isa n ia kilku w ersji takiej funkcji. K lasycznym p rzy k ła d em jest taka m akrodefinicja: #define MAX(a. Jak w id ać inkrem entacja została w ykonana d w u k ro tn ie. Dla bardzo wtajemniczonych: Szablon jest właśnie takim (o wiele lepszym) narzędziem do automatycznego pisania różnych wersji takiej samej funkcji. G d y b y śm y jednak chcieli n ap isać to sam o. „Pasja C++". Łatw o to zrozum ieć. O szablonach napisałem książkę p. .sytuacje kiedy makrodefinicja przydaje się4 Z ap y tasz: „-M im o że nie sp ra w d z a nam typu a rg u m e n tó w ?" N ie ty lk o mimo. że w ręcz tru d n o to było czy teln e. z a leżn ie od typu p o ró w n y w an y ch arg u m en tó w . gdy ro zp iszem y sobie w y rażen ie.b) ( ( (a) > (b)) ? (a) : <b) ) m o żem y z niej korzystać n iezależn ie czy p o ró w n u jem y ze sobą dw ie liczby c z y d w a a d re sy . Tak jed n ak nie zaw ołam . Preprocesor M akrodefinicje W rezu ltacie w ykonania tego fragm entu otrzy m am y na ekranie: p = 2 0 . N ie bez p o w o d u .b. Zajrzyj do niej po przeczytaniu „Symfonii". czy też znaki. g d y chcem y oszukać kom pilator. Zamiast makrodefinicją lepiej posłużyć się narzędziem zwanym szablonem funkcji.. g d y nie chcem y. W eźm y taką (ry zy k o w n ą) m akrodefinicję #define WYR(a.t. ale w ręcz w łaśnie dlatego. g d y ż są (były). C hciałbym zaw ołać te ra z trium falnie: „ -A nie m ó w i­ łem?! N ie uży w ajm y m akrodefinicji wcale!"... w którym n a stą p iła m akrodefinicja.202 Rozdz. T y p arg u m en tó w n ie jest bow iem s p ra w d z a n y . że tak sa m o jak p o p rzed n ia.c) a * b + c Jeśli u ż y je m y tej m akrodefinicji w taki sposób: 4) W najnowszych wersjach języka C++ nawet ta sytuacja odpada. W y n ik u sp o ­ d ziew aliśm y się także innego . Są sytuacje. m o że być o n a ź ró d łe m w sp o m n ian y ch efek tó w uboczn y ch .. to n a le ż a ­ łoby d o k ła d n ie określić ty p arg u m e n tó w . by kom pilator s p ra w d z a ł nam typ a rg u m e n ­ tów . Z atem dlaczego ? To p r o s te .przecież (4 4 4) = 16. Nawiasy O jeszcze jednej rzeczy m u szę w spom nieć: Czy z a u w a ż y łe ś jak gęsto ro z w in ię ­ cia m ak ro d efin icji z a o p a try w a łe m w naw iasy? D o teg o sto p n ia . p am iętajm y . Jeśli w ięc zd ecy d u jem y się na p o słu g iw an ie się tą m ak rodefinicją. 6. N a p rz y k ła d w ted y . x teraz = 6 N ieza u w aż en ie dla nas x zo stało inkrem entow ane dw ukrotnie. W ygląda o n o w ted y tak: p = ( (x++) * (x++) ) . m im o że z a m ierza liś­ m y zro b ić to jednokrotnie.

Rozdział. to w efekcie d z iałan ia prep ro ceso ra linijka ta zam ieni się na taką: y = 2 * l + 6 . 1 + 6. . C zyli z am iast obliczyć: (2 * (1 + 6. Preprocesor 203 Sklejacz nazw.5 + (0 * 1000) ELEMENT(śruba) ELEMENT(pudlo) O d p o w iad a to takiem u zestaw ow i instrukcji: int srubaMaterial. double pudloWaga.5. 0) * 1000.5) + 0 ) * 1000 obliczym y: (2*1)+ 6. czyli operator ## y = W Y R (2. double pudloCena. int pudloMaterial. double srubaWaga. 6. 5 + 0 * 1000. double srubaCena.

6. to tym sam y m o trzy m am y strin g będący kopią tego. to może się to opłacić. (Może trochę bardziej p rzy d atn e użycie tego o p erato ra zobaczym y niebaw em .napisaliśm y. POKAZ(obiekt) . M im o to. skrzydło). że w ym yśliliśm y taką makrodefinicję: #define POKAZ(x) cout « (x) .. □ to w rezultacie na ekranie zobaczymy 5 12 12 12 Jeśli w m akrodefinicji. Jak w id ać. 212). 6. int obiekt = 5. p raw ie nigdy go nie u żyw am . co tam . . POKAZ(obiekt + 7 ) . POKAZ(obiekt) .co) boeing_ ## typ ## _ ## co ## _cena w p rz y p a d k u zapisu cout << BOE(747.204 Rozdz. w rozw inięciu jej u ży jem y p aram etru p o p ­ rzedzonego zn ak iem #. Przy "produkcji" jednej nazwy można tego operatora użyć wielokrotnie Idefine BOE(typ. Preprocesor Zam iana param etru aktualnego m akrodefinicji na s t r i n g Jeśli takich elem entów m ają być setki.jako p aram etr a k tu a ln y . na str. P O KAZ(10 + 2).. Po p ro stu : jeśli naszą m akrodefinicję zm ienim y na taką: Idefine POKAZ(x) cout << #x « ”= " « (*) << e n d l a frag m e n t program u będzie n ad al taki sam int obiekt = 5. P O KAZ(12) . P ozw ala ona wyświetlić na ekranie w artość jakiegoś obiektu (w yrażenia). dzięki temu operatorow i zaoszczędzić m ożna pisania. POKAZ(obiekt + 7). Jest o n zastąpiony przez cout << b o e i n g _ 7 4 7 _ s k r z y d l o _ c e n a . Jeśli g d z ie ś w program ie użyjem y tej m akrodefinicji w taki sposób.6 Z a m ia n a param etru aktu aln eg o m a k ro d e fin ic ji na string Z ałóżm y.

(albo kilka instrukcji) ująć w ta k i ko m en tarz. g d y tego zaż ąd am y . T a k a m akrodefinicja m o ż e być b ard zo p rz y d a tn a w trakcie p racy n a d p ro g ra­ m e m . w y d ru k i takie nie są ju ż p o trze­ b n e. . że strin g ten w y p isy w an y jest n a ekranie d z ię k i stru m ien io w i c o u t . Kom pilator. W yjście to n ie jest dobre. <♦ W d ru g im w y w o ła n iu w y rażen ie # x o zn acza strin g " o b i e k t + 7". T eoretycznie m o ż n a b y więc je usunąć. N a p rzy k ła d n a etapie u ru c h a m ia n ia p ro g ra­ m u p rzy d ają się linijki w ypisujące na ek ran ie w y n ik i pośrednie.jak p am ięta sz ko m en tarzy ty p u /*.*/ nie m o ż n a zag n ieżd żać. cout << "teraz x = " « x << endl.próbę tak ą u zn a za błąd.Rozdział. że tek st w id o c z n y na ek ra n ie p rz e d zn a­ k ie m ' = ' w yjaśnia n a m . by pew n e linijki p ro g ram u pojaw iały się w nim ty lk o w ted y .. to jesteśm y bezsilni. Preprocesor 205 Dyrektywy kompilacji w arunkowej P O K A Z (12). (Jest tam m ięd zy in n y m i c o u t << #x).*/ ju ż w tym fragm encie jakoś jest u ż y w a n y . to na ekranie zobaczymy taki. ciekawszy tekst obiekt= 5 obiekt + 7= 12 12= 12 10 + 2= 12 Jak w id zisz. / / p o m o c n ic z y w y d r u k m = funkcja(x). n o ale .m o że p om óc w o d s z u k a n iu błędu. C zęste w y św ie tla n ie zaw artości zm ien n ej w tej części p ro g ra m u . jak chcielibyśm y ..czy k ie d y ś jeszcze p rz y robieniu jakiś m odyfikacji nie p rz y d a d z ą się. że chcielibyśm y. a k o m e n tarz typu /*. W yjściem jest oczyw iście chw ilow e ujęcie ich w zn ak i k o m en tarza. Jak to się stało? O tóż w p rz y p a d k u pierw szego w y w o ła n ia m akrodefinicji w y rażen ie #x ozn acza (w rozw inięciu m akrodefinicji) string " o b i e k t " . P o tem jednak.sp o w o d o w ało . g d y p ro g ra m działa p o p raw n ie. W ciele m akrodefinicji w id zim y . Jeśli chcemy instrukcję. która za c h o w u je się nie tak. to d u ż o się napracujem y u jm u jąc je w k o m en tarze. D ru g i p o w ó d jest jeszcze w ażniejszy . 6... P O K A Z (10 + 2).kto w ie . x = i * czynnik[r] + szereg(x0).7 D y re k ty w y k o m p ila c ji w a ru n k o w e j Z d a rz a się. p o sta w ie n ie w rozw inięciu m akro d efin icji zn ak u ' # 1 p rz e d p ara­ m e tre m form alnym . co w yśw ietlam y. . k tó ry nie pozw ala na z ag n ieżd ża n ie k o m e n ta rz y . Jeśli b o w iem w program ie m am y d u ż o takich w y d ru k ó w ko n tro l­ n y ch rozsianych po ró żn y ch miejscach.

Kompilacja o d b ę d z ie się tak. m ało różniące się form y: defined n a zw a defined (n a z w a ) Tego o p e ra to ra u ży w a się w w y rażen iach w a ru n k o w y c h d la p re p ro c e so ra . Bliżej o warunku Jaki m o ż e być ten warunek? O to kilka p rz y k ła d ó w • #if NAZWA = = NAZWA2 • #if NAZWA > 2 • #if (N A Z W A _ A == 2 || N A Z W A _ B > 10) • #if N A Z W A — 6 && d e f i n e d ( W E R S J A _ R O B O C Z A ) W o statn iej linijce zo b ac zy łeś użycie je d n o a rg u m e n to w e g o o p e ra to ra defined. iż.206 Rozdz. In n y m i słow y. W arunek jest w te d y sp ełn io n y . Preprocesor Dyrektywy kompilacji w arunkowej Jest in n y sposób. g d y w y ra ż e ­ nie w a ru n k o w e jako całość m a w arto ść różną o d z e ra („prawda ). a n ie o d w o łaliśm y tej definicji d y re k ty w ą #undef nazwa. 6. m o ż em y p o p ro stu p o p rz e d z ić te n o p erato r w y k rz y k n ik ie m • #if N A Z W A == 6 && ?d e f i n e d ( W E R S J A _ R O B O C Z A ) . a jego w artość jest ju ż z n a n a w czasie. jeśli d a n a n a z w a rzeczyw iście b y ła zd efin io w an a w cześn iej d y re k ty w ą #define n a z w a . p rzy jm u je on w a rto ś ć true. W yjście to n azy w a się kompilacja warunkowa. g d y p rep ro ceso r p racu je n a d tą linijką. R o zu m iem to jako w y ra ż e n ie . o k reślo n e linie p ro g ra m u s ą k o m p ilo w a n e lub nie. n ie m o ż e tam w ystąpić ż a d e n z ob iek tó w (n p . Jeśli ch c e m y się up ew n ić. Jak się to robi? B ardzo p ro sto . k tó ry m oże m ieć d w ie . z m ie n ­ nych) w y stęp u jący ch w p ro g ram ie. R ealizujem y to za pom ocą d y re k ty w p rep ro ceso ra. jakby te linijki n ig d y w p ro g ram ie nie istniały. p rzy p o m in a to w p e w n y m sensie z n a n ą n a m instrukcję i f . ż e coś nie zostało z d e fin io w a n e . Dyrektywa # i f #if warunek // linie kompilowane warunkowo #endif Jak w id ać. W arunek jest to stałe w yrażen ie. To o n p rz y g o to w u je k o m p ilato ro w i m ateriał i to on o k reślo n e linie p ro g ram u m o że o d rz u c ić z procesu kom pilacji. O tóż obszar kom pilacj i w a ru nkow ej o g ra n ic z a m y linijk am i b ęd ący m i o d p o w ie d n im i dyrek ty w am i p rep ro ceso ra. w k tó ry m k a ż d y e le m e n t jest stały . 1 olega to na tymi. Jak się d o m y śla sz . w zależn o ści od sp ełn ien ia p ew n y ch w aru n k ó w .

. Inne dyrektywy dla kompilacji warunkowej #if warunek instrukcje 1 #else instrukcje 2 tendif Jest d o k ła d n ie tak. W sy­ tu a cji. Po linijce O n a s tą p i b e zp o śred n io linijka © .Rozdział. gdy " "warunek jest spełniony " << endl. Jeśli b o w ie m pracując nad je d n ą w ersją tego p ro g ra m u w p ad n iem y na jakiś d o b ry . cout << "To jest kompilowane zawsze " << endl. W ró żn y ch typach sam o lo tu jest różny typ p o d w o z ia . g d y nasz p ro g ra m m a m ieć w iele w arian tó w . 0 cout « "To jest kompilowane. by stw ie rd z ić . // O #if (RODZAJ *= 1) n . N a s z ą d y re k ty w ę #endif m o ż n a też zap isać też jak o #endif //(RODZAJ == 1) T u . że w a ru n e k n ie jest tu sp ełn io n y i linijka © n ie z o s ta n ie sk o m p ilo w a n a . .. w ięc tylko n iek tó re funkcje trzeb a w y m ien ić na inne. albo instrukcje 2. ale niek tó re części są w y m ie n ia n e zależnie o d bieżącej wersji. w k o m e n ta rz u . Trzon jest ten sam . jednak w sz ęd zie zasad a jest p o d o b n a. Dawniejmożna było tak zapisywać. N a p rz y k ła d : piszem y p ro g ra m sterujący w y su w a n ie m p o d w o zia w sam olocie. // © R z u t o k a w y starczy . Starsze kompilatory mogą zgadzać się jeszcze na taką konstrukcję #endif (RODZAJ == 1) gdzie to "przypomnienie" nadal jest tylko przypomnieniem. jak się dom yślasz: zależn ie od sp ełn ien ia w a ru n k u albo do k o m p ilacji w chodzą instrukcje 1. osobny d la dru g ieg o . . ale nie ujętym wznakikomentarza. że nowy standard ju ż tego nie dopuszcza. 6. O czyw iście m o ż n a skopiow ać stary p ro g ra m i zm o d y fik o w ać robiąc o sobny p ro g ra m dla je d n e g o ty p u . #endif cout « ”To znowu jest kompilowane zawsze "«endl. jest p rz y p o m n ia n y w a ru n e k .b a rd z o się to p rzy d aje. g d y p a rę # i f 'ó w z a g n ieżd żo n y c h jest je d e n w d ru g im . Preprocesor 207 Dyrektywy kompilacji w arunkowej Oto przykłady: #define RODZAJ 2 // . Następuje bezpośrednio po ł e n d i f . ale pamiętajmy. N ajczęściej taką w ielo w arian to w ą kom pilację w a ru n k o w ą stosujem y. b a rd z o u ła tw ia to ro z e z n a n ie . N ie z a w s z e się to jed n ak opłaca. w k tó ry m m iejscu kończy się jaki o b szar.

a r a z w n o w y m p r o g r a m ie . w y s t a w i a m DCll\n". } P o n ie w a ż w id a ć . z a te m p o w y ż s z y f r a g m e n t z o s ta n i e k o m p ila to r o w i p r z e d s t a ­ w io n y ja k o i n t w y s t a w _ k o l a () cout << "Tak jest kapitanie. ż e w e r s ja p r o g r a m u z d e f in io w a n a je st n a t y p p o d w o z ia PODWOŹ I E 7 4 7 . to z a m ia n ę trz e b a b ę d z ie w p r o w a d z a ć d w u k r o tn ie . w y s t a w i a m 707\n". 6. ż e ta k ic h (n ie k o n ie c z n ie o d r a z u g e n ia l­ n y c h ) p r z e r ó b e k je s t z w y k le w iele. w y s t a w i a m LIL\n". #error "zle z d efiniow ana wer s j a p r o g r a m u !!!!*' # e n d i f // T Y P _ P O D W O Z I A return 1.r a z w s ta ry m . M o ja p r a k ty k a m ó w i m i. Preprocesor Dyrektywy kompilacji w arunkowej p o m y s ł d o ty c z ą c y tej c z ę śc i. O to ta k i fra g m e n t: // n a jp i e r w d e f in u je m y s o b ie d la w y g o d y ta k ie s y m b o le #define PODWOZIE_707 1 #define PODWOZIE_747 2 #define PODWOZIE_DC11 3 łdefine PODWOZIE_LIL 4 // t u t a j d e f i n i u j e m y . O p ła c a s ię k o r z y s ta ć z d o b r o d z ie js tw k o m p i­ lacji w a ru n k o w e j. z k t ó r y m t y p e m m a m y d o c z y n ie n ia // w t y m k o n k r e t n y m p r z y p a d k u #define TYP_PODWOZIA PODWOZIE_747 / / ---------------------------------------------------------- int w y s t a w _ k o l a () 1 #if (TYP_PODWOZIA == PODW O Ź IE_707) cout << "Tak jest kapitanie.208 Rozdz. o k tó re j d o tej p o r y je s z c z e n ie w s p o m in a ł e m . w y s t a w i a m 747\n". g d y b y ś k i e d y ś d o te g o m ie js c a k s ią ż k i s ię g n ą ł s z u k a ją c w z o rc a n a z a s to s o w a n ie k o m p ila c ji w a r u n k o ­ w e j r ó ż n y c h w e rs ji s w o je g o p r o g r a m u . r e t u r n 1. W y b a c z m i tę d y r e k ty w ę ł e r r o r . #el i f (TYP_PODWOZIA — PODWOZIE_LIL) cout << "Tak jest kapitanie. k tó ra je st id e n ty c z n a d la o b u p r o g r a m ó w . #eli f (TYP_PODWOZIA == PODWOZ I E _ D C 1 1) cout << "Tak j est kapitanie. Z d e c y d o w a łe m s ię je d n a k w s ta w ić ją tu ta j n a w y p a d e k . } W p r z y k ła d z ie ty m z o b a c z y łe ś n o w ą d y r e k ty w ę #eli f c o je s t ja k b y s k r ó te m o d e 1 s e i f i je st k o n s tru k e ją a n a lo g ic z n ą d o ta k ie j w ła ś n ie k o m b in a c ji in s tru k c ji. #else cout << "To n i g d y sie nie p o w i n n o zdarzyć \n". w y s t a w i a m 747\n". #el i f (TYP_PODWOZIA — PODWOZIE_74 7) cout << "Tak jest kapitanie. .

Jeśli w trakcie kom p ilo w an ia tego fragm entu b ęd ą ju ż w m ocy n astęp u jące dyrektyw y: # d e f in e WERSJA 7 • #define SZYBKOSC 1 to w rezultacie w skład naszego skom pilow anego p ro g ram u w ejd ą instrukcje (3).. ... T o zn aczy czy w y stą p iła d y re k ty w a #define nazwa .w a ru n e k b y ł spełniony. to i tak p o m ó w im y o ty m n ieb aw em . Jeśli nie o b o w iązu je to tak.. 6. . ' . instrukcje #endif n ie sp ra w d z a w a ru n k u . Jeśli nie. ' • fi W arunek #ifndef A n alo g iczn ie d y re k ty w a #ifndef nazwa2 // rozumieć jako: if NOT defined / / .'fi ■'*. X. s p ra w d z a czy n a z w a została zd efin io w an a i obow iązuje. . ' ' . jakby w kom pilacji w aru n ko w ej .. i nie u n ie w a ż n iliśm y jej d y rek ty w ą #undef nazwa Jeśli tak. jakby ch o d z iło tu o w a ru n e k i b y ł on spełniony. W arunek #ifdef D y rek ty w a k o m p ilacji w aru n k o w ej #ifdef nazwa // rozumieć jako: ifdcfined / / .. D y rek ty w y kom pilacji w aru n k o w ej m ogą być z ag n ieżd ża n e. że d o m y śla sz się jak d ziała d y rek ty w a # e r r or. O to p rzy k ład : #if (WERSJA == 1) #if (SZYBKOSC == 1) instrukcje (1) # else instrukcje (2) #endif #else #if (SZYBKOSC == 1) instrukcje (3) #else instrukcje (4) #endif #endif // WERSJA .. Preprocesor 209 Dyrektywy kompilacji w arunkowej A sw oją d ro g ą to z a ło ż ę się. ty lk o sp ra w d z a czy d a n a n azw a została zd efin io w an a. czyli n a z w a jest p rep ro ceso ro w i z n an a .-• .Rozdział. to d z iałan ie jest takie. instrukcje #endif .

Preprocesor Dyrektyw a # e r r o r 6.cpp z program em . (W iemy to .m im o że n a p ra w d ę jest to linijka n u m e r 10 (na przykład). c p p ma b i e d y w lin ijc e 10 i 20 N astęp u je teraz bliższe o p isan ie tych błędów.9 D yrek ty w a # l i n e Ma o n a postać # lin e s ta ła "nazwa_pliku" P ro p o n o w an a n a z w a p l i k u nie jest obow iązkow a. Jeśli nakażem y mu #line 128 "fikcja... że ma on taką w artość..210 Rozdz.cpp".cpp" to o d tej pory kom pilator uzna.bo na użytek tego p rzy k ła d u specjalnie je tam popełniliśm y).. albo jeśli zdefiniow aliśm y go tak.... to o trz y m u ­ jem y inform ację mniej w ięcej takiej treści: P lik T S T ... k iedy się to przydaje: #if (WERSJA — 1) / / . D ajm y przykład. o którym w iem y. G dy kom pilujem y taki program . ż e m a b łęd y w linijce 10—tej i 20-tej.. że jest to linijka 128 p rogram u .8 D yrektyw a # e r r o r D yrektyw a ta m a form ę # error tekst a pow oduje. że po n ap otkaniu jej kompilacja zostaje p rzerw ana i w y p isy w a n y jest ko m u n ik at o błędzie. D yrektyw a ta służy do oszu k iw an ia kom pilatora.. W łaściw ą nazw ę w ty m m o m en ­ cie zapo m in a. R obim y jed n ak taki ek sperym ent: N a p o czątk u program u d o p isu jem y jeszcze jed n ą linijką takiej treści . #else #error "Musi byc albo wersja 1 albo wersja 2!" #endif Jeśli zapom nieliśm y zdefiniow ać symbol WERSJA. iż żad en ze sp raw d zan y ch w aru n k ó w nie jest spełniony.. #elif (WERSJA ==2) / / .. 6. M am y p lik TST.. że kom piluje plik o n azw ie "fikcja. D yrektyw a ta spow oduje przerw an ie dalszej p racy i w ypisanie w kom unikacie o b łęd zie . którego częścią jest inform acja um ieszczona przez n as jako tekst O to.. w ów czas preprocesor natknie się na naszą d y rek ty w ę t e r r o r .. D o datkow o ko m p ilato r b ęd zie m yślał.zam ieszczonego tekstu: Error directive: "Musi byc albo wersja 1 albo wersja 2!" 6.

B łędne są w ięc teraz linie 11 i 21. to nasze pliki p ro g ram o w e rozrastałyby się ogrom nie. [Czytaj: „inklud"] . Spróbujem y teraz skom pilow ać ten sam program . D laczego tak w ięc po p ro stu nie zrobić ? Pierw sza o d p o w ie d ź brzmi: z lenistw a.w ystarczy k o rek ta w jed­ nym tylko pliku. sp ro w ad zili w to miejsce treść rzeczonego p lik u . M iejsca poszukiw ania p lik ó w włączanych tą d y rek ty w ą są jednak zależne od 5) ang.cpp" D op isan ie linijki s p o w o d u je oczywiście.zobaczą tę (raz zrobioną zmianę). Bardzo to wygodne! ♦> Po trzecie: . jakby z a m ia st znaków cudzysłow u użyte były tam znaki < > . Jeśli zaś przy nazw ie plików są zn ak i < > to plik będzie poszukiw any w standar­ d o w y m miejscu. Wszystkie inne pliki. Z u p ełn ie tak. biblioteczne). Preprocesor 211 W stawianie treści innych plików w tekst kompilowanego właśnie pliku #line 500 "fikcja. to plik.Rozdział. jakbyśm y w ty m miejscu w pro g ram ie. które korzystają z tego pliku . w m iejsce. który nakazujem y w łączyć będzie przez preprocesor n ajpierw poszukiw any w bieżącym katalo g u . że w szy stk ie dalsze p rz e su n ą się o jed­ ną lin ię w dół. że w tek st kom pilow anego w łaśn ie p ro g ram u . gdzie znajdują się pliki zw y k le w łączane (np. ♦♦♦ Po drugie: jeśli sp ro w ad zan y m plikiem jest plik nagłów kow y. to będzie szu k an y tak.wstawiać. to przy ew entualnych zm ianach jakiejś deklaracji . wcielać.g d y b y śm y chcieli do n aszeg o program u w łączyć w szystkie pliki n ag łów kow e z deklaracjami funkcji bibliotecznych. zostaje w staw io n a treść innego pliku o wyszcze­ gólnionej nazw ie. włączać. w którym znajd u ją się takie d y rek ty w y . A t e r a z o r ó ż n i c y m i ę d z y p r z e d s t a w i o n y m i f o r m a m i tej d y r e k t y w y Jeśli p rzy nazw ie pliku użyliśm y cu d zy sło w u .10 W s ta w ia n ie tre ś c i in n ych p lik ó w w tekst k o m p ilo w a n e g o w ła ś n ie pliku 5 D yrek ty w y p rep ro ceso ra # i n c l u d e #include <nazwa_pliku_A> #include "nazwa_pliku_B" p o w o d u ją. in c lu d c . O trz y m a m y znow u kom u n ik a t o błędzie. na sam ą okoliczność kompilacji. 6. będąc jeszcze w edytorze. a jeśli tam nie zostanie znaleziony. Lepiej w ięc plik nagłów kow y w ypożyczyć na chw ilę.cpp ma biedy w linijce 511 i 521 5. ale tym razem takiej m niej więcej treści: Plik fikcja.

pliki n a g łó w k o w e biblio­ tek.z d e fin io w a n a zostanie n a z w a PLIK_X. S to so w an ie tego sp o so b u jest b a rd z o p o w sz e c h n ą p rak ty k ą . C . Z atem p lik X b ęd zie k o m p ilo w an y d w u k ro tn ie. X. gdy w pliku X scf fragmenty. E w e n tu a ln a p o w tó rn a p ró b a w łącz en ia tego plik u o d b ę d z ie się. X. B. T o znaczy. C. o p ró cz n a z w y pliku. W tej k o n stru o w an ej "prep ro ceso ro w ej n azw ie" p o w in n y . W zw ią z k u z ty m d o kom pilacji p ro g ra m u u ży te z o sta n ą w chodzące teraz w sk ład naszego p ro g ra m u pliki. które nigdy nie powinny pojawiać są? w kompilacji dwukrotnie. X. (Np. P oziom ów z a g n ie ż d ż e n ia m oże być w iele. w y stą p ić o g ran iczające ją zn ak i < > lub " ". T ego p rzecież o c z e k u je zw y k ła d y re k ty w a # include.o czy m nie w iem y lub nie p a m ię ta m y - d y re k ty w a # i n c l u d e w łączająca plik X. R eguła jednak jest p rz e w a ż n ie taka: u ży w ając cu d zy sło w u w łącza się pliki. D y rek ty w y #i n c l u d e m ogą się zag n ieżd żać. B. Jak się p rz e d tym u strzec ? Jest prosty sposób: U życie kom pilacji w aru n k o w e j. Jak zagwarantować sobie jednokrotne włączanie danego pliku? M o że się zdarzyć. który I m a zo stać w łącz o n y d y rek ty w ą #include. P lik X p o w in ien w y g lą d a ć na p rzy k ład tak: #ifndef PLIK_X #define PLIK X //z w y k ła treść p lik u iendif Jeśli ten p lik zo stan ie w łą c z o n y do kom pilacji choć raz . A. Preprocesor W stawianie treści innych plików w tekst kompilowanego właśnie pliku im plem entacji. że d y re k ty w a w łączająca plik m o ż e m ieć b ard ziej o g ó ln ą form ę # include n a z w a jz r o b io n a p r e p r o c e s o r e m K ró tk o m ów iąc: za p o m o cą p rep ro ceso ra m o żn a k o n s tru o w a ć n a z w ę p lik u . Ciekawostka dla zaawansowanych M a ło kto w ie. . 6. K o n stru k cję tę m o żn a o b razo w o n azw ać strażnikiem nagłówka. które sam i p is z e m y . ż e d y re k ty w ą # include w łącz am y d o p ro g ra m u p lik i A. T ym czasem w plik u B jest . (Są o n e zw y k le z g ro m a d z o n e w jakim ś specjalnym k atalo g u ). w ięc należy się zaw sze u p e w n ić . Może to spowodować problemy. to w nim m oże b y ć d y re k ty w a # i n c l u d e w łączająca jakiś jeszcze inny plik. g d y ta n a z w a już je st zd efin io w an a —czyli na m o cy kom pilacji w a ru n k o w e j (d y re k ty w a tifndef). jak w takim p rz y p a d k u postę­ p u je n asz kom pilator. nic z tego pliku p o ra z d r u g i k o m p ilo w a n e n ie będzie. że g d y tą d y re k ty w ą w łączam y jakiś in n y plik. definicje zmien­ nych lub definicje funkcji). n ato­ m iast z n a k i < > stosuje się w łączając np.212 Rozdz.

i. którym się posługujem y. po którym następuje kom en­ da charakterystyczna dla danego konkretnego kom pilatora (preprocesora) Ipragma k o m e n d a D zięki tem u. w łączone zostaną następujące pliki: • c: / lo tn is k o / incl / lotn_odpra w a .h • c: / lo tn isk o / incl / lotn_paszpor t.11 Dyrektywa pusta Jest to d yrektyw a składająca się z sam ego zn ak u I Jest to jedyny znak w tej linii. Jeśli komenda jest danem u konkretnem u typow i kom pilatora nieznana. Jest przez preprocesor po pro stu ignorow ana.Rozdział. #define SCIEZ_DO_PROJEKTU c:/lotnisko Idefine PODKATAL_NAGLOWKI incl Idefine SCIEZKA_DO_NAGLOW SCIEZ_DO_PROJEKTU/PODKATAL_NAGLOWKI Idefine NAGL(x) < ŚCIEŻKA DO NAGŁÓW ## /lotn II x ##. Preprocesor 213 Dyrektyw a pusta O to p rzy k ła d .h> //a ta k b ę d zie m y z tego k o r z y s ta ć iinclude N A G L (odprawa) Iinclude NAGL(paszport) Iinclude NAGL(bezpiecz) Iinclude NAGL(pokład) W rezultacie tych d y re k ty w I i n c l u d e d o bieżącego pliku ( w czasie kompila- ci).h • c :/lo tn isk o /in c l/lo tn _ p o k la d .h • c :/lo tn isk o /in c l/lo tn _ b ezp iecz. 6.5. 203). § 6. w k tó ry m b ard zo w ym yślne n azw y pliku b u d u jem y za pomocą n ak ro d efin icji NAGL i u ży w an eg o w niej o p erato ra sklejania n a z w (zob.h 5. str. napot­ kaw szy ją w program ie . zatem szczegółowego opisu tych d y rek ty w trzeba szukać w opisie kom pilatora. . w p ro w ad zo n a zostaje m ożliw ość używ ania dyrektyw w łaściw ych dla danego kompilatora. Taka d yrektyw a nie ma żadnego działania.12 Dyrektywy zależne od implementacji D yrektyw y takie zaczynają się od słowa p ra g m a .ignoruje ją.

. cout << "\n (linijka " « LINĘ << ") \n zaczęła sie: " « __DATĘ__ << " o godzinie: " << TIME << endl. 6. tc posługuje się w łaśnie tą nazw ą.. cout << "Kompilacja tego pliku " « FILE— . NAME • pod tą n azw ą zapam iętan a jest n azw a w łaśn ie k o m p ilo w an e­ go pliku DATĘ • pod tą n azw ą zdefiniow any jest ciąg zn ak ó w odpow iadający dacie w m om encie kompilacji. że jeśli k o m pilator w ykryw a b łą d i w ypisuje k o m u n ik at o b łęd zie w linijce nr. oprócz nazw .czy d w u cy fro w y .13 N azw y p re d e fin io w a n e W trakcie pracy preprocesora. Preprocesor Nazwy predefiniowane 6. które tu. n ad którą p rep ro ce­ sor w łaśnie pracuje. które definiuje dla siebie sam preprocesor. Na przykład "15:45:08" O istn ien iu tych predefiniow anych nazw m ożna się p rzek o n a ć kom pilując p h k w k tó ry m zn ajd ą się następujące linijki. Po u ru ch o m ien iu takiego fragm entu program u na ek ran ie zostanie w ypisany tekst Kompilacja tego pliku T.C (linijka 10) . w d ru k u książki w y g ląd ają niestety jak jedna d łu g a kreska.214 Rozdz.. Łatw o się dom yślić. są jeszcze n azw y . AC co zaczęła sie: Jun 04 2006 o godzinie: 00:45:50 . które sam i zd efin io w aliśm y . Uwaga typograficzna: W nazw ach tych w ystępują stojące obok siebie d w a zn ak i p o d k re ś­ lenia. czy n u m e r dnia jest je d n o . M ogą być d w ie form y "Mar 19 2006" "Mar 3 2006" zależn ie od tego. N ap ra w d ę jest wiec _ _ a n i e __ Oto te p red efin io w an e nazw y: _LINĘ__ • ta nazw a kryje w sobie n u m er linijki pliku. _TIME__ • ta nazw a kryje w sobie ak tu aln y czas w m om encie kom pilacji M a on postać ciągu zn ak ó w (C -stringu) "hh:mm:ss".

l o c a l t i m e () itd. W y starczy . n a d k tó ry m i pracują ró żn i p rogram iści d o k o n u ją c ciągłych u le p sze ń . D latego u ż y w a łe m w ó w c zas k om pilacji w aru n k o w ej. k ie d y n ieśm iało przerab iałem m oje p ro g ra m y z C n a C++. W ów czas ta n a z w a nie jest z d e fin io w a n a . N ajczęściej u ż y w a łe m tej m ożliw ości w o k re sie przej­ ścio w y m . to z w y k le m oże on na n a sz e życzenie z a c h o w y w a ć się tak. n a s z kolega p o w in ie n zaw sze zm ien ić treść tego tekstu . M o że się czasem o k azać p rzy d a­ tn e . h D odatkow o zdefiniowana jest jeszcze nazwa _cplusplus Jeśli k o m p ilu jesz k o m p ilato rem C++. godziny i minuty. 6. by w g o to w y m p ro g ra m ie w iedzieć. która na ek ra n ie w ypisze tek st inform ujący o n u m e rz e w ersji. N iestety nasz kolega jest niechluj i m im o d o k o n an ia ja k ich ś m odyfikacji p ro g ra m u . a tak że po m om encie kom pilacji te g o pliku. N ie byłem w ó w c z a s p e w n y i ch ciałem zaw sze m ieć m ożliw ość w ycofania się. ja k b y byl k o m p ilato rem k lasycznego C.zatem na ek ran ie p o jaw iał się b ę d z ie n o w y o pis w ersji. k tó re d o ty czą m o m e n tu czaso w eg o sam ej kom pilacji. Ich deklaracje zebrane są w pliku na­ główkowym t i m e. g o to w ej do zlin k o w a n ia z naszym i m o d u łam i. za to z d e fin io w a n a jest n azw a STDC (sk ró t o d S T a n d a r D C ) C z a se m się to p rzy d aje. P rzy okazji m odyfikacji sw ojego m o d u łu . W kom pilacji zo stają o n e ta m z a m ro ż o n e na zaw sze.Rozdział.__ TIME__ i __ DATĘ__ zaw ie rają b o w iem inform acje. Jeśli zaś chodzi Ci o wypisanie na ekranie bieżącej dały. to realizuje się to za pomocą standardowych funkcji bibliotecznych. Ja k to zrobić? N a p rz y k ła d w ym agając o d kolegi. z k tó rą w ersją części „rad a ro w ej" m a m y d o czynienia. D ostajem y g o od kolegi już w p o staci binarnej. by um ieścił w jego pliku fu n k cję w e r s j a _ r a d a r u ( ) . Do czego mogą się przydać takie predefiniowane nazwy N ie p rzy d ają się często. ż e w skład p ro g ra m u w chodzi m o d u ł o bsługujący ra d a r. u m ieścił w nim funkcję void wersja() { . to informacja o czasie będzie id en ty czn a . C o robić? Jest wyjście. W ersję poznać m o żem y np. Preprocesor 215 Nazwy predefiniowane N a w sz elk i w y p a d e k p o d k re ślę jeden fakt: Jeśli za 10 m in u t u ru c h o m isz je szc ze raz ten sam p ro g ra m . ale ro zw ażm y ta k i p rz y p a d e k P ro g ra m n asz sk ład a się z w ielu plików . takich jak tim e ( ) . w którym d a n e funkcje („ ra d a ro w e ") są um ieszczone. g d z ie w a ru n k ie m b y ło zdefinio­ w a n ie lu b n ie z d e fin io w a n ie tej nazw y. b y kolega p iszący ten m o d u ł. po n azw ie p lik u .często nie u a k tu aln ia tekstu inform ującego o w ersji. D ajm y n a to.

Czy poprzednie błędy (będące przedmiotem tych zadań) przeniosą się na ten nowy sposób? Który sposób wybrałbyś pisząc swój program? V III Czy można dwukrotnie dyrektywą define zdefiniować tę samą nazwę? . VI Co zrobić. Przepisz je modyfikując tak.. Tylko jedna z poniższych instrukcji spowoduje błąd kompilacji.i-. Wyjaśnij.. po co są). sekwencje trzyznakowe? (Nie musisz ich zupełnie znać.14 Ć w ic ze n ia Jaki znak rozpoczyna dyrektywy preprocesora? Czy musi być pierwszym znakiem w linii? Do czego służą tzw. Która i dlaczego tylko ta jedna? const int trzy = 3. //.* W programie są następujące dyrektywy: idefine LEWY_POKLAD 20 ♦define PRAWY_POKLAD 30 Idefine SSS LEWY_POKLAD + PRAWY_POKLAD Co. double s2 = DZIESIEC + trzy. że od tej pory ta informacja nie jest z ależn a od dobrej w o li koleg: piszącego ten plik. Idefine DZIESIEC 10. ł D zięki tem u ile razy tę funkcję wywołam y. by się zmieściła w jednej linii programu? Powyższe ćwiczenia definiowały pewne stałe za pomocą dyrektyw procesora. by zamiast tych dyrektyw były stałe obiekty typu const.c MAY 10 2006 15:03:47 W ażne. double sl = trzy / DZIESIEC. w związku. Preprocesor Ćwiczenia cout « "Cessna: " « _ F I L E _ « " " << DATĘ « " " « TIME << endl. na ek ra n ie pojaw i się Cessna: crs71. W 6. Masz jakieś uwagi krytyczne do tej ostaniej linijki? Mamy taki fragment programu.‘ . kiedy on te n plik ko m p ilo w ał. jeśli dyrektywa #define jest za długa. z tym wypisze na ekranie następująca instrukcja: cout « (2 * SSS) « endl. ale powinie­ neś przynajmniej wiedzieć.216 Rozdz. co robi poniższa dyrektywa preprocesora: #define A B 1 2 Ł. Bez w zględu na jego niechlujstw o zaw sze m am y ś la d w p o s­ taci p raw d ziw ej nazw y jego pliku i tego. 6. double s3 = DZIESIEC / trzy.

Rozdział. które było jej argumentem (ma być ujęte w cudzysłów)..wyrażenie. która przysłany do niej argument (np. by to było możliwe? Mamy taką makrodefinicję: idefine DZIEL(a. Napisz makrodefinicję o jednym parametrze formalnym.wartość tego wyrażenia. "12") zamieni na jeden wyraz np. wartość wyrażenia "obiekt" = 12 W linii 150.b) ((a)/ { (a) + (b))) int d = 0. by makrodefinicję CZYNNIK zastąpiła funkcja (inline) void CZYNNIK(double a. (Oczywiście jeśli argumentem będzie 9 to w rezultacie otrzymamy Apollo_9).0). To znaczy: jeśli w programie są dwa wywołania tej makrodefinicji (w linii 120 i 150). to na ekranie pojawić powinien się np. Mamy taki fragment programu: idefine CZYNNIK(a. . while(d < 10) 1 cout « "Czynnik = " « CZYNNIK(++d. wartość wyrażenia "obiekt" = 0 Program ma mieć kilka wariantów.b) (a/b) Co pojawi się na ekranie na skutek instrukcji: cout « DZIEL(2+3. taki tekst: W linii 120. 6. } Ile razy wykonają się instrukcje pętli.numer linii programu. dla d= " « d « endl. Ile razy wykona się wtedy pętla? ■ [K T !! Napisz makrodefinicję o nazwie MISJA.. Preprocesor 217 Ćwiczenia idefine NNN 10 II. która będzie wypisywała na ekranie: . (Czyli: ile będzie obiegów pętli?).0) « endl. double b) . . idefine NNN 50 Co by musiało być między tymi dwoma powyższymi dyrektywami. Apollo_12. 2. Są już następujące dyrektywy preprocesora idefine GRUDZIEN_2006 1 #define SIERPIEN_2005 2 . 5. Czy w makrodefi­ nicji jest błąd? Zmień kod z powyższego zadania tak. W tym celu posługujemy się kompilacją warunkową. cout « ". w której ją wywołano. by na ekranie została wypisana wartość 1? Napisz makrodefinicję DZIEL (z poprzedniego ćwiczenia) w postaci funkcji inline pracującej na argumentach typu double. Co należy poprawić w makrodefinicji.

(Dlaczego?). Powyżej. w której następuje wybór wersji. Jak nazywa się plik programu.. Deklaracja taka powinna zasadniczo pojawić się w kompilowanym programie tylko jednokrotnie. by oprócz tekstu Witamy na pokładzie pojawiła się na ekranie informacja o tym: 1. 3. Poniżej widzisz.dla eksperymentu grudniowego: 3000 . tej kompilacji. .dla eksperymentu sierpniowego: 2050 Jeśli zaś WERSJA_EKSPERYMENTU została określona inaczej. ..h" XIX Czy dyrektywy i i n c l u d e mogą być zagnieżdżane? Czy poprawne jest złożenie takich dwóch dyrektyw? # d e f in e PLIK <nazwa. a wywoływana z dwoma argu­ mentami typy in t . •» '■ nm . w zależności od wybranego typu ekspery­ mentu.218 Rozdz. dyrektywą pustą (#). W której jego linii nastąpiła instrukcja wypisująca. 6. a operatorem preprocesora (#) Czy jest ryzyko nieporozumienia? Pierwszy program z tej książki uzupełnij tak. nazwa ta. Kiedy się używa jednej. w miejscu wielokropka. na nastąpić przerwanie kompilacji i wydrukowany komunikat "Nieokreślony został typ eksperymentu" XV! Czy można zagnieżdżać dyrektywy preprocesora # if ? XVII Dyrektywa # i f de f ma podobne działanie jak de f i ned. lub nie została określona wcale. Jaka była godzina minuta. 2. Drugi argument ma wartość domniemaną równą zero. Ma być to funkcja o nazwie f zwracająca rezultat typu double. w którym będzie tylko jedna deklaracja funkcji. a kiedy drugiej? Która jest "bardziej samodzielna"? XVIII Jakie jest działanie poniższych dyrektyw? # in c l u d e <plikA . 4.h> # in c l u d e "plikB. itd. 5. Napisz plik nagłówkowy. Jaka była data kompilacji. ma mieć wartości .. Preprocesor Ćwiczenia Potem jest dyrektywa.-‘■ * ■' . że wybrano tu akurat wersje "grudniową" #define WERSJA EKSPERYMENTU GRUDZIEN_2006 Potrzebujemy teraz dyrektywy #def in e TYP_SPREZARKI . Jak to zagwarantować pisząc ten plik nagłówkowy? Jaka jest różnica między tzw. a _r_v^ j|. Czy użyto kompilatora C++.h> i i n c l u d e PLIK _ .

że bierze się jakiś typ - dajmy na to i n t . 7. Ta definicja rezerwuje w pamięci miejsce dla 20 liczb typu i n t . Uwaga: obiekt a nie jest typu " i n t " . //Błąd!!! Jest to błąd. Korzyść z tego jest taka. bo wartość r r r nie jest jeszcze w czasie kompilacji znana. Kompilator bowiem musi już wtedy wiedzieć ile miejsca ma zarezerwować na daną tablicę. to można z nich zbudować tablicę in t a [20]. Tablica to ciąg obiektów tego samego typu. c in » rrr. Znana jest dopiero w trakcie pracy programu.i to znaną już w trakcie kompilacji. cout « "Jaki ch cesz rozmiar t a b lic y ? in t rrr. >re zajmują ciągły obszar w pamięci. Jest on obiektem typu: "tablica 20 elementów typu in t Rozmiar tak definiowanej tablicy musi być stałą całkowitą (większą od zera) . in t a [ r r r] . Tablice są typem pochodnym. Rozmiar ten nie może być więc ustalony dopiero w trakcie pracy programu. Znaczy to po prostu. że zamiast nazywania każdej ze zmiennych osobno. to I możesz z nich zrobić tablicę. Dla wtajemniczonych: .Rozdział. wystarczy powiedzieć: odnoszę się do n-tego elementu tablicy. Tablice 219 7 Tablice eśli masz do czynienia z grupą zmiennych (ogólniej mówiąc .i z elementów takiego typu buduje się tablicę.obiektów). Jeśli chcemy mieć 20 zmiennych typu i n t . Jest to wtedy tablica elementów typu i n t .

ale ten o statn i p rz y k ła d przy to ­ czy łem po to. // numer jest tablicą // 9 elementów typu f l o a t unsigned long kanał [8192]. • ty p ó w w yliczeniow ych (enum). D efinicje . Tablice Elementy tablicy ]eśli rzeczywiście zachodzi konieczność zdefiniowania takiej tablicy o niez­ nanym jeszcze rozmiarze . Jeśli zdefiniujem y sobie taką tablicę: int t [4]. to jest to tablica czterech elem entów typu i n t . bardziej zaawansowane. to użycie bibliotecznej klasy pojemnikowej v e c to r .1 E l e m e n t y tablicy N a p o czątk u zajm iem y się prostym i tablicam i tw o rzo n y m i z typów fu n d am en taln y ch .powinieneś pomyśleć o tzw. by p o k azać z jak różnych ty p ó w m o żn a z b u d o w a ć tablice. . A o to in n e p rzy k ład y . 298. Poszczególne elem enty tej tablicy to: t [0] t [1] t [2] t [3] Jak w id zisz. czyli poin fo rm o w an iem kom pilatora o typie d an eg o obiektu. jak w iad o m o . dynamicznej alokacji tablicy .220 Rozdz. • innych tablic. Inne rozwiązanie. a ta k ż e (o czym d o w iesz się w przyszłości): • z ob iek tó w ty p u zdefiniow anego p rzez u ż y tk o w n ik a (czyli klasy). 7.będ ą to definicje różnych tablic.IIIMIIIIHIlillTI |T~H flU niM iaM U ltT 1 “T ■ ^ .str.. • ze w sk aźn ik ó w d o p o kazyw ania na sk ład n ik i klasy. _____ . . Ifllli<"'‘1111“Mi . Tablice m ożna tw orzyć z: • ty p ó w fundam entalnych (z w yjątkiem v o id ) .fr O ^ W * * * * * ^ * ^ 7.czyli miejsca ich n aro d zin w program ie. • w skaźników . //kanał je s t tablicą 8 1 9 2 II elementów typu u n s ig n e d lo n g i n t *ws ka z [ 2 0 ] . tak że d ek laracją. // z d a n ie jest tablicą H 8 0 e lem e n tó w ty p u char f 1 o a t numer [ 9 ] . S tąd d la p o niższych definicji podaję w k o m en tarzu jak czyta się deklarację takiej tablicy: c h a r z d a n ie [8 0 ] . II ws ka z jest tablicą 20 elementów //będących w s k a ź n ik a m i (a d re sa m i) II jakichś obiektów typu i n t O ad resach jeszcze dokładniej nie m ów iliśm y. Definicja jest.

ż e o sta tn im . 7. Tablica. zn iszc zo n a z o sta n ie treść zm iennej z e t . G orzej jeśli zap o m n isz. że w n iek tó ry ch ję zy k ach p ro g ram o w an ia n u m eracja e lem en tó w tablicy zaczyna się od 1. Tablice 221 Elementy tablicy Numeracja elementów tablicy zaczyna się od zera. P o n iew aż typ zm ien n ej z e t z g ad z a się a k u ra t z ty p e m e le m e n tó w tablicy t . Jeśli m a sz ta k ie p rzy zw y czajen ie. # in c lu d e < io s tr e a m > u s in g n a m e sp a c e s t d . P o w ta rz a m jednak: to. Próba w p is a n ia czegoś do elem en tu t [ 4 ] n ie b ę d z ie sy g n alizo w a n a jako błąd. to w przyszłości będziesz potrafił to zmienić —korzystając z nowego rodzaju tablic — takich. W p o czą tk o w y m o k re sie będ ziesz się z a p e w n e często m ylił. z ależn e jest o d im ple­ m entacji. T y m bardziej. która tego nie spraw dza . T w oja strata. in t z e t. W p isan ie czeg o ś d o nieistniejącego ele m e n tu t [ 4 ] s p o w o d u je zn iszczen ie w o b sz a rz e p am ięci cze g o ś. Jest to bardzo ważne i to trzeba za pam iętać. co p o w ied ziałe m .na p rz y k ła d za pom ocą zw y k łej operacji p rz y p isa n ia . P o d czas p ró b y z a p is u czegoś d o n ieistn iejąceg o elem entu t [ 4 ] t [4 ] = 15. czw ar­ ty m elem en tem n a sz e j tablicy jest e le m e n t t [ 3 ] . P ra w d ę m ó w iąc. Ale zapłacisz za to czasem dostępu do elementu takiej tablicy. . co n astęp u je b e z p o śre d n io za tablicą. C o d o k ład n ie je st niszczo n e —z a le ż y to od im plem entacji. g d y ż w języ k ach C oraz C + + nie jest to s p ra w d z a n e .Rozdział. że z d a rz a się. Jeśli Ci to nie odpowiada. to b ęd zie Ci tru d n iej. które to sprawdzają. Należy zatem pam iętać. W ażn y jest tutaj ty lk o pew nik: coś m im o w o ln ie w p am ię­ ci zn iszczy liśm y . bo a k u ra t zo stała u m ieszczo n a w p am ięci b e z p o ś re d n io za tablicą t . że tablica A/-elem entow a ma elem enty o indeksach od 0 do A M (a n ie do N). iż p rz y ta k ic h definicjach: i n t t [4] . a nie e lem en t t [ 4 ] . d la te g o m ożliw e jest też. n ie m a specjalnej tra g e d ii jeśli z a p o m n isz coś w p isać do elem en tu zero w eg o . T ablicę m o ż n a z a p e łn ić treścią . że w zm iennej z e t z n ajd zie się liczb a 15. N u m e ru ­ je m y przecież o d zera ! E lem ent t [ 4 ] n ie istnieje. D la zo b raz o w an ia p o w ie m tylko. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ******* i n t m a in () 1) Nie traktuj tego jako wadę.jest szybsza.

i ++) czyli inaczej f o r (i = 0 . i < 4 . P o b ran ie w artości z tego o b s z a ru pam ięci b ezp o śred n io za tablicą nie spow oduje k atastro fy . w u ży c iu m ocnej lu b słabej nierów ności.zm ien ić i<4 na i< = 4 . i < 4 . że pracujem y na elem en tach o in d e k sac h 0-3. czyli o b a zap isy są ró w n o w ażn e. i < 4 . na p rz y k ła d pętli f o r . o których w spom inaliśm y. for(int i = 0 . i++) M ogliśm y rów nie d o b rz e n ap isać tak: fo rd = 0 . . i++) P o d sta w o w a różnica je st tu. i <= r o z m i a r . jedynie w a rto ść będzie bezsensow na. i < r o z m ia r . Jeśli jesteś ciekaw . W n aszy m p rz y p a d k u za p isa liśm y to tak: f o r (i = 0 . } } W rezultacie wykonania tego programu na ekranie pojawi się Wydruk treści tablicy: Element nr: 0 ma wartość 0 Element nr: 1 ma wartość 100 Element nr: 2 ma wartość 200 Element nr: 3 ma wartość 300 Z au w aż . Tablice Elementy tablicy int t [4 ].222 Rozdz. i++) t[i] = 100 * i. iż zakres obu pętli for jest taki. T o w łaśnie z p o w o d ó w . i++) { cout << "Element nr: " << i << " ma wartość " « t [i ] << endl. że i przebiega od 0 d o 3. T rag ed ia byłaby dopiero w te d y . 7. Zw ykle elem en ty tablicy czyta się lu b w y p isu je za po m o cą pętli. jak w idać. i <= 3 . for(int i = 0 .1 . / I w p is cout << "Wydruk treści tablicy: \n". g d y b y śm y chcieli coś w to m iejsce wpisać.tej od w y p isy w a n ia elem en­ tó w na ekran . Uwaga praktyczna: Tu chciałbym Ci coś p o rad zić. to sp ró b u j w drugiej p ętli for . S p o w o d u je to w y pisanie n a ek ran nieis­ tniejącego elem entu o indeksie t [ 4 ] . Je d n a k oba zapisy sp raw iają . i ++) czyli inaczej for(i= 0 .

G dybyś jednak w tym m om encie zbiorczej inicjalizacji na liście ujętej k lam ram i { } umieścił o jedną —lub kilka liczb . Jest to w y g o d n y sp o só b . Pozostałe dwa elem enty będą inicjalizow ane zeram i. H11— i iiiw i 11 ' r t a t—ii :. Elem entom t [ 0 ] i L [ l ] . M ożliw a jest też tak a inicjalizacja naszej tablicy: int t [4] = { 17. czy rozm iar tablicy nie jest p rz y p a d k ie m przekroczony. Potem nie.. bo nie m uszę odejm ow ać jed y n k i o d rozm iaru.nie istnieje. a po za tym zap is jest krótszy. 5. Jak w idać liczb jest tu za mało. ja k w ie m y . Służy do tego tzw . U n ik n ie s z w te d y o m y łk o w e g o a d re s o w a n ia e le m e n tu t [rozm iar] (któ ry. Tylko przy inicjalizacji. Nie przejmuj się na razie tą nazwą. D zięki tem u t [0] ma wartość 17 t [1] ma wartość 5 t [2] ma wartość 4 t [3] ma wartość 200 D o zn u d ze n ia b ęd ę przypom inał. Wrócimy do tego na str. float współczynnik = 0. że elem en t t [4 ] . Dla wtajemniczonych: Możliwa jest ona wtedy. to tutaj k om p ilato r zasy g n alizu je Ci błąd.372. 7. \2 In ic ja liz a c ja ta b lic Inny m sposobem n ad a n ia w artości elem en to m tablicy jest inicjalizacja - n ad an ie w artości początkow ych w m om encie definicji tablicy (czyli w m om en­ cie jej narodzin). n ie is tn ie je ). że ż ą d a n e w artości początkow e zos­ taną n a d a n e tylko tym d w ó m p ierw szym elem entom . gdy elementy tablic są tak zwanymi agregatami.Rozdział. bo w jednej linijce załatw ia inicjalizację w szystkich czterech elem entów . p o d o b n ie jak i elem ent t [ 107 ] . jak robiliśm y inicjalizacje w p rzy p ad k u zw y k ły ch typów: int liczba = 237. 5 }. A Inicjalizacja taka spow oduje. ' O sobiście p referuję ten pierw szy zap is (z silną nierów nością). Tablice 223 Inicjalizacja tablic iSSOftaSHMMąMMlIMMNMNMMNMMNMMMMMMMMNMmsnMI O tó ż ra d z ę C i b y ś z d e c y d o w a ł s ię na je d e n ty p z a p is u i n ig d y n ie u ż yw a ł d ru g ie g o . 200 }. P am iętasz zap e w n e. W p rzy p ad k u tablicy trzeba nadać w artość początkow ą k ażd e m u elem entow i. 4. inicjalizacja zbiorcza. 724). W inicjalizaq'i sp raw d za się.za d u żo . W n aszy m p rz y p a d k u w ygląda to tak: int t [4] = { 17. Dla w y g o d y istnieje też taki sposób definiow ania i inicjalizacji tablic: .

31. 8. że tu taj w kw adratow ym naw iasie nie p o d aliśm y ro zm iaru ta b lic y K om pilator w ięc sa m sobie przelicza ile to liczb podaliśm y w k lam rze i w efekci < rezerw ow ana jest pam ięć na te elem enty. 3 ) . Z auw aż.czy w y o b ra ż a sz sobie funkcję. 7. 4. to inicjalizacja zbiorcza jesl jedyną szansą u m ieszczenia w niej w artości. 30. ale m e całosc. nie m ów iąc ju ż o trudnościach w realizacji takiego p rz e sła n ia . 31. 31}. To jes proste. C hcem y teraz n ap isać sobie funkcję.w y sta rc z y n ap isać pętL^ m nożącą p rzez 3 . 3 0 . 16. Tablicy jed n ak nie d a się przesła< p rzez w artość. Tablice Przekazywanie tablicy do funkcji i n t r [] = { 2 . Jak jed n ak p rzesłać do funkcji tablicę? C zy pam iętasz.224 Rozdz. która w w y w o łan iu dostaje 8192 arg u m e n ty ? To tak. 15. / / ^-wywołanie funkcji P rzy n azw ie tab licy w w yw ołaniu funkcji nie w id zisz ż a d n y c h nawiasów k w ad rato w y ch . . k tó ra treść każdego elem en tu tej tablicj pom n o ży p rzez 3. Jak to pom nożyć.12 ) . to taką funkcja w yw ołujem y na p rz y k ła d tak: f l o a t t a b l i c a [] = { 7. 30. że: | tablice przesyła się podając funkcji tylko ad res p o czą tk u tej tablicy. 287 1 1 . funkcja (ta b lic a ) . 31. oczyw iście w iesz . To nie w yn ik a z n iedoskonałości języka. czyli fo tografow any jest k a ż d y a rg u m e n t i jegc zdjęcie (kopia) p rzesy ła n a jest d o funkcji. 31. 7. Po p ro stu .3 P rze k a z y w a n ie ta b lic y do fu n k c ji Z ałóżm y. Inicjalizacja tablicy obiektów stałych| Jeśli m am y zd efin io w ać tablicę obiektów stałych. Sam o p o jed y n cze w yw ołanie takiej funkcji trw ało b y p ew ien znaczący czas. k tóra sp o d ziew a się jako argum entu: tablicy liczb typu f l o a t . 30. W naszym p rz y p a d k u p o w s ta n u tablica pięcioelem entow a. j Jeśli m am y funkcję v o id f u n k c ja (flo a t t t t [ ] ). c o n s t i n t d n i w m i e s ią c a c h [12]= { 31. 10. bo aż 8192 lo n g i n t w idm o[ 8192].1. jak m ów iliśm y o p rzesy łan iu arg u m en tó w d o funkcji? Z w ykle przesyła się p rz e z w artość. 4. jak b y fo to g rafo w ać 8192 razy. P róbek p o m iaro w y ch jesl d u żo . Z atem zasad a je st taka.po kolei w szystkie elem enty tej tablicy o d 0 d o 8191. M o żn a tak przesłać p o jedyncze jej elem enty. że m a m y tablicę z danym i p om iarow ym i.

i < rozmiar .jako je d en z arg u m e n tó w .n a d a n ie w a r to ś c i p o c zą tk o w e j for(int i = 0 . W n aszy m w y w o łan iu funkcji n ap isaliśm y sam ą n a z w ę tablicy (bez klam er). U w ag a: nie m ylm y tego o p e ra to ra z d w u a rg u m e n to w y m operato ­ rem & oznaczającym bitowy iloczyn logiczny. 7. long t []). void potrojenie(int ile. i ++) 1 widmo[i] = i. } . M ianow icie w y rażen ie: tablica + 3 je st a d re se m tego m iejsca w pam ięci. że: W języ k u C++ (ta k jak i w C): NAZWA TABLICY jest równocześnie ADRESEM ZEROWEGO JEJ ELEMENTU N ie żartu ję.w y sy łan a jest tablica. Elem ent o in d e k sie 3 to in aczej e lem en t tablica[3] a d re s tak ieg o e lem en tu to Stablica[3] Z n a k &(a m p e rsa n d ) jest je d n o a rg u m e n to w y m o p erato rem o zn aczający m uzys­ kiwanie adresu danego obiektu. // O i f (i < 6) //p o k a za n ie p ie r w s z y c h s z e ś c iu cout « "widmo[" « i « "]= " << widmo[i] « endl. A z a te m p o n iż sze d w a z ap isy (w yrażenia) są ró w n o w aż n e tablica + 3 &tablica[3] M o żn a je sto so w ać w y m ien n ie. // j j ----. R zeczy w iście w ykuj to z d a n ie n a pam ięć. w k tó ry m d o funkcji . #include <iostream> using namespace std. W ró ćm y jed n ak d o rzeczy. Jest jeszcze coś ró w n ie sy m p aty czn eg o . //O int main() const int rozmiar = 8192. O to przy k ład p ro g ra m u . bo b a rd z o C i to pom oże w sw o b o d n y m p o ru s z a n iu się po kró lestw ie C ++. . co k to lubi.Rozdział. // @ long widmo[rozmiar]. Tablice 225 Przekazywanie tablicy do funkcji Z ap a m ię taj so b ie n a z a w s z e (a najlepiej n a p is z sobie to na k artc e i p rzy le p nad b iu rk iem ). g d z ie tk w i elem ent o in d e k sie 3. w ięc d o funkcji p rzesy łam y ad res.

jak deklaruje się argument formalny. M usimy to zrobić. Wewnątrz tej funkcji potrzebna jest nam także liczba elem entów tablicy. Zauważ.na podstawie nazwy tablicy (czyli adresu) nie da się określić ile dana tablica ma elementów. gdyż . 0 Rozmiar tablicy widmo definiujemy sobie w programie jako obiekt typu int a przydomkiem const . i < 4 . widmo) . Dlatego w ysyłam y sobie tę wartość jako argument.w tej funkcji . i < ile . 7. do której. Jej rozmiar jest określony przez liczbę schowaną w powyż szym obiekcie typu int z przydomkiem const. long t [) ) / / €► for(int i = 0 .rozmiaru tej tablicy nie będziemy przecież w trakcia programu zmieniać. Jest to jakby definicja tablicy typu long o nieznanym rozmiarze. któ­ rych wartość liczbowa ma ulec potrojeniu. © Oto definicja tablicy. } } /****************** ********★ **********************************/ void potrojenie (int ile. wywołujemy funkcję ! potrojenie (rozmiar. To c o n s t sprawia. (( / / ©• cout « "Po wywołaniu funkcji \n' for(int i = 0 .226 Rozdz. i++) { / / €► t[i] *= 3. J t************** *********+***********************************/’ W wyniku wykonania tego programu na ekranie pojawi się widmo[0]= 0 widmo[1]= 1 widmo[2]“ 2 widmo[3]= 3 widmo(41= 4 widmo[5]= 5 Po wywołaniu funkcji widmo[0]= 0 widmo[11 = 3 widmo[2]= 6 widmo[3]= 9 O Deklaracja funkcji. Tablice Przekazywanie tablicy do funkcji U -------." « widmo [i] « endl. Dlaczego słow o const jest tu konieczne . Jak pamiętamy. wysyła się tablicę. rozmiar tak definiowanej tablicy musi być znany już na etapie kompilacj programu.okaże się za chwilę. i ++) // O cout « "widmo[" « i « "]. . że kompi­ lator jest pew ien stałości tej liczby już na etapie kompilacji. której elementy zamierza się potroić. jako argument.uwaga. W związku z tym funkcja ta będzie się nadawała do pracy na dowolnej tablicy typu long.

iż je st ona typu lo n g . N ie jest to p rzesłan ie tablicy. tylko n a oryginale. że mętnie to tłumaczę. co o d n ie sien ie się do elem en tu t a b l i c a [ 3 ] . co: t[i] = t [i ] * 3. to inaczej to sam o. Do funkcji p rzy słaliśm y a rg u m e n t określający liczbę elem en tó w tablicy. 7. jak w p rzy p ad k u zw ykłej zm ien­ nej i n t .Rozdział. że jeśli w y sy ła m y d o funkcji ad res tablicy. n a której ta o p eracja potrojenia ma się odbyć. o ra z nazw ę tablicy. Niestety na razie nie mogę powiedzieć całej prawdy. In n y m i słow y. P rz y p o m in a m . Co się dzieje wewnątrz funkcji: © O d b ieram y tam a d re s p o czątk u tablicy i s łu ż y on do z b u d o w a n ia w ew n ątrz funkcji takiego a p a ra tu obsługi tablicy t [ ] . . © W naszej funkcji p o t r o j e n i e p rzeb ieg am y po elem entach tablicy t [ ] z ż ą d a n e g o p rzed z iału 0 . Masz rację jeśli myślisz. jak b y śm y w y sy łali a d re s zerow ego jej elem en tu . P rzy p o m in am że instrukcja: t[i] *= 3. na których należy p rz e p ro w a d z ić operację potrojenia. O d b y w a się to identycznie. W Wysyłanie tylko jednego elementu D o funkcji. P ie rw sz e 6 elem en tó w tablicy w ypisuje­ m y na ekran. i n t ta b l[1 0 0 ]. W szczególności nie w iadom o.8191 i m nożym y k a ż d y elem ent p rzez 3. Wszystko stanie się jasne w następnym rozdziale. których za­ w a rto ść należy p o tro ić. © Po po w ro cie z funkcji w y p isu jem y w artości ty ch elem entów na ek ran ie. Jak o arg u m e n ty w y sy ła m y liczbę elem en tó w . to to: • jaki je st a d re s jej początku. © W y w o łan ie funkcji. ż e o d n iesienie się d o elem entu 1 t [ 3 ] jest d o k ła d n ie ty m sam ym . że jedyne. nie p racu jem y tu na żadnej k o p ii tablicy. M usieliśm y to zro b ić dlate­ go. jak i m a rozm iar ta tablica. co w e w n ą trz funkcji w iadom o n a tem at przysłanej tablicy. N ic więcej. m o żn a w ysłać a rg u m e n t będący jakimś elem en tem tablicy typu i n t . Tablice 227 Przekazywanie tablicy do funkcji O Po definicji tablicy n a stę p u je pętla nadająca jej elem entom w arto ści początkow e ró w n e kolejnym liczb o m n atu raln y m . to tak. kiedy to porozmawiamy o wskaźnikach. • i to. i n t m. której a rg u m e n te m form alnym jest ty p i n t v o id f f f ( i n t x ) .

228 Rozdz. 7. Tablice
Przykład z tablicą elementów typu enum

fff (m) . II w y s ła n ie do fu n k c ji zw y k łe j z m ie n n e j
ff f (tabl [38 J); II w y s ła n ie do fu n k c ji e le m e n tu n r 3 8

Takie w y słan ie jednego elem entu odbyw a się oczyw iście p rz e z w artość.
Łatwo to zapam iętać tak:
Otóż w artością w yrażenia tabl [3 8 ] jest liczba (z ap isa n a w ty m elem enc ii
tablicy). N ato m iast wartością w y rażen ia tabl jest adres tej tablicy. To d la te g <
m echanizm przesłania jest inny.
Inaczej m o ż n a to w ytłum aczyć tak:
* Jak w iem y - w yrażenie t a b l jest typu: tablica 100 elementów typu i n t r .
♦♦♦ N ato m iast t a b l [ 38 ] jest jednym z elem entów tej tablicy, a skoro jest t:c
tablica elem entów typu i n t , to ten element jest typu i n t (po p r o s tu ! )
M ożna go więc wysłać d o każdej funkcji oczekującej arg u m en tu typ>u
in t.

7.4 Przykład z tab lic ą e le m e n tó w typu enum
Z obaczym y tu program , w którym w ykorzystana b ę d z ie tablica e le m e n tó w
typu o n azw ie e t a p y , który to ty p jest typem w y liczen io w y m (enum).
Będzie to jakby program nap isan y z p u n k tu w id zen ia k ie ro w n ik a p ro d u k c ji
filmu reklam ow ego. Kierownik taki, jak w iadom o, nie jest a rty stą, w ięc na s c e n y
filmu p a trz y tylko pod kątem tego, co już zostało z ro b io n e i ile jeszcze trz e b a
w łożyć pracy.
#include <iostream>
using namespace std;

enum etapy < nic, scenopis, probaczytana, // O
proba_kamerowa, nagranie - o,
montaż, postsynchron }; . 4
, (praDv tfl. int ile, int dzień zdgeciowy);

int m a i n ()
(
const int liczba_scen = 10; g
etapy scena[liczba scen] = '' ”
{ scenopis, proba_czytana, proba_kamerowa },

int dzien_realizacji = 1;

scena[2] = nagranie; // €w3!
scena[5] = montaż;
scena[9] = nagranie;
scena [41 = próba kamerowa; .. ,
stan realizacji (scena, liczba_scen, dzien_realizacji), //vJ

H ________ n a stę p n e g o d n ia praca p o su n ę ła się dalej -
dzien_realizacj i++;

scena [1 ] = proba^kaiuerowa/
scena[5] = postsynchron;

Rozdział. 7. Tablice 229
Przykład z tablicą elementów typu enum

s c e n a [0] = scenopis;
un era jia
s c e n a [8] = scenopis;
stan_realizacji(scena, liczba_scen, dzien_realizacji);
i
^ ★ 4 4 4 4 4 4 4 4 + * * 4 * 4 * + 4 4 T i r 4 4 4 * 4 4 * * 4 * 4 4 4 4 4 4 * 4 * * 1l r * * * * * * * . * . * . * . . * . * . * . * * * . * . * *

void stan_realizacji(etapy s[], int ile, int dzień ) //
{
cout << dzień
« dzień realizacji filmu reklamowego\n"
« "Stan realizacji: \n";

for(int i = 0 ; i < ile ; i++)
{
cout << "Scena nr " << i « ", ";
for (int k = 0 ; k < s (i ] ; k++) // ©
cout << "#";

cout << endl;
}■
}
^*********** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 4 * * * * * * + * * * * * * * * * * * /

3 Po wykonaniu tego programu na ekranie zobaczymy tekst
1. dzień realizacji filmu reklamowego
Stan realizacji:
Scena nr 0, #
Scena nr 1 , ##
Scena nr 2, ######
Scena nr 3,
Scena nr 4 , ###
Scena nr 5, #######
Scena nr 6,
Scena nr 7,
Scena nr 8,
Scena nr 9 , ######
2. dzień realizacji filmu reklamowego
Stan realizacji:
Scena nr 0, I
Scena nr 1, ###
Scena nr 2, ######
Scena nr 3,
Scena nr 4, *##
Scena nr 5, *#######
Scena nr 6,
Scena nr 7,
Scena nr 8,
Scena nr 9, *#####

£ Krótki komentarz

O Definicja typu w y liczen io w eg o (enum) o n a z w ie e t a p y . Służył o n n am będzie
d o ok reślan ia kolejnych eta p ó w realizacji film u.
© Definicja tablicy takiego ty p u . W idzisz tu też inicjalizację zbiorczą kilku p ierw ­
szych elem entów . R eszta w ięc będzie zap e łn io n a zeram i. W tym ty p ie w yliczę-

230 Rozdz. 7. Tablice
Tablice znakowe

niowym w artość zero odpow iada stanow i n i c , to z n a c z y nie m a n a w j
scenopisu.
© Praca z tablicą s c e n y . N adaw anie jej elementom jakichś w artości.
O W yw ołanie funkcji s t a n r e a l i z a c j i. W ysyłamy tam tablicę s c e n y (a w łaś
ciwie jej adres). Wysyłamy też w artość i n t określającą ile scen m a n asz tu m i
który to d zień realizacji.
© Oto ta funkcja. Zobacz, jak odbiera ona argum ent pierw szy , będący tablicą ele­
m entów ty p u e t a p y .
W funkcji jest pętla przebiegająca po wszystkich scenach film u. j
© Dla każdej sceny jest mniejsza pętla, która drukuje rz ą d e k zn acz ow v
zależności o d zaaw ansow ania e ta p u . ,
Dalsze w yjaśnienia nie dotyczą już tablic, a raczej ty p ó w w y liczen io w y . ,
Zauważ, że licznik tej pętli k - jest porównywany z wartością liczbową
danego etapu. Zatem wyrażenie
k < s [ i]
porównuje liczbę typu i n t z typem wyliczeniowym (jego reprezentac,ą
liczbową). Dany etap ma przecież jakąś tam reprezentację liczbową. ZIj
my ją w definicji typu wyliczeniowego e ta p y .
M ożna tak porów nyw ać, bo istnieje tak z w a n a konw ersja stan d ar­
dow a z typów w yliczeniow ych na typ i n t . (P o ro zm aw iam y o tym
w przyszłości).

To (praw ie) w szystko, co trzeba w iedzieć na tem at tablic. M yślę, że nic w tym
tru d n eg o , b o z tablicami zetk n ąłeś się w innych językach pro g ram o w an ia.
W łaściw ie w ięc m ożna by ten ro zd ział tutaj skończyć, g d y b y m e p ew ien b ard zo
pożyteczny rodzaj tablic: tablice znakow e.

7 .5 T a b lic e z n a k o w e
Specjalnym rodzajem tablic są tablice d o p rzech o w y w an ia zn ak ó w (np. liter
D latego też tablicom tym p rzy jrzy m y się bliżej.
char zdanie[80];
V\
Ta definicja określa, że z d a n i e jest tablicą 80 elem en tó w b ędących znakam i,
tablicy tej m o ż n a um ieścić tek st, dzięki tem u, że k a ż d y z jej elem entów na y
się do p rzec h o w y w an ia reprezentacji liczbowej zn ak ó w alfanum erycznyc . ■
p rzy k ład - zn a k ó w zak o d o w an y ch k o d em ASCII. Kod tak i, jak zap ew n e wiesz
jest je d n y m ze sposobów k o d o w an ia liter, które w k o m p u te rz e m uszą by<
przecież p rzec h o w y w an e w postaci liczb. Jest kilka sp o so b ó w kodow ania i »
m y je d n ak m ó w ić będziem y o k o d zie ASCII-

Rozdział. 7. Tablice 231
Tablice znakowe

Teksty w tablicach zn ak o w y ch zw y k ło się p rzech o w y w ać tak, że po ciągu liter
(a w łaściw ie ich k o d ó w liczbow ych) n astęp u je znak o k o d zie 0. Ten znak zw any
jest czasem nuli. Z n a k ten jest po to, by oznaczyć g d zie k o ń czy się ciąg liter. Na
taki ciąg liter z a k o ń c z o n y zn ak iem nuli m ó w im y string, lub C-string.

Żegnaj makrodefinicjo n u ll

D aw niej w języku C ++ funkcjonow ała d y rek ty w a p rep ro ceso ra nadająca słow u
NULL w arto ść 0 (zero). Z atem w p ro g ram ie m ożna było s p ra w d z a ć istnienie w
d an y m elem encie tablicy znaku nuli - u ży w ając w łaśn ie sło w a NULL. N ow y
sta n d a rd tego ju ż n ie p rzew iduje. W iele ko m p ilato ró w n ad al ro zu m ie to słowo,
ale m oże się z d arz y ć, ż e Twój k o m p ilato r p o prostu o d p o w ie Ci, ż e nie wie, co to
jest NULL. D lateg o lepiej w now ych p ro g ram ach sto so w ać zam iast niego 0
(zero), bo taki jest w łaśn ie kod ASCII zn a k u nuli.

Inicjalizacja tablicy znaków
N aszą tablicę z d a n i e m ożna już w trakcie definicji zainicjalizow ać
c h a r z a d n i e [80] = { "lot" );
Z auw aż, że o d b y w a się to przez n ap isan ie tekstu ujętego w cudzysłów .
W rezultacie w p oszczególnych ko m ó rk ach tablicy zdanie z n a jd ą się n astęp u ­
jące znaki
Rys. 7-1 i;1{jfejSUJS

11
.

t n u li

Jak w idzisz, w p isa n e zostały trzy litery, a za nim i znak o k o d zie nuli kończący
C-string. D alsze elem en ty tablicy nas nie interesują. W arto jed n ak pam iętać, że -
w m yśl o m ó w io n y ch nied aw n o zasad inicjalizacji zbiorczej tab lic - nie w ym ie­
nione w n aw iasach { } elem enty - inicjalizuje się zeram i, a ż do końca tablicy.
Z n ak nuli został au to m aty czn ie d o p isan y p o ostatniej literze t
d zięk i tem u, że inicjalizow aliśm y tablicę ciągiem zn ak ó w o g ran i­
czo n y m cudzysłow em .
Jest to po naszej m yśli, bo w językach C i C++ w szelkie funkcje biblioteczne
pracujące na C -strin g ach opierają się na założeniu, że ko n iec C -stringu
oznaczony jest z n a k ie m nuli (bajtem zerow ym ).
N a przykład:
Jeśli chcemy jakiś C-string wypisać na ekran, to wywołujemy standardową
funkcję biblioteczną (p u t s - o d : put string) i jako argument przekazujemy
jej adres początku C-stringu. Funkcja ta będzie sukcesywnie wypisywała
na ekran znaki zawarte w kolejnych komórkach pamięci począwszy od
adresu podanego jako początek C-stringu. Akcja zakończy się dopiero po
natknięciu się na komórkę ze znakiem nuli, czyli inaczej mówiąc z
zapisanym tam bajtem 0.

232 Rozdz. 7. Tablice
Tablice znakowe

Jest też in n y sposób inicjalizacji tablicy znaków
char zdanie[801 * 1 'i'* 'o*, 't' 1;

Z a u w a ż , że w klam rze p o jaw iły się pojedyncze lite ry o g ran iczo n e a p o s tro fa m i.
Z apis ta k i jest nie tylko ró w n o w a ż n y trzem instrukcjom :
zdanie[OJ = '1 *;
zdanie[1] = 'o';
zdanie[2] = ’t';
P o n iew aż nie było tu c u d zy sło w u , w ięc k o m p ilato r nie d o k o ń czy ł te g o z n a k ie m
nuli u m ieszczan y m p o p rz e d n io w elem encie z d a n i e [ 3 ]. Z atem s p ra w a w y ­
daje się ry z y k o w n a - po ciąg u liter nie nastąpił z n a k kończący C -strin g .
A je d n a k p rzy p o m n ij sobie, co m ów iłem o inicjalizacji zbiorczej - cz y li takiej,
g d zie w arto ści p o czątk o w e u m ieszczo n e są w k la m rz e { } . O tó ż jeśli w a rto śc i
p o czą tk o w y ch jest m niej niż elem entów tablicy, to reszta jest in icjalizo w an a
zeram i. C zyli p ozostałe elem en ty tablicy z d a n i e , a ż d o elem en tu o in d e k sie 79,
zo stan ą inicjalizow ane zera m i. W szczególności w elem encie z d a n i e [3 ] te ż
zn a jd z ie się zero . A teraz u w ażaj: z n a k nuli ma p rz e c ie ż też w arto ść 0 - z a te m n ie
m u sim y się m artw ić, C -strin g w tablicy z d a n i e je st p o p ra w n ie z a k o ń c z o n y .

Pułapka
N ie z a w s z e je d n ak życie jest tak piękne. O to chcieliśm y być sp ry tn ie jsi i n a p isa ­
liśm y ta k ą definicję:
c h a r z d a n i e [] = ( ' 1 ' , 'o ', 't ' 1;
P a m ię ta m y b o w iem , że jeśli n ie p o d am y ro zm iaru tablicy, to k o m p ila to r p rzeli­
czy so b ie liczbę in icjalizato ró w i tak ą zare zerw u je tablicę. W n a s z y m p rz y k ła ­
d zie d o liczy się trzech elem en tó w . Z ostanie w ię c z a re z e rw o w a n e tablica 3
e lem en to w a . W p o szczeg ó ln y ch jej elem entach z n a jd ą się zn ak i ' 1 ' ' o ' ' t ',
ale z n a k u nuli tam nie będzie. N ie było cu d z y sło w u , w ięc k o m p ila to r n ie sąd ził,
że te z n a k i m ają się sk ład ać n a C -string. D o p isan ia re sz ty zera m i n ie b ęd zie, bo
ża d n e j re sz ty nie m a. Tablica m a ty lk o trzy elem en ty . P o d k reślam je d n a k - n ie
jest to b łą d . M ożliw e, że lite ry te nie m ają być u ż y w a n e jak ciąg z n a k ó w , (czyli
strin g ), lecz p o p ro stu są to lu ź n e litery, d o in n y c h celów . T ra k to w a ć jako!
C -strin g ich je d n ak nie m o żn a.
Z w ró ć u w a g ę na tę deklarację:
char zadnie[] = { "lot" 1;

T utaj k o m p ila to r,o b lic z a ją c ile elem en tó w m a z a re z e rw o w a ć n a tablicę, doliczy
się trz e c h liter, ale z faktu, ż e są o n e ujęte w c u d z y s łó w w y w n io sk u je , że m ają
o n e b y ć u ż y w a n e jak o C -strin g , w ięc z a re zerw u je je szc ze je d e n d o d a tk o w y ele­
m e n t n a z n a k nuli.
Jeśli n ie w ie rz y sz , to zobacz:
#include <iostream>
using namespace std;
j ^ ł* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 4'*'*****

Rozdział. 7. Tablice 233
Tablice znakowe

int main()
{
char napisl[] = { "Nocny lot"};
char napis2 [ ] = { ’N \ ’o', ’c', 'n', 'y\
' ', '1', 'o', 't' };
cout << "rozmiar tablicy pierwszej: "
<< sizeof(napisl) << endl;

rozmiar tablicy pierwszej: 10
rozmiar tablicy drugiej: 9

C zęsto u ż y w a się pojęcia długość C -stringu - jest to ilość lite r należących do
tego C -strin g u . P am iętajm y, że rozm iar C-stringu jest w ię k sz y o 1, czyli o znak
nu li
A teraz p y ta n ie ko ntrolne. M am y takie d w ie definicje tablic. C o o nich sąd zisz -
czy są p o p raw n e?
char tl[ 1 J = { "a" };
char t2[1] = { ' a ' };
Pierw sza je st b łęd n a. Tablica jest tu jed n o elem en to w a, a ch ce m y w pisać d o niej
strin g zło żo n y z litery ' a ' i zn ak u n u li N a to p o trzeb a d w ó c h elem entów
tablicy. Z a te m błąd.
W drugiej definicji inicjalizacja polega na w p isan iu d o tablicy ty lk o jednej litery,
a w ięc jest p o p ra w n a .

P rzy g ląd aliśm y się p rzed chw ilą jak w p isu je się strin g i d o tablic. N iestety: w
p o d an y sp o só b w p isy w ać m ożna do tablicy znakow ej te k st tylko w czasie
inicjalizacji. P otem , p ró b a w pisania do niej czegoś tym sp o so b em
zdanie [80] = "nocny lot"; //B ł ą d !
zdanie = "nocny lot"; //także b ł ą d !
jest n iep o p raw n a.

Jak zatem wpisywać tekst do tablic już istniejących?
S praw a jest prosta. Trzeba napisać sobie funkcję, która się ty m zajm ie i p o d an y
C-string, litera po literze umieści w danej tablicy.
Z adanie to je st tak częste, że w stan d ard o w ej bibliotece je st kilka funkcji
realizujących to w różnych w ariantach.
Przyjrzyjm y się takiej funkcji. Jako arg u m e n ty otrzym uje o n a d w ie tablice - tę,
w której jest strin g źródłow y i tę, g d zie m a on później zostać skopiow any.

234 Rozdz. 7. Tablice
Tablice znakowe

O tym, że tablica może być argumentem funkcji - wiemy ju z z poprzednie­
go paragrafu. Naprawdę do funkcji przesyłany jest tylko adres począł
tablicy, a nie wszystkie jej elementy (których mogły by być tysiące).
Jak m a w yglądać sam p ro ces k o p io w an ia? Jest to b a rd z o p ro s te d zięk i naszej
zapobiegliw ości. K opiuje się znak p o z n a k u elem enty z tab licy zrodlow e) o
tablicy docelow ej ta k d łu g o , aż nie n ap o tk a się na zn ak n u li T en z n a k nuli, ta k ż e
n ależy p rzek o p io w a ć - jeśli w ynik m a być p o p ra w n y m C -strin g iem .
S próbujm y zatem to napisać. O czyw iście p o słu ży m y się pętlą.
v o id s t r c p y ( c h a r c e l [ ] , c h a r z r o d l o []) // O
{ . // 0
fo r(in t i = 0 ; ; i++)
( //
c e l[ ii = z ro d lo ji];
i f ( c e l [ i ) == 0 ) b re a k ; //

O Jest to, jak czy tam y , fu n k cja przyjm ująca jak o a rg u m e n ty d w ie tablice elem en ­
tów ty p u c h a r - czy li d w ie tablice z n a k o w e . T ypem z w ra c a n y m jest ty p v o i c .
U czciw ie p rz y z n a m , że m ogłem w y m y ślić to lepiej, ale na razie n ieć ę zie ja
jest.
© D o przeb ieg n ięcia p o p oszczególnych elem en tach tablicy słu ż y n a m pętla r o r .
Pętlą ta zaczy n a się o d i = 0, bo, jak w ia d o m o , n u m eracja e le m e n tó w tablic
za c z y n a się od 0. D alej w instrukcji f o r w id z im y p u ste m iejsce - b o n ie w ie rn y
ile elem en tó w tablicy b ęd ziem y p rz e p isy w a ć . P u ste m iejsce o z n a c z a aj, ze
p ę tla jest n ieskończona.
© T o je st w łaściw a akcja p rzep isa n ia p o szczeg ó ln eg o z n a k u z ta b licy z r o d l o do
tablicy c e l
O S p ra w d z e n ie czy w ła ś n ie p rz e p isa n y z n a k nie jest cza se m z n a k ie m n u li
Znak nuli - jak pamiętamy - ma kod ASCII: zero.
Jeśli tak , to pętlę p rz e ry w a się in stru k cją b r e a k . Jeśli nie, to w y k o n u jem y
n a s tę p n y obieg p ętli. In stru k cją i+ + z w ię k s z a się z m ie n n a i , k tó rą u ż y w a m y o
in d e k so w a n ia e le m e n tó w tablicy, p o czy m k o p iu jem y dalej.

Inne sposoby zrobienia tego samego
A oto , jak tę sam ą fu n k cję m o żn a z re a liz o w a ć u ży w a ją c pętli d o - w h i l e :

v o i d s t r c p y l c h a r c e l l l , c h a r z r o d l o (1)
{
i n t i = 0;
do{ . .
c e l [ i j = z ro d lo [ i ] ; // kopiowanie . .
}whi l e {c e l [ i ++1 ! = 0) ; // sprawdzenie i przesunięcie
' . . , j
W sk ró cie m o ż n a tre ść tej instrukcji w y p o w ie d z ie ć tak: D o tąd k o p iu j elem enty z
ta b lic y d o tablicy, d o p ó k i (ang: while) - w ła śn ie s k o p io w a n y e lem en t ma ko
A SC II ró żn y o d 0. (C zy li d o p ó k i jest ró ż n y o d nuli).

Rozdział. 7. Tablice 235
Tablice znakowe

P rzy okazji w y k o n u je się p rzesu n ięcia in d e k su tablicy m e to d ą postinkrem en-
ta q i. W y rażen ie p o ró w n u jące:
cel[i] != 0

je st jeszcze z e sta rą w arto ścią i . B ezp o śred n io po tym n a stę p u je inkrem entacja,
czyli zw ięk sze n ie in d e k su o 1 ( p o st-in k rem en ta cja).
P am iętasz m oże, jak p rz y okazji o m a w ian ia o p erato ra = m ó w iłem , że w artością
w y ra ż e n ia p rz y p is a n ia (p o d staw ien ia) je st w arto ść będąca p rz e d m io te m p rzy ­
p isan ia. Inaczej m ó w ią c w yrażenie:
( i = 15)
n ie tylko, ż e w y k o n u je p rzy p isan ie, ale jeszcze sam o, jako całość, m a w artość 15.
P o do b n ie w y ra ż e n ie
(c e l[i] = z ro d lo [i])
m a w arto ść ró w n ą k o d o w i ASCII k o p io w an eg o w łaśn ie z n a k u . K orzystając z
teg o m o żem y n ap isać naszą funkcję tak:
v o id s t r c p y ( c h a r c e l [ ] , c h a r z r o d l o [ ] )
{
i n t i = 0;
w h ile ( c e l[ i] = z ro d lo (i])

i+ + ;
}
}
P rzeczy tać to m o żn a tak: Jeśli w artość w y ra ż e n ia k o p io w an ia
(c e l[i] = z ro d lo [i])
je st ró żn a o d zera (czyli nuli) to in k rem en tu j indeks i . T eraz w id zisz, jakie to
w y g o d n e, ż e zn ak nuli kończący string m a w artość w łaśnie 0
S prytn e, p raw d a? N ie m ów im y:
• m u sisz skoczyć p o gazetę i potem ro zw iąż w niej krzyżów kę,
tylko
jeśli gazeta, k tó rą p rzy n io słeś ma jakiś ty tu ł in n y niż nuli,
to m o żesz rozw iązać w niej krzyżów kę.
C hcąc sp raw d zić, ja k a jest w artość w y rażen ia - k o m p u ter m u si to w yrażenie
„obliczyć", czyli w n aszy m p rzy p ad k u w y k o n ać k o p io w an ie z n a k u z tablicy
z r o d ł o d o tablicy c e l . Za jed n y m zam ach em robim y w ięc k ilk a rzeczy.

Dwie uwagi (tytułem przestrogi)

P o pierw sze:
D o w n ętrza instrukcji kopiow ania nie w staw iłem postin k rem en tacji indeksu i .
T o dlatego, ż e w w y rażen iu
c e l[i] - z ro d lo [i+ + ];

236 Rozdz. 7. Tablice
Tablice znakowe

nie m iałbym p ew n o ści k ied y n ap raw d ę by n astąp iła ta p o s tin k re m e n ta c ja . Je>t
ry zy k o , że na p rzy k ła d p o wyjęciu zn ak u z tablicy z r o d l o , a p rz e d w sa­
d z e n ie m go d o tablicy c e l . W tedy k o p io w an ie o d b y ło b y się n a w z ó r takiej
instrukcji:
c e l [4] = z r o d l o [ 3 ] ;
Jak to jest? O tóż k o m p ila to r nie g w aran tu je kolejności o b lic z a n ia zm ien n ej
d la te g o bezpieczniej inkrem entację zrobić w głęb i pętli w h i l e .

D ru g a u w ag a:
N iek tó re bardziej tro sk liw e kom pilatory, g d y zobaczą w y ra ż e n ie
w h ile (c e l[ij = z ro d lo [i]) .. .

czyli inaczej
w h ile ( a = b ) . . .
n ie do cen ią n aszeg o sp ry tu i pom yślą, ż e p ra w d o p o d o b n ie c h o d z i n am o po­
ró w n a n ie d w óch e lem en tó w . Czyli p o m y śli, ż e m ó w im y : w y k o n u j d a n ą pętlę
d o p ó k i a równa się b.
K o m p ilato r taki p rz y p u s z c z a , że p o m y liliśm y p o ró w n a n ie (==) z p rz y p isa n ie m
(=), czy li że p rzez p o m y łk ę zam iast d w ó ch z n a k ó w == w s ta w iliś m y tylko ten
je d en =. N ie sy g n alizu je b łę d u , jedynie o strz e g a nas.
T rzeba je d n ak p rzy zn ać, że najczęściej taki k o m p ila to r m a rację.
C h w y tu , k tó ry tutaj zasto so w aliśm y , nie sto su je się ta k często. Za
to b a rd z o często zap o m in a się p rz y operacji p o ró w n a n ia o podwój-1
nym z n a k u rów ności. D latego lepiej niech k o m p ila to r n am p atrz y
na ręce.
M ó w iliśm y ju ż o ty m (§ 4.2.1, str. 103), że m o ż n a k o m p ilato r u s p o k o ić dając m u
d o zro z u m ie n ia , iż ro b im y takie p rz y p isa n ie celow o. W y sta rc z y d o d a ć d o d a t­
k o w ą p a rę n aw iasó w .
w h i l e ( (a = b ) ) . . .

W
W ró ćm y je d n ak d o n a sz y c h baran ó w .
T y m sp o so b e m n a p isa liśm y funkcję s t r o p y , k tóra m o ż e n a m się p rz y d a i
b a rd z o często. P rz y k ła d o w o spójrz na ta k i fra g m e n t p ro g ra m u :

c h a r s t a r t *[) = i " t a k i s o b ie zw y k ły t e k s t " };
c h a r m e ta [ 8 0 ] ;
s trc p y (m e ta , s t a r t ) ;
c o u t << m e ta ;
F ra g m e n t ten w y k o n u je k o p io w a n ie strin g u z tablicy s t a r t d o tablicy m e ta
N a s tę p n ie w y p isu je się na ek ra n now ą z a w a rto ś ć tej tablicy.

Rozdział. 7. Tablice 237
Tablice znakowe

P rzyjrzy jm y się defin icji tablicy s t a r t . N ie m a w niej ro z m ia ru , zatem k o m p ila­
tor p rzeliczy so b ie w szy stk ie zn ak i w tekście o g ra n ic z o n y m cu d zy sło w em ,
n astęp n ie d o d a je d e n (na kończący z n a k nuli ) i tyle k o m ó re k pam ięci z a re z e r­
w uje na n aszą tablicę.
Z tablicą m e ta je st inaczej. Tutaj nie inicjalizujem y jej, w ięc k o m p ila to r chce z n a ć
ż ą d a n y ro zm iar. P o d ajem y m u np. 80, bo sp o d z ie w a m y się, ż e nasze tek sty
ła d o w an e d o tej ta b lic y n ig d y nie b ę d ą d łu ż sz e niż 79 z n a k ó w .

Ostrożnie !
C o by było, g d y b y ś m y w definicji tab licy m e ta - z a m ia st [8 0 ] p o d ali ro zm iar
[ 5 ] i w y k o n ali p ro g ra m ?
P am iętasz z a p e w n e , że w naszej fu n k cji s t r e p y k o p io w a n ie o d b y w a się na
oślep. P o szczeg ó ln e zn ak i będą b ra n e z tablicy s t a r t i w p isy w a n e d o kolej­
nych elem en tó w d o tablicy m e ta . T ak b ę d z ie aż d o k o ń ca ciągu zn ak ó w , czyli
d o kończącego tre ść tablicy s t a r t z n a k u n u li Jeśli tablica m e ta jest za k ró tk a,
b o rn a ty lk o 5 e le m e n tó w (ostatni to me t a [ 4 ] ) - to m im o w sz y stk o dalej b ęd zie
o d b y w ało się w p is y w a n ie d o nieistniejących elem en tó w
m e ta [ 5 ] , m e t a [ 6 ] , ....

i tak dalej d o p ó k i C -strin g ze s t a r t u się nie skończy.
W iesz o czyw iście, co takie w p isy w a n ie d o nieistniejących elem en tó w znaczy:
M im o w o ln ie b ę d ą n iszczone k o m ó rk i pam ięci zn ajd u jące się z a ra z za n aszą
tablicą m e t a. T ra g e d ia . Tym w iększa tra g e d ia , że nie m u sisz się zo rien to w ać od
razu . Z ależn ie o d tego, co tam a k u ra t by ło - błąd m o ż e u ja w n ić się o w iele
później. T y m tr u d n ie j jest to w ykryć.
C zy nie m o żn a zab e zp iec zy ć się p rz e d tak im i ew en tu a ln o ściam i? O statecznie
m o żn a, ale jest p ro b lem : otóż d o funkcji s t r e p y p rzesy ła m y ty lk o ad res tablicy.
Funkcja z d e k laracji a rg u m e n tó w fo rm aln y ch w ie tylko, ż e m a d o czynienia z
tablicam i z n a k o w y m i. N ie w ie nic w ięcej. W szczególności nie w ie jaki jest
ro zm iar tablicy. N ie m o żn a w e w n ą trz funkcji s t r e p y w sta w ić sobie takiego
w yrażen ia:
s iz e o f(c e l)

Jeśli zatem ch ce m y się p rzed p o m y łk am i zabezpieczyć, to m u sim y p rzysłać do
funkcji a rg u m e n t b ęd ący ro zm iarem tablicy, albo - b ard ziej u n iw ersaln ie -
a rg u m e n t m ó w ią c y o tym , ile m a k sy m aln ie z n a k ó w ży czy m y sobie
przek o p io w ać.
N a p rz y k ła d ż y c z y m y sobie p rzek o p io w a ć tylko 5 z n ak ó w . Jeśli C -string p rz e z ­
n aczo n y d o k o p io w a n ia będzie b a rd z o krótki, np. 3 literow y: " a c h " , to p rz e ­
kopiuje się cały. Jeśli będ zie długi: " N i e s a m o w ic i e d ł u g i e z d a n i e " , to
p rzek o p iu je się ty lk o początek " N i e s a " .N a końcu m u si się oczyw iście znaleźć
bajt zero w y (nuli).

W

238 Rozdz. 7. Tablice
Tablice znakowe

M oglibyśmy się teraz rzucić do pisania i w ym yślić funkcję s t r n c p y . Litera n w
środku nazw y m iałaby nam przypom inać, że chodzi po p rzek o p io w a n ie m a -
sym alnie n znaków , (czyli tylko kaw ałka C -stringu) bez d o d aw an ia n a końcu
zn ak u nuli. M oglibyśm y tak zrobić, g d y b y nie to, że te w szy stk ie w sp a m a e
funkcje daw no zostały napisane i zaw arte są w standardow ej bibliotece. A by z
nich skorzystać w ystarczy włączyć do sw ojego program u plik n ag łó w k o w y z
ich deklaracjami. Plik nagłówkow y tej części standardow ej biblioteki, k o ra
od pow iada za pracę z C-stringami n azy w a się c s t r i n g . P otem , n a etap ie
linkow ania dołączana jest (najczęściej autom atycznie) ta część biblioteki.

tinclude <iostream>
using namespace std;

strcpy(komunikat, tekst);
cout « komunikat « endl;
strncpy(komunikat, "12345£789Qabcdef", 9 ) •
cout « komunikat;
strcpy(komunikat, "— A ku-ku — !" );
cout « ”\nNa koniec: "
« komunikat << endl;

Wykonanie tego programu objawi się na ekranie jako:

Uwaga, tarcza została przepalona ! .
123456789rcza została przepalona !
Na koniec: — A ku-ku — !

O Z au w aż , że źró d łem w cale nie m usi być tablica definiow ana p rz e z nas. M oże byd
to stała tekstow a (C -string) będący stałą d o sło w n ą. Taki C -strin g p rzecież ta ze
m u si być p rzec h o w y w an y gdzieś w pam ięci kom putera.

D u żo m ów iliśm y tu n a tem at tablic zn ak o w y ch . N ie d lateg o , żeby były ona
jakieś specjalnie tru d n e , lecz dlatego, ż e często się ich u ż y w a . N ie m a tu w
z a sa d z ie żad n y ch c u d ó w - C -string to p o p ro stu znaki u sta w io n e jeden za
d ru g im , a na ich k o ń cu jest nuli, czyli bajt zero w y . To w sz y stk o . Nazwa teg
strin g u (n azw a tablicy, g d z ie o n tkw i) jest ró w n o cześn ie a d re se m tego miejsca \
p am ięci, g d zie C -strin g ten się zaczyna. T a m jest w ięc p o czątek tego C -stringu
K oniec jest tam , g d z ie jest zn ak nuli.

Rozdział. 7. Tablice 239
Tablice znakowe

Jeśli chcemy w ysłać C-string do funkcji, to w ysyłam y tam adres jego początku,
czyli samą n azw ę jego tablicy znakowej (bez żadnych naw iasów kwadrato­
wych). Dzięki temu funkcja dowiaduje się, gdzie w pamięci zaczyna się ten
string. G dzie się on kończy - funkcja może sprawdzić sobie sama szukając
znaku n u li
Do stringów jeszcze powrócimy w rozdziale o wskaźnikach.

W
Cierpliwości, czas na standardową klasę string, jest bliski...
Kilka razy w tym paragrafie ostrzegałem, byś robił tak, a nie inaczej, byś
pamiętał, że...
Nie okłamujmy się, nie w szyscy to zapamiętali. To nie tylko Twój problem, to
problem w szystkich programistów, którzy pracują z tablicami znakowymi.
Tymczasem z tekstami pracuje się w programie bardzo często i nie ma co
ukrywać - nie jest to w C i Ć++ w ygodnie rozwiązane.
O ile o tych wszystkich sztuczkach nie musim y m yśleć w przypad­
ku tablic liczb int, double - o tyle praca z C-stringami wymaga
skupienia.

W zasadzie w ięc mógłbym o tablicach znakowych nic nie wspominać, ale jest
kilka pow odów , dla których, mimo wszystko, będziem y o tym rozmawiać.
♦> 1) Tablice znakowe bardzo dobrze się przydają do nauczenia się popra­
wnej pracy z tablicami w ogóle.
Łatwiej się rozwiązuje problem, gdy się myśli o tablicy c h a r , w której w
poszczególnych elementach są litery ze zdania " S r e b r n e d a c h y
K rakow a ", niż gdy się myśli o tablicy do u b l e, która zawiera w poszcze­
gólnych elementach liczby 4 3 . 7 , 1 2 . 8 , 1 6 . 4 , 8 1 . 5
♦♦♦ 2) M imo że są lepsze, now sze sposoby - dotychczasowy sposób postępo­
wania z C-stringami (pochodzący jeszcze z języka C) jest nadal aktual­
ny, w ięc m ożesz się z tymi sposobami wielokrotnie spotkać w cudzych
programach.
♦> 3)Klasa string, tok/asa-aoklasach jeszcze nie rozmawialiśmy. Zatem
z wprowadzeniem tego zagadnienia wstrzymamy się do czasu, gdy
jasne będą różne pojęcia z dziedziny klas. W tedy pożegnamy się z

240 Rozdz. 7. Tablice
Tablice wielowymiarowe

niewygodnym sposobem trzymania łańcuchów znaków w tablicach
znakowych.

Czyli na razie będziemy to robić tak, jak to się robiło jeszcze w klasycznym
języku C.

7.6 Tablice wielowymiarowe
Tablice można tworzyć z bardzo różnych typów obiektów. Widzieliśmy już
tablice z liczb całkowitych, zmiennoprzecinkowych, tablice znaków.
Mogą być także tablice, których elementami są inne tablice. Nazywamy je
tablicami wielowymiarowymi. Oto przykład takiej tablicy:
int ddd[4][2];
Definicję tę, która jest przy okazji deklaracją, czytamy tak: ddd jest tablicą 4
elementów, z których każdy jest dwuelementową tablicą liczb typu int.
Zauważ charakterystyczną notację. W innych językach często stosuje się zapis
typu [i, j] - u nas jest [i][j]. Można myśleć o tym, jako o zwykłej odmienności
notacji. Można też twierdzić, że zapis ddd [ i] [ j] pozwala lepiej pamiętać, że
ddd to tablica tablic. Czasem ten punkt widzenia się przydaje. Wkrótce się
przekonasz.
E w en tu aln y b łę d n y zapis d d d [ i , j ] ko m p ilato r wykryje, b o w takiej definicji,
w klam rach [ ] ko m p ilato r spodziew a się stałego w y rażen ia.
Dla dociekliwych:
W wyrażeniach stałych nie może być na przykład wywołania funkcji, albo
przecinka.
Przypominam jakie ma działanie operator'/ (przecinek): wartością ury ra­
żenia złożonego z kilku członów oddzielonych przecinkami jest wartość
tego członu, który stoi najbardziej z prawej.
Nasza tablica ddd [ 4 ] [2] jest dwuwymiarowa. Czasem o takiej tablicy mówi
się, że ma 4 rzędy (4 wiersze) i 2 kolumny.
P oszczególne elem en ty naszej tablicy to:
ddd[ 0 ] [ 0 ] ddd[0][1]
dd d [11 10] ddd[13 [1]
dd d [ 2 ] [ 0 ] ddd[2][1]
dd d [ 3 ] [ 0 ] ddd[3J[1]

Rozdział. 7. Tablice 241
Tablice wielowymiarowe

Wyrażenia te oznaczają wszystkie elementy tej tablicy*.

Elementy tablicy wielowymiarowej um ieszczane są kolejno w pa­
mięci komputera tak, że najszybciej zmienia się najbardziej skrajny
prawy indeks.
Oznacza to po porostu, że tablica przechowywana jest "rzędami".
Zatem poniższa inicjalizacja zbiorcza:
int ddd[4][2] = { 10, 20, 30, 40, 50, 60, 70, 80 };

spowoduje, ż e elementom tej tablicy zostaną przypisane wartości początkowe
tak, jakbyśmy to robili grupą instrukcji:
d d d [0][0] = 10;
d d d [0][1] = 20;
d d d [1] [0 ] = 30;
d d d [1 ][ 1 ] = 40;
d d d [2] [0 ] = 50;
d d d [2] [1] = 60;
d d d [3][0] = 70;
d d d [3][1] = 80;

Oto przykład programu:
Załóżmy, że m am y nasze dane pomiarowe w postaci tablicy 8192 elementów.
Takich pom iarów mamy cztery, dla czterech różnych próbek. Zapisane są te
dane na dysku w postaci pliku. Uruchamiamy program i wczytujemy te dane do
tablicy wielowymiarowej
long widmo[4][8192];
Jak to robimy, to na razie tajemnica, o szczegółach operacji z plikami porozma­
wiamy w osobnym rozdziale. Teraz tę akcję markujemy jedynie wywołaniem
funkcji w c z y t a j _ d a n e .
0 co nam chodzi w tym programie? Załóżmy, że między elementem tablicy o
indeksie 500, a elementem o indeksie 540 - zebrały się dane z interesującej nas
reakcji. Chcemy w ięc zsumować wszystkie liczby zapisane od elementu o
indeksie 500 do elementu o indeksie 540. Chcemy to zrobić dla każdego z
czterech pom iarów
#include <iostream>
using namespace std;
void wczytaj_dane();
Z *************************************************************/
int main()
1

2) Jeśli w takich wyrażeniach pomylisz się i np. zam iast ddd [2] [ 1 ] napiszesz ddd [2,1]
to kompilator uzna to za poprawny zapis, tak jakbyś napisał ddd [ 1 ] . (Takie jest przedeż
działanie przecinka). Sam zapis ddd [ 1 ] nie jest błędny, ale często kontekst wystąpienia
takiego wyrażenia będzie błędny. To właśnie może wykryć kompilator.

242 Rozdz. 7. Tablice
Tablice wielowymiarowe

long widmo[4][2048];
// tajemnicza funkcja, która wczyta z dysku cztery
// zestawy wyriików pomiarowych i dane te umieści w tablicy widmo
wczytaj_dane();
cout « "Jaki przedział widma ma byc integrowany ?\n"
« "podaj dwie liczby: ";
int pocz, koniec;
cin » pocz » koniec;
//— P° 4 ró żn ych p ró b k a c h
for(int pomiar = 0 ; pomiar < 4 ; pomiar ++) II V
1
long suma = 0; . . .. . ....
//— p ę tla m t e g r u j ą c a d a n e je d n e ] p r ó b k i
for(int i = pocz ; i <= koniec ; i++) II &

* suma += widmo[pomiar][i]; II ©

cout « "\nW próbce "« pomiar
<< " miedzy kanałami "
<< pocz « " a " « koniec <<" jest ”
« suma « " zliczeń"; // O
} // koniec pętli po 4 pomiarach
}
**********************************■*************************/
void wczytaj_dane{)
I
H... wczytywanie danych z dysku

Po wykonaniu programu (zależnie od odpowiedzi na pytania]
możemy na ekranie otrzymać na przykład następujący tekst:
Jaki przedział widma ma byc integrowany ?
podaj dwie liczby: 50 75
W próbce 0miedzy kanałami 50 a 75 jest 493 zliczeń
W próbce 1miedzy kanałami 50 a 75 jest 392 zliczeń
W próbce 2miedzy kanałami 50 a 75 jest 300 zliczeń
W próbce 3miedzy kanałami 50 a 75 jest 172 zliczeń

Uwagi
O P oniew aż w p ro g ram ie m am y w ykonać identyczną akcję n a 4 ró żn y ch próbkach
dlateg o w y g o d n ie posłużyć się pętlą.
© W d an y ch p o m iaro w y ch danej p róbki sum ujem y kolejne elem en ty (sąsiednie
kanały). O ty m , która część wi dma m a zostać p o d d an a takiej operacji, zad ecy d o ­
w aliśm y o d p o w iad ając na pytania o początek i koniec.
© Jest to m o m en t su m o w an ia elem entów tablicy. Jeśli jeszcze n ie osw oiłeś się z
operato rem += to m oże wolisz taki, ró w n o w ażn y tam tem u zap is
suma = suma + widmo[pomiar][i];

Rozdział. 7. Tablice 243
Tablice wielowymiarowe

O To jest m o m en t w y p isan ia w yniku na ekran.

W
Jak w id zisz, nie m a w tablicach d w u - i w ielow ym iarow ych niczego n ad zw y ­
czajnego an i tru d n eg o . D om yślasz się chyba też, jak k o m p u te r oblicza sobie,
gdzie w pam ięci je st d an y elem ent tablicy.
Jak już w iem y, w pam ięci elem enty u staw ian e są kolejno tak, że najczęściej
zm ienia się najbardziej skrajny indeks. Z naczy to, że w naszej tablicy:
long widmo[4] [2048];
elem ent widmo [ 1 ] [ 3 ] leży w sto su n k u do początku tablicy o tyle elem entów
dalej
(1 * 2048) + 3
widmo fil f j]
ogólniej, elem en t z tablicy o liczbie k o lu m n 2048 leży o
(i * 2048) + j
elem entów dalej n iż początkow y. To b ard zo w ażn y w niosek. Jak w idzisz d o
orientacji w naszej tablicy kom pilator p otrzebuje znać liczbę jej kolum n, nato­
m iast w cale nie m u si używ ać liczby w ierszy.
Ja bym sobie w takich stw ierdzeniach n aw et nie zaw racał gło w y w ierszam i i
kolum nam i. M o żn a to prościej zap am iętać tak:
I Ten w y m iar, który w definicji tablicy jest najbardziej z lewej
lo n g widmo [ 4 ] [ 2 04 G] ; // u itas to liczba 4

nie jest potrzebny k o m pilatorow i do obliczania położenia (adresu)
elem en tó w tablicy.
Z w ykle o takich sp raw ach nie m usim y w ogóle w iedzieć, k aże m y zrobić op era­
cję na w y b ran y m elem encie [ i ] [ j ] , a jak sobie to k o m p u ter załatw ia - to już
jego spraw a. Jeśli jednak jest się tego św iadom ym , to łatw iej zrozum ieć, jak
przekazuje się d o funkcji tablice w ielow ym iarow e.

7.6.1 Typ wyrażeń związanych z tablicą w ielow ym iarow ą
Najpierw przypomnienie
Definicja takiej n a p rzy k ład tablicy:
in t ta b l[« );

jest oczyw iście rów nocześnie deklaracją tej nazw y t a b l . N a pierw szej stronie
tego rozdziału m ów iliśm y jakiego ty p u jest taka nazw a t a b l .
Pytanie kontrolne: Potrafiłbyś to teraz w ypow iedzieć?
Innym i słow y: g d zieś w program ie m o że w ielokrotnie pojaw ić się w yrażenie
t a b l — jakiego jest typu jest to w yrażenie?
O dpow iedź:

244 Rozdz. 7. Tablice
Tablice wielowymiarowe

T y p w y ra ż e n ia t a b l to:
I T ab lica n e le m e n tó w (z których każdy jest) ty p u i n t .
N astępne pytanie, również kontrolne, bo mówiliśmy o tym niedawno. W
programie wielokrotnie m ożem y posługiw ać się elementami tej tablicy. Na
przykład jeśli chodzi o elem ent piąty, to oznacza go wyrażenie t a b l [ 5 ] .
Jakiego typu jest wyrażenie tabl [5 ] ?
Odpowiedź:
Jest to w y ra ż e n ie o zn aczające je d e n (5-ty) elem en t tej tablicy, a skoro jes
to tab lica elementów typu i n t , w ięc ty p em tego w y ra ż e n ia jest w łaśni*
in t.
K oniec p rz y p o m n ie n ia .

P r z e jd ź m y te r a z d o ś w ia ta ta b lic w ie lo w y m ia ro w y c h
Wyobraźmy sobie taką tablicę
int ttt[15][31;
W id z im y że je st to tablica d w u w y m ia ro w a o w y m iarach 15 rz ę d ó w (w ierszy)
3 k o lu m n J e d n a k tak n a p ra w d ę w języ k u C++ nie m a t a b l i c d w u w y m ia ro w y c h
Są tablice tablic. Z atem m o że lepiej p o w in n iśm y p o w ied zieć, że:
( m a m y d o czy n ien ia z 1 5 -elem en to w ą tab licą, w której k ażd y
| e le m e n t jest 3 -e le m e n to w ą tablicą o b iek tó w ty p u i n t .
Obrazek dla najmłodszych czytelników: Wyobraźmy sobie, że t t t to jest t<
wąska szafa na książki, z 15 półkami. Szafa jest tak wąska, że na póło
mieszczą się tylko trzy tomy. Książki są cenne, więc każda książka na póło
ma suroją przegródkę. J
W programie wielokrotnie m ożem y spotkać się z takimi (podstawowymi
wyrażeniam i używającymi tej nazwy:
ttt ttt[i) ttt[i][j]
N ie c h o d zi tu o deklaracje, ale sytuacje, g d zie już p o słu g u je m y się tą tablicą
Z a sta n ó w m y się jakiego ty p u są te w y rażen ia. Z eb rałem to w tabelkę:

W y raż en ie w-to T yp tego w y ra ż• e n ia

Tablica 1 5 -eIem en to w a, elem en tó w
Tablica t t t będących tab licam i 3 -ele m en to w y -
!ttt
m i obiektów ty p u i n t .

i-ty rząd tablicy Tablica 3 -e le m e n to w a ob iek tó w
t t t [l] ttt ty p u i n t .

Jeden elem ent
O biekt ty p u i n t .
l t t t [i] t/3 tablicy t t t
i
i ----------------------

Rozdział. 7. Tablice 245
Tablice wielowymiarowe

Teraz nie jest m o że d la Ciebie tak b ard zo jasne, dlaczego to jest w ażne. O każe się
dopiero, g d y zajm iem y się w sk aźn ik am i p o kazującym i na tablice
w ielo w y m iaro w e.

Dla najmłodszych czytelników - kontynuacja obrazka z szafą
P rzypom inam , ż e rozm aw iam y o takiej na przykład tablicy..., p rzep raszam -
szafie na tom y (w olum iny) książek
tom t t t [ 1 5 ] [ 3 ] ;
O to w yjaśnienie w spom nianych w yżej w yrażeń, zebrane w p o d o b n ą tabelkę:

1" - ' '
O p is T y p ^ "Y ^ ; ;

i V; szafa t t t
Szafa 15-półkow a, k ażd a pólka jest
1 ttt zestaw em 3 p rzeg ró d ek na tom y

---- --'------------
!
To, co jest szafie
Z estaw 3 przegródek na poszczególne
t t t [i] t t t , na i-tej półce
tom y.
'i ____________________________________ 1
to, co jest w /-tej
p rzeg ró d ce, na
t t t [i] [/] Jeden tom.
i-tej półce w
szafie t t t

Z auw aż, co się stan ie, jeśli zam iast w y rażen ia odnoszącego się do drugiego
tom u na siódm ej p ó łce
t t t [ 7 )[2 ]

p rzez pom yłkę nap iszem y
t t t [7, 2]
D ziałanie o p erato ra przecinek jest takie, że zrozum ie on to w yrażenie jako:
t t t [2]
a to oznacza d ru g ą półkę. Jest to w y rażen ie popraw ne. Z tym , że najp raw d o p o ­
dobniej w ystąpi o n o w sytuacji, odpow iedniej dla tom u, a nic dla półki. To
w łaśnie m oże w y k ry ć kom pilator i nas ostrzec.
Takie błędy grożą C i tylko na w stęp n y m etapie nauki C++.

7.6.2 Przesyłanie tablic wielowym iarowych do funkcji
Ten tytuł m oże tro ch ę mylić. Tablice, jako całość, nigdy nie są przekazyw ane. To
m iędzy innym i d lateg o , że w p rzy p ad k u takiej tablicy:
long widmo[4 ) [ 8 1 9 2 ] ;

246 Rozdz. 7. Tablice
Tablice wielowymiarowe

m u sie lib y śm y d o funkcji p rzesłać 4 * 8192 = ok. 32 ty sią ce liczb (a k a ż d a je st np. 4
bajtow a).

Wiemy już, że tablice przekazuje się w ten sposób, iż przesyłamy do funkcji
tylko adres początku.
Jak p a m ię ta m y - n azw a tablicy je st ró w n o cześn ie a d re s e m jej p o czą tk u - więc
d o h ip o tety cz n ej funkcji f u n p rz e s y ła m y ją tak:
fu n (w id m o );

A teraz przyjrzyjmy się jak ją (tablicę) odbieramy w funkcji.
Z an im je d n a k to p o k ażem y , u św ia d o m ijm y sobie, co fu n k cja m u si o n asze
tablicy w ie d z ie ć
p o p ie rw sz e - o czyw iście ty p elem en tó w tej ta b licy (czy f l o a t , czy
c h a r itd),
p o d r u g ie - ab y funkcja m o g ła ła tw o obliczać so b ie, g d z ie w p am ięci jes-
o k re ś lo n y elem en t tab licy —
na przykład: gdzie w stosunku do początku tablicy jest element [1][15])
- m u s i zn ać liczbę k o lu m n w tej tablicy.
D eklaracja tak iej funkcji w y g lą d a tak:
v o id f u n (lo n g t [ ] [8192] );
p o d a n a jest w niej liczba k o lu m n tej tablicy, którą fu n k c ja b ę d z ie o trz y m y w a ć
O czyw iście d ek laracja
v o id f u n ( l o n g t [ 4 ] [ 8 1 9 2 ] ) ;
jest tak s a m o d o b ra, ale z liczby w ie rsz y (tutaj 4) fu n k c ja n ie k orzysta.

Więcej wymiarów
P rzez a n a lo g ię łatw o ch y b a się d o m y ślisz , ż e w p r z y p a d k u fu nkcji o trzy m u jąc e
tablicę tró jw y m ia ro w ą - d e k laracja takiej funkcji m o ż e w y g lą d a ć na p rzy k łac
tak:
v o id f u n _ t r z y ( l o n g m[] [2 0 ] [100] );

a c z te ro w y m ia ro w e j
v o id f u n _ c z t e r y ( lo n g x [ ] [ 2 ] [ 1 2 ] [ 3 6 5 ] ) ;

T y lk o le w e g o sk rajn eg o ro z m ia ru nie trz e b a d e k la ro w a ć , b o i tak nie b ierze oi
u d z ia łu w o b liczan iu pozycji ż ą d a n e g o elem en tu w p am ięci.
C ały te n p a r a g r a f n ie słu ży p o to , b y Cię zniechęcić d o p o d a w a n ia w d ek laracj
teg o le w e g o s k ra jn e g o w y m ia ru . Jest p o to, byś w ie d z ia ł d la c z e g o deklaracja
v o id f f f ( l o n g m [] [ ] [ ] ) ; II błąd

jest b łę d n a , a d ek laracja
v o id g g g ( lo n g z [ ] ) ;

Rozdział. 7. Tablice 247
Ćwiczenia

jest p o p raw n a.

Tablice to d o ść p ro ste pojęcie. N iestety - trzeba tu pam iętać o p a ru rzeczach. Na
przykład - by n ie um ieścić czegoś w elem encie, który nie istnieje, albo o tym , że
taka tablica jest m a stałe rozm iary, nie m ożem y jej pow iększyć, jeśli
doch o d zim y d o w niosku, że p raw ie n am się zapełniła.

W bibliotece standardowej C++ um ieszczono więc definicje nowych typów
(tzw. klas), które nie tylko imitują tablice, ale mają pewien rodzaj inteligencji.
Dbają m ianow icie o to, byśmy z nimi pracowali poprawnie.
** M •' l^W*1»iim*n***9i*i*0m*itxi**a*c*KtM M 11riri*fr1’W-*' W M M M M M I

No przykład właśnie sprawdzają, czy nie wpisujemy czegoś do nieistnie­
jącego elementu. Także pozwalają na to, by taka "mądrzejsza" tablica samo­
dzielnie się powiększyła, gdy zajdzie taka konieczność.
Z anim jed n ak zaczniesz korzystać z takich u d o g o d n ie ń m usisz um ieć
posługiw ać się zw ykłym i, poczciw ym i tablicami.

N a tym kończy się rozd ział o tablicach, ale nie rozstajem y się z tą tem atyką,
bow iem n a stę p n y rozd ział m ów ił b ęd zie o w skaźnikach, co m ocno jest zw iąza­
ne z tem atyką tablic.

7.1 Ć w ic ze n ia
Czym się różni tablica 10 elementów typu int , od 10 obiektów typu int?
Czy można utworzyć tablicę 20 obiektów, z których pierwsze 10 będzie typu int, a
następne 10 typu unsigned int?
Mamy tablicę
unsigned in t tab[200);

Przeczytaj tę deklarację. Jakiego typu obiekt oznacza nazwa t a b ?
Czy poprawne są poniższe definicje:
a) double wspolcz (5.6];
b) dou b le fact[0 ];
cj sign ed in t nom in[-6];

Czy poprawna jest definicja tablicy:
int rozmiar = 10;
char tabl[rozmiar];
Napisz definicję tablicy dwunastu elementów typu d o u b l e .
Czy poprawna jest następująca definicja?

248 Rozdz. 7. Tablice
Ćwiczenia

void
v o i u t a b i[237];
-- ' ■
w definicje typu wyliczeniowego ru c h , który będzie przyjmował trzy wartości
Napisz de w t ]J 1tysPto p yNastępnie napisz definicję tablicy 15 elementów takiego typu.
J ^ te j definicji, za pomocą inicjalizaqi zbiorczej nadaj pierwszym pięciu elementom
tablicy jakieś wartości.
Mamy definicję tablicy, w której można przechować tekst:

char a l f a b e t [3 0 ];
_ • I^mniitera zbudowana jest tak, że jej elementarne bity przyjmują tylko wartości
0 1 ™ Jak £ więc możliwe, te tworzymy tablice, w które, można przechować litery?
Co to jest znak n u l i ; po co jest potrzebny, skoro nie ma go w zwykłym alfabecie?
Napisz definicje tablicy 14 znaków, która od razu inicjalizowana jest C-stringiem

t o p ^ d ^ e tablicy 3 znaków, która od razu inicjalizowana jest odrębnymi znakami
'x', ' y ', ' z ' •
Ile elem entów ma tak zdefiniowana tablica

char ta b [] = ( "123" ło­
jaka jest długość stringu w powyższej tablicy?
Czym się różni długość stringu od rozmiaru stringu?
Które z poniższych instrukcji są popraw ne7

n) c h a r t a b l [ 4 ] = 1 " 1 ,2 , 3 " };
W Sar tab2{] - j M; 2. >«,c.
c) char t_ab3[3] - ł A , b , c j,

XVI Mamy tablicę
char tablllO] = ł "ABCD" );
Czy poprawne są następujące instrukcje korzystające z tej tablicy?

a) t a b l[ 6 1 = 'm ';
b) t a b l [10] = ( "GGGG" ) ;
c) t a b l [0 ] = 1 ;'GGGG" 1;

ej tabl [ 1 - ' a '
f) tabl = '7 ';
g) tabl = "7"
Mamy dwie tablice znakowe o identycznej długoSci, W jednej z nich znajduje sie

m S i r fankcie która przekopiuje codrugą literę z jędnęj tablicy do drugiej. To znaczy:
jeśli*w jednejtablicy jest tekst •' instytut ", to w drugiej powinien sięznalezc C-sh-ing

"‘ ^ “ tablice znaków, w której znajduje sie długi C-string będący tekstem, składającym
Tw.lkun.istu wyrazów. Napisz funkcje, która przekopiuje ten C-stnng do dwóch
S1? h tablic W tablicy p arzy ste znaleźć mają sie parzyste wyrazy C-stringu a w
"T,y i T io a r z y s t e - nieparzyste wyrazy C-stringu. W obu docelowych tablicach
wyrazyntiąbyćoddzielone odstępami (spacjami), czyli znakami ■ ■. Funkqa ta ma byc
wywoływana z trzema argumentami:

Rozdział. 7. Tablice 249
Ćwiczenia

- adres tablicy źródłowej,
- adres tablicy na wyrazy parzyste,
- adres tablicy na wyrazy nieparzyste.
Wyjaśnij, jakie ryzyko niesie w sobie instrukcja przypisania umieszczona w ciele
poniższej pętli f o r .
char A [10];
char Z [10J;
// ...
for(int i = 0 i < 10 ; )
{
A[i++] — Z [i++];
1
Czy poprawne jest poniższe wyrażenie warunkowe w instrukcji i f

int a [10], b [10];
/ / ...
if(a[61 = b [8])
{
cout << "Tekst";
}
Jakie musiały by być elementy tablic, aby na ekranie pojawił się powyższy tekst?
Mamy dwie tablice

char tl[] = "Litwo, ojczyzno moja";
char t2[] * "ABC";
char t3[] - "123456789012345678901234567890";

Czy można string z tablicy tl przepisać do tablicy t2 ? Czy można string z tablicy t l
przepisać do tablicy t3 ?
Czy w funkcji, do której wysłano tablicę, można dowiedzieć się ile ma ona elementów?
Napisz funkcję, która do końca stringu będącego w jednej tablicy, dołączy string, będący
w drugiej tablicy. Argumentami tej funkcji powinny być
- adres tablicy docelowej,
- jej rozmiar,
- adres tablicy ze stringiem dołączanym.
Funkcja powinna przerwać dołączanie stringu w przypadku zapełnienia całej tablicy.
Napisz definicję tablicy 5 elementowej, której elementami są tablice 2 elementów typu
float.
Mamy definicję

char [4][2][2];

Wypisz wszystkie elementy typu (cha r) tej tablicy w kolejności, w jakiej umieszczone są
w pamięci komputera.
Napisz program, w którym będzie tablica dwuwymiarowa o rozmiarach: 10 rzędów i 3
kolumny.
Do elementów zerowej kolumny załaduj kolejne liczby naturalne (i), do elementów
następnej kolumny załaduj ich kwadraty (i*i), a do następnej sześciany (i*i*i).
Wypisz zawartość tej tablicy na ekranie - właśnie w postaci trzech pionowych kolumn.

250 Rozdz. 7. Tablice
Ćwiczenia

X XV II Zdefiniowaliśmy tablicę

double t a b [10][5][30];
Które z rozmiarów tej tablicy są niezbędne do tego, by kompilator mógł obliczyć pozycję
w pamięci jakiegoś z elementów tej tablicy? Jak myślisz, po co zatem potrzebny jest ten
rozmiar, który nie jest konieczny do obliczania adresu elementów?
Zdefiniowaliśmy tablice
double tab[10][5][30];

W tekście program u mogą pojawić się na przykład następujące wyrażenia związane z tą
tablicą.
t a b [ U [0][1]/ t a b [6][4], tab[l], tab

Wyjaśnij co one oznaczają.
W programie mamy tablicę

double t a b [10][5][30];
Napisz funkcję, do która wyzeruje wszystkie elementy tej tablicy
W układzie pomiarowym eksperymentu fizycznego dane przychodzą z 4 niezależnych
kanałów o umownych nazwach FRS, GER, HEC, DGF. W trakcie pomiaru robiona jest
statystyka równoczesności wystąpienia (czyli koincydencji) tych sygnałów. Polega to na
tym, że jest tablica jednowymiarowa, w której kolejne elementy odpowiadają
odpowiednim kombinacjom tych sygnałów. To znaczy na przykład element 3
odpowiada równoczesności sygnałów kanałach FRS i GER. Element 15 odpowiada
równoczesności sygnałów FRS, GER, HEC, DGF.
Oto odpowiednie kombinacje zebrane w tabelkę

K om binacja sygnałów bin arn ie nr
elem entu
DGF H EC GER FRS
tablicy
0 0 0 0 0000 0
'i
0 0 0 1 0001 1
0 0 1 0 0010 2

0 0 1 1 0011 3

0 1 0 0 0100 4

0 1 0 1 0101 ... - 5 - - - !,
0 1 1 0 0110 _____ 6_____ i!
0 1 1 1 0111 7

1 0 0 0 1000 8
1 0 0 1 1001 9
1 0 1 0 1010 10
1 0 1 1 ! 1011 n

Rozdział. 7. Tablice 251
Ćwiczenia

]1

Zasada jest prosta - każdy sygnał ma jakby "swój" bit w nu m erze elementu. Obecność
tego sygnału u staw ia ten bit na 1, brak sygnału ustawia na 0. Po spraw dzeniu obecności
lub nieobecności w szystkich 4 sygn ałów powstaje słow o, będące num erem elem entu w
tablicy statystyki.
Skoro taka kombinacja w łaśnie w ystąpiła to tenże elem ent tablicy poddaw any jest
inkrementacji. (C zyli będący tam licznik takich sytuacji p o d w y ższa n y jest o jeden).
To tyle tytułem w stępu .
Załóżm y, ż e p om iar trwa już jakiś czas i w tablicy są już jakieś liczb y określające ile razy
poszczególne kom binacje w ystąpiły w ciągu tego czasu.
Teraz w ła ś c iw e zadanie: napisz funkcję, która tę statystykę w y św ietli na ekranie w taki
mniej w ięcej sp o só b (wartości liczbow e są przykładowe)
Poszcz e g ó l n e kombinacje wystąpiły następująca ilosc razy
K o m b i n a c j a : FR S -> 346 r a z y
Kombinacja: GER -> 652 r a z y
K o m b i n a c j a : FRS + G E R -> 7 3 7 razy
Kombinacja: HEC -> 277 r a z y
K o m b i n a c j a : FRS + HEC - > 4 44 r a z y

... itd a ż d o k o m b in a c ji F R S + G E R + HEC + D G F ...

Jak w id zisz, jest to w ypisanie kolejnych elem entów tablicy, z tym że temu w ypisow i
tow arzyszy opis kombinacji sygnałów . G dyby jakaś kombinacja nie wystąpiła ani raz,
(wartość = 0) w ó w c z a s oczyw iście takiej linii statystyki nie w ypisujem y.
Uwaga- Ten sym boliczny opis kombinacji (np. "F R S + H E C + DGF') musi być konstruo­
wany na bieżąco na podstaw ie analizy numeru elem entu tablicy, który właśnie
w ypisujem y. O p is ten nie m oże być w ięc "zaszyty" na stałe w program ie. (Wyobraź sobie,
że m am y nie 4 sygn ały, ale 10 - m usiałbyś wtedy przygotow ać 1024 takich gotow ych
tekstów).
Zatem Twoje za d a n ie polega na tym, byś wypisując np. d w u n asty elem ent tablicy,
potrafił opisać g o na ekranie podając n azw y odpowiednich sygn ałów .
Gdy napiszesz tę funkcję i będzie działała poprawnie - pojawia się jeszcze jedno życzenie
eksperym entatora.
Chciałby on m ianow icie, aby w ypisyw an e na ekranie kombinacje pojawiały się nie tak,
jak są u m ieszczo n e w tablicy (po kolei), ale począw szy od najbardziej skom plikowanych
kombinacji do najprostszych. Czyli by najpierw wypisana została linijka ze statystyką
kombinacji 4 sy g n a łó w , następnie linijki z różnymi kombinacjami 3 sygnałów , potem z
kombinacjami 2 sygnałów , a na końcu wystąpienia sygnałów pojedynczych.
Czyli na przykład tak

252 Rozdz. 7. Tablice
Ćwiczenia

Poszczególne kombinacje wystąpiły następująca ilosc razy
Kombinacja: FRS + GER + FRS + DGF -> 346 razy
Kombinacja: FRS+ GER + FRS -> 652 razy
Kombinacja: FRS + GER + DGF -> 737 razy
Kombinacja: FRS + HEC + DGF -> 277 razy
Kombinacja: GER'+ HEC + DGF -> 444 razy

... i t d a ż d o k o m b i n a c ji F R S ( p o j e d y n c z e j ) ...

że masz w ręce bardzo gruby rozkład jazdy. Moim zdaniem to dlatego. Otwierasz więc rozkład jazdy i szukasz przewracając strony. że jest wiele języków programowania. Wtedy ten ktoś pyta: „-A następny?". W skaźniki 253 W skaźniki mogą bardzo ułatwić życie 8 Wskaźniki apytano kiedyś Amerykanów: „-Czy można. najlepszy dowód. Ktoś pyta Cię o pociąg z Paryża do Marsylii. przewra­ casz strony. potem znowu przebiegasz kolumny i. Wreszcie po dłuższym czasie trafiasz na właściwą stronę i przebiegając palcem kolumny cyfr znajdujesz to. 8. to zachęcam do przeczytania. Dumnym głosem mówisz .1 W skaźn iki m o g ą b ardzo u ła tw ić życie Do rzeczy: Wyobraź sobie. to w zasadzie mógłbyś ten rozdział opuścić. trafiasz na właściwą.9:26 i zamykasz rozkład z trzaskiem.jeśli języki C i C++ mają opinię tak sprawnych i władnych . Z Amerykanie odpowiedzieli: „-Można. Ich istnienie nie jest konieczne. to jest to głównie za sprawą wskaźników. w których wskaźników nie ma. ale po co?". jest! 13:50 1) Chdałoby się powiedzieć po angielsku: powerjul . Są ludzie. czego szuka­ łeś.Rozdział. Jeśli doskonale znasz język C. którzy nie lubią C. że nie czują się swobodnie w operowaniu wskaźnikami.. Bierzesz znowu rozkład jazdy. a książkę tę czytasz. żyć bez Coca-Coli?". Jeśli jednak wskaźniki znasz trochę gorzej. 8. Dokładnie to samo można powiedzieć o wskaźnikach. by poznać C++. Taki na 600 stron. Z drugiej jednak strony ..

P o d a n y p rz y k ła d ilu stru je ż y c ie ze w sk aźn ik am i i bez. zaz n a c z y liśm y so b ie p alcem to m iejsce i d o p ie ro w te d y p rz y m k n ę liśm y k siążk ę.j e s t to jakby o d c z y ta n ie liczby będącej treścią e le m e n tu n aszej tablicy.. Tutaj.?" .b ły sk aw icz n ie p rz e s u n ie s z p alec o jed n ą k o lu m n ę w p ra w o i o d c z y ta s z go d zin ę. m a m y d u ż o w ięcej w y m iaró w . a to z ajm u je tro ch ę czasu. to o d c z y ta li­ śm y j e . P a m ię ta s z z a p e w n e z p o p rz e d n ie g o ro z d z ia łu . ch cąc oszczęd zić so b ie d alszej ew e n tu a ln e j p ra c y . D la tam tej d w u w y m ia ro w e j tablicy b y ła to zależność: (i * 8192) + j g d z ie 8192 by ło liczbą k o lu m n tablicy.z d e f in io w a liś m y w sk a ź n ik (w sk a zu jący p a le c p raw ej ręki) i p o d s ta w iliś m y d o n iego w a rto ść p o c z ą tk o w ą .. W ted y . Z n o w u n a tru d z iliśm y się w ielce p o w ta rz a ją c ten p roces. o k tó ry pociąg w ciągu d o b y n am ch o d zi (w ciągu d o b y m ogą b o w ie m o d je żd żać d o M arsy lii n p 4 takie pociągi). jak n a le ż y g o p rz e su n ą ć w p rz y p a d k u pytania: „A następny?". ż e teraz jesteś ju ż sp ry tn ie jszy : p o o d p o w ie d z i. O zn acza to .-A następny. ale nie ty lk o : ta k ż e w ie d z a o tym . jak o blicza k o m p ila to r pozycję e lem en tu w sto su n k u d o p o c z ą tk u tablicy. trz y m a s z palec w sk azu jący n a zn alezio n ej g o d zin ie o d ja zd u .254 Rozdz. którymi operujemy w C++ : R o zk ład ja z d y to nic in n e g o jak o lb rzy m ia (w ie lo w y m ia ro w a ) ta b lica liczb. Przetłumaczmy to na język pojęć. n a w sz e lk i w y p a d e k .. w n a s z y m p rz y k ła d z ie z ro z k ła ­ d e m ja z d y .w te d y p rz e s u n ie sz p alec kilka linijek w dół. W n aszy m o b liczan iu b ęd ą aż 3 m n o ż e n ia . N a s tę p n y p o ciąg w naszej ta b licy to pociag[Paryz][Marsylia][wyjazd_z_Paryza][1] O d n o w a w ięc zajęliśm y się o b liczan iem m iejsca w p am ięci. g d z ie z a p isa n a jesl p o s z u k iw a n a inform acja. W skaźniki W skaźniki mogą bardzo ułatwić życie T ylko. S z u k a n ie inform acji o tym p o c ią g u to obliczanie m iejsca w tablicy.a d re s o d czy ­ tan eg o w łaśn ie ele m e n tu tablicy (in n y m i sło w y p rz y sta w iliśm y p alec w sk a zu jąc y ta k . Jeśli z a p y ta C ię „ -A o której on jest w Lyonie?" . by p o k a z y w a ł n a w ła śc iw ą liczb ę na w łaści­ w ej stronie) . a le w reszcie z n a le ź liśm y w łaściw ą in fo rm ację i o d c z y ta liśm y ją. G o d z in a o d ja z d u pociągu z P a ry ż a d o M arsylii to p o p ro s tu ele m e n t tej tablicy pociag[Paryz](Marsylia][wyjazd_z_Paryza][0] O sta tn i in d e k s o zn acza. g d z ie z a p isa ­ na jest ta inform acja. P o tem z a m k n ę liśm y ro z k ła d i w te d y n asz p rzy ja ciel w y g ło sił w s p o m n ia n e słow a: „A następny?". w ięc i o b liczan ie b ę d z ie b ard ziej sk o m p lik o w a n e . 8. Jeśli T w ó j p rz y ja ­ ciel z a p y ta Cię teraz: . C o b y ło w sk a ź n ik ie m w n a sz y m p rz y p a d k u ? Był to T w ój palec. G d y w re sz c ie trafiliśm y w ro z k ła d z ie jazd y na w ła śc iw e m iejsce.

M ało rzeczy m oże tak up ro ścić życie. Treścią w skaźnika jest inform acja o tym . na jakie obiekty może on pokazyw ać. M ożna nim i posłużyć się w obec dow olnej zm iennej. Jest to definicja w skaźnika m ogącego pokazyw ać na obiekty typu int.". Przyjrzyjm y się poniższej definicji int *w. ż e palec m im o w szy stk o tam tkwi. 3. że w skaźnik ten m a służyć d o pokazyw ania na obiekty ty p u int.tut.Rozdział. ale tak.2 Definiowanie w s k a ź n i k ó w W skaźniki nie m uszą koniecznie pokazyw ać na elem enty tablicy. Z ap y tan ie o to. A zatem po w y ższą definicję czytam y na głos: w . jest próbą znalezienia elem entu pociag[Paryz][Marsylia][postoj_w_Lyonie][1] Tutaj w y starczy w iedzieć ile stacji jest m iędzy P aryżem a Lyonem i o tyle linijek p rzesu n ąć palec w dół.. k ied y pociąg jest w Lyonie.. Z aczniem y od takich p rzy k ład ó w . M ożem y bow iem in n y m palcem zaznaczyć sobie inform ację o pociągach z Marsylii do A vignon. M oże być więcej niż jeden w sk aźn ik pracujący na naszej tablicy. N a w id o k gw iazdki m ów im y słowa: „jest wskaźnikiem do pokazywania na obiekty typu. bez gw iazdki. wobec d o w o ln eg o obiektu.jest w skaźnikiem d o pok azy w an ia na obiekty typu . że to coś. gdzie w skazyw any obiekt się znajduje. . W skaźniki 255 Definiowanie wskaźników K siążkę przy m k n ęliśm y . od razu o tw orzylibyśm y rozkład na w łaściw ej stronie.. Samo w. o n azw ie w . to nie uw ierzę. ii iwirionnuu i nuwirjmirM i^M iiniw■wwHiminnn mnrmrtthtut. Słowo int m ó w i. ż e p o s łu g iw a n ie się w s k a ź n ik ie m b a rd z o p rz y s p ie s z a o p e ra c je na ta b lic a c h . m ów i tylko. Słowo int w tej definicji inform uje nas. który inform uje nas. Kiedy n a sz przyjaciel zap y tałb y nas o n astęp n y pociąg. Jeśli nam nie w ystarczy palców zorganizujem y sobie zakładki. Definicję taką odczytujem y jak zw ykle od końca. Błyskaw iczny ruch palca w p raw o i ju ż wiem y. J a k i je s t w n io s e k z te j d y k te ry jk i? T a k i. Innym i słow y: w tym w skaźniku w m ożem y p rzech o w y w ać adres jakiegoś obiektu typu i n t . że nie lubi w skaźników . W definicji w idzisz znak ' * '. K© Nasz w skaźnik nazyw a się w. Z akła­ dek takich m ożem y mieć d ow olnie dużo. Jeśli po tym ktoś mi pow ie. . G w iazd k a zaś.int.jest w skaźnikiem . że m am y tu do czynienia ze w skaźnikiem . a nie co w tam tym obiekcie się znajduje. 8.

c h a r d o u b l e itd .k ażd y m< sw o ją g w ia z d k ę . bo p rzecież b y ła g w ia z d k a (p rzed o b iek tem w s k l ) . jak b y śm y na lekcję geografii w y s tru g a li w sk a źn ik z d rew n a i p o ło ży li go na boku. T ak że nie m oże być w sk a ź n ik ó w d o p o je d y n czy ch b itó w jak ieg o ś słow a . d lateg o w ięc n ie m o ż e byc d o m ej w skaźn ik ó w . *w sk2. że to t je st tablicą. in t * w s k l. ż e w definicji jest p o w ie d z ia n e .256 Rozdz. że w sk a ź n ik p o k a z u je n a o b ie k ty . char * wsk_do_znakow.tzw . a m a o n n a z w ę w s k l . k a ż d a z tab lic m a tu sw oje k la m ry [] . W sw o im - n ig d y tego n ie sto su j.ż< e le m e n tó w t y p u i n t . k tórych ty p y s a m i so b ie w y m y ślim y i zd efin iu jem y ). T ym czasem ta g w ia z d k a jest o so b istą w łasn o ścią obiektu ws k l . b y ś m ó g ł p rz e c z y ta ć taki z a p is w cu d z y m p ro g ra m ie . x . tabl_b[5]. W M o za być w s k a ź n ik i d o o b iek tó w ró żn y ch typów : np. W skaźniki Definiowanie wskaźników P o ró w n a j to z r e s z tą z d efin icją ta b lic y i n t 115] . N a w ia sy [ ] m ó w ią tylko. i n t . Z o b a c z p o n iżej ta k ą linijkę definicji in t * w s k l. T ab lica n a z y w a się t . z w y k łe g o o b ie k tu i n t o n a z w ie m. k w id z is z . tab lica ta m a nazw * ta b w s k a ź n ik a d o i n t . *w sk2. (a n a w e t d o o b ie k tó w . 7 w róć u w ag ę. R eferenda (p rzezw isk o ) nie jest o b iek tem . z w y k łe g o o b ie k tu i n t o n a z w ie x. to p rzecież jeg o . W naszei definicji stw o rzy liśm y sobie w sk aźn ik . 8. Je st tu d efin icja: ♦♦♦ w s k a ź n ik a d o i n t . p ó l bitow ych (zob. ♦♦♦ sz e śc io e le m e n to w e j tab licy o b ie k tó w ty p u i n t . Jeśli c h c ia łb y ś z d e fin io w a ć w je d n e j linii d w ie tablice lu b d w a w skaźniki. S zczególnie p o czątk u jący m y s ią *e ob iek t m b ę d z ie ta k że w sk a ź n ik ie m . O b iek tu m o n a ju ż nie d o ty c zy . t a b [ 6 ] .to w y d a je się zro zu m iale P o d o b n ie je s t w p rz y p a d k u d e fin io w a n ia d w ó ch w sk a ź n ik ó w . ale nie p o k a z u je on jeszcze n a nir rewelacyjnego. str. a m a o n n a z w ę w sk 2 . 634). To tak. m. M im o ż e w sk aźn ik leży n a b o k u . double * wsk_do_doubleow. r . Z b y t ła tw o o p o m y łk ę. Mao’isatem to . to ro b się to tak: int tabl_a[10]. Jeśli o n tak że ch ciałb y b y ć w sk aźn ik iem -j m u si m ieć sw o ją g w iazd k ę.

dlatego później.m ożem y odnieść się do tego obiektu. hiwiw h iw rur mrw m rim mmii\»i-~frrwtrwrtr-nreirr~r~- Definicja tablicy zawierała klamry int t [5] . Próba ustawienia wskaźnika na obiekt innego. Do takiej operacji służy jednoargumentowy opera­ tor odniesienia się * (gwiazdka). Udostęp­ nia on nam adres obiektu. niewłaściwego typu w ywoła protest kompilatora. że zapis przypomina sposób. Odnieść się do obiektu . w jaki później dany obiekt występuje w wyrażeniach. II d efin icja z w y k łe g o obiektu ty p u i n t z lic zb ą 3 // ustawienie wskaźnika w tak.Jest w tym logika. czy też coś zapisać do niego. „ -Z n o w u g w iazd k a?" . że od tej reguły jest chwalebny wyjątek. by na coś pokazywał. 8. 2 Konkretnie: wskaźnikiem do int nie można pokazywać na double czy C-string.rozumiem jako na przykład: odczytać jego zawartość. ale z tego pokazywania jeszcze nie można się szczycić. //d efin icja w s k a ź n ik a d o o b ie k tó w t y p u int i n t k = 3. na który pokazuje. W skaźniki 257 P raca ze wskaźnikam i koniec zaw sze na coś pokazuje (celuje). . Otóż zapamiętaj sobie złotą myśl: W języku C++ definicje obiektów zapisywane są tak. i n t *w.zap y tasz pew nie . W jfo BARDZO WAŻNA UWAGA: W skaźnik służący do pokazyw ania na obiekty jednego typu nie nadaje się do pokazyw ania na obiekty innego typu. Tak uzyskany adres można przypisać do wskaźnika. Używa się do tego jednoargumentowego operatora &(ampersand). 2) W rozdziale o dziedziczeniu dowiemy się.Rozdział. Praca z e w s k a ź n ik ie m Oto. czyli spra­ wić. klamry oznaczają pracę na tablicy a = t [1 ] . by pokazywał na obiekt k Kiedy wskaźnik już pokazuje na żądane miejsce . który stoi po jego prawej stronie. jak można nadać naszemu wskaźnikowi wartość początkową. w wyrażeniach. II o d c zy ta n ie p ie rw sze g o elem en tu tablicy.„nie za d u ż o tego?" O d p o w iem jednak: .

zmienna = 1 0 . cout « "zmienna = " « zmienna n « "\n a odczytana przez^wskaźnik - << *wskaznik << endl. 8. cout « "zmienna = " << zmienna _ |( << "\n a odczytana przez wskaźnik — << ‘wskaźnik << endl. // wypisz na ekran k Przyjrzyjm y się teraz takiem u pro g ram o w i: finclude <iostream> z /i* * * * * ? * f?* * * * * *^«* ************ *««*«** ****** int maind int zmienna = 8. // wypisz na ekran k cout « *w. to ta w artość p o ja w iła się na ekrara ■I W niosek: p o u staw ien iu w sk a źn ik a o b ie poniższe in stru k cje są rów now ażne cout << k. int *wskaznik. Zatem od tej p o ry co k. Jeśli m am y n asz w sk a źn ik i już u sta­ w im y go na obiekt k. .. cout « "zmienna = "<< zmienna ^ n << "\n a odczytana przez wskaźnik - << ‘wskaźnik << endl. // ustawienie wskaźnika W — &K * ii cout « "w obiekcie pokazywanym przez "wskaźnik w jest wartość " « (**) ’• wykonanie tego fragmentu programu da nam na ekranie W obiekcie pokazywanym przez wskaźnik w jest wartość 3 Słowem: g w ia z d k a kieruje n a s d o ob iek tu p o k azy w an eg o p rzez wskaźnik N asz w sk aźn ik p o k azy w ał na zm ie n n ą k. ‘wskaźnik = 200. to treść p o k a z y w a n e g o obiektu o d c z y tu je się jednoarg m entow ym o p erato rem * * /I definicja wskaźniku •nt k= 3. wskaźnik = &drugi. Skoro zaw arto ścią k b y ła liczba 3. wskaźnik = Szmienna.258 Rozdz. cout << "zmienna = "<< zmienna |f « "\n a odczytana przez wskaźnik - << ‘wskaźnik << endl. W skaźniki P raca ze wskaźnikam i Nie inaczej jest w p rzy p ad k u w sk a ź n ik a . 1/ definicja zmiennej r . drugi = 4. // prosty wypis na ekran.

N astęp n y w y d ru k na ek ran ie pokazuje nam w ięc już liczby 200 i 4. żeb y ś docenił tę historyczną chwilę: O to d o obiektu m o żn a coś w pisać albo u ży w ając jego nazw y (zmienna). że w sk aźn ik cały czas pokazuje na ten obiekt i oczyw iście za u w a ż a zm ianę. Definicję czyta się tak: w s k a ź n i k . oznacza: „d o tego. który n a ten obiekt pokazuje (*ws ka zni k ). w pisz liczbę 200". Ten ad res jest p o d sta w io n y d o w skaźnika o p erato rem p rzy p isan ia = W z a sa d z ie p o w in ie n em napisać linijkę 0 i © razem stosując skrócony zapis. W idzim y n a ekranie d w u k ro tn ie liczbę 200. to zapis "wskaźnik . (Robimy to. Chciałbym.zn o w u w yp isu jem y to na ekran. 200.u zyskującego ad res obiektu zmienna. Skoro w yrażenie *wskaznik oznacza obiekt. © To jest b a rd z o w a ż n a linijka. że w skaźnik zaczy n a pokazyw ać na coś sensow nego. Taki skrócony zapis tych dw óch linijek w y g lą d a tak: i n t * w sk a z n ik = szm ien n a. Tutaj w idzim y ustaw ien ie w sk aźn ik a tak. że to działa . jednak obiecałem sobie nie p rzeraż ać Cie. Poniew aż w sk aźn ik p o k azy w ał na obiekt zmienna. by p o k azy w ał na obiekt drugi. . © Tutaj sp ra w ia m y . na który p o k azu je w skaźnik. w staw iając d o w skaźnika a d re s zm iennej o n azw ie drugi. O W ielokrotnie w trakcie tego p ro g ram u w ypisujem y na e k ran ie w artość tego. na co pokazuje w skaźnik.jest w sk aźn i­ kiem (p rzep rasza m !) do p o k azy w an ia na obiekty typu i n t . © Do zmiennej w p isu jem y now ą w artość. Robim y to za pom ocą o p erato ra & . W skaźniki 259 P raca ze wskaźnikam i Po wykonaniu tego programu na ekranie pojawi się zm ienna = 8 a o d c z y ta n a p rz e z w sk a ź n ik = 8 zm ienna = 10 a o d c z y ta n a p r z e z w sk a ź n ik = 10 zm ienna = 200 a o d c z y ta n a p r z e z w sk a ź n ik = 200 zm ienna = 200 a o d c z y ta n a p r z e z w sk a ź n ik = 4 O Tutaj d efin iu jem y d w a najzw yklejsze obiekty ty p u i n t . to w y rażen ie *wskaznik odnosi się teraz do obiektu drugi. na co po k azu je w sk a źn ik . W u p ro szczen iu to po prostu c o u t << * w s k a z n i k . M ożna go łatw o przestaw ić i od tej p o ry pokazuje na inny obiekt.Rozdział. 8. O d razu inicjalizujem y je w arto ściam i liczbow ym i. N a d o w ó d . O Wskaźnik nie pokazuje raz na zawsze na ten sam obiekt. Liczba dw ieście jest treścią z m i e n n e j . Kolejny w ypis n a ek ran u d o w ad n ia. natom iast skoro w skaźnik pokazuje teraz na obiekt drugi. 0 Tutaj d efin iu jem y w skaźnik. więc do ob iek tu zmienna zostaje w pisan a liczba 200. albo w sk aźn i­ ka. jak w idać.

tak sam o jak słow o ADRES.rrttw <wnamrm . u zn ać za dziecinne.4 L -w a rto ś ć O peracja odniesienia się d o dan eg o obiektu m o że być po praw ej stro n ie znaku (przy p isan ia) a = *wskaznik. 8. d ro g i C zytelniku.. na które pokazuje w a. Mała dygresja o science-fiction K iedyś tłum aczyłem p racę na w skaźnikach m ojem u kilk u n asto letn iem u p rzy ­ jacielow i.*." M asz rację.. p rz e rw a ł m i i zdecydo­ w an ie p o w ied ział kończąc jakąkolw iek dyskusję: „T o proste: g w iazd k a oznacza. p ro g ram jest rzeczyw iście b zd u rn y . w jaki w sk a źn ik a się będzie p o tem u żyw ało. T am m a o n a przypom i nać sposób. w z a sa d z ie w sk aźn ik i m ogły by w nim w ogóle nie istnieć. jak adres obiektu m mi miwjcwt.260 Rozdz. że „g w iaz d o lo t" w ystępuje ty lk o w w y rażen iach . gw ia zd olo te m w miejsce. który na ten obiekt pokaże. K iedy doszliśm y d o zap isu i p ró b o w ałem m u w y tłu m aczy ć. D ru g im skojarzeniem m ojego przyjaciela było.. .. W su m ie m iał on w ięc tak ie regułki: iimitTitiWiiwrun-ttri—rnrr — —. . na które p o k azu je w skaźnik w i d o p ie ro tam tym o biektem n ap raw d ę się zajm ujem y M ożesz to. skoro łatwiej u ż y ć n azw ę tego o b iek tu . że: in nn— rr---- Do danego obiektu m ożna odtąd odnosić się na dwa sposoby: albo przez jego nazwę albo przez zorganizowanie wskaźnika. Zupełnym w y jątk iem jest g w iazd k a w linijce definicji w sk aźn ik a.. 8. ew en tu a ln ie po jego lewej stronie *wskaznik = 55. m iłośnikow i fantastyki naukow ej. ż e je d n o arg u m en to w y operator & .(znaczek ten po an g ielsk u zw an y jest AM PERSAND) zaczy n a się na literę a . C hciałem w nim jednak p o k aza ć. że lecimy g w iazd o lo tem d o m iejsca. W skaźniki L-wartość P om yślisz pew nie: „C o to za b zdurny program ! Po co d o w p isan ia czy o d czy tan ia czegoś z obiektu u ży w ać w skaźnika. ale takie m nem otechniczne skojarzenia b ard zo po m ag ają w początkow ej fazie rozum ienia.■.m r r !mmmtmmm&tKmmmmmmmmmmmmmmmmemm P rzy p o m in am .że g w iazdka oznacza.

m = ‘wskaźnik. to takie „co ś" nazyw am y l-w artością. *wsk_int2. ale nie p o lewej i = 10. N azw a łatw a d o zap am iętan ia.to jest coś w yjątkow ego. L -w arto ść . 3) [czytaj: „el-welju"]. jako ż e stojące po lewej stro n ie 10 nie jest sły n n ą l-v a lu e . Po p raw ej tak. O czyw iście l-w a rto ść jest także r-w arto ścią.praw y). 8. k5 O p erato r rzu to w a n ia reinterpret_cast. Z atem jeśli w s k a ź n ik pokazuje na z m ie n n a . double *wsk double. więc być r-w arto ścią to żad en honor. że wyrażenie *wskazni k jest l-wartością ? D latego. W skaźniki 261 O perator rzutow ania r e i n t e r p r e t _ c a s t . które tą l-w arto ścią jest. II10 is not a l-value ! To k o m p ilato r zaprotestuje i p o w ie Ci (po an gielsku). że: 1 W skaźnik służący do pokazyw ania na obiekty jednego ty p u nie I n a d a je się do pokazyw ania na obiekty innego typu. a w skaźniki M ów iliśm y n ied aw n o . że jeśli kiedyś n ap iszesz przez p o m y łk ę instrukcję 10 = i . ż e liczba 10 nie n ad aje się d o postaw ienia p o lewej stronie. . // jako r-wartości------------------------------------------------ m = zmienna. int m. bo / . W yobraź so b ie taką sytuację: m am y następujące trzy w skaźniki int *wsk_intl.jak lewa strona. A le n ie o d w rotnie.po lewej stronie operato ra p rzy p isan ia). a m ów ię o tym d la teg o .Rozdział. k tóre m oże stać po p raw ej stronie n azy w am y ih w artością (o d angielskiego right . a wskaźniki Jeśli coś m o że stać po lewej stro n ie zn a k u = (m ów iąc m ąd rzej . to poniższe zap isy są ró w n o w ażn e II jako l-wartości--------------------------------------------- zmienna = 6. to stać m oże juz b y le kto. że instrukcja ta jest błędna. że m a m y w yrażeniem * w s k a ź n ik po słu g iw ać się w takich sam ych sytuacjach jak w yrażeniem z m ie n n a . / I j e s t p o p ra w n e A nalogicznie: w yrażenie. Czyli. *wskaźnik = 6. Jednak po praw ej stronie. Dlaczego to takie ważne. Po angielsku n azy w a się to l-valutr.

O o p e r a t o r z e t y m ju ż w s t ę p n i e r o z m a w i a l i ś m y w § 4 . n a cc p o k a z u j e w ła ś n ie w s k int 1. kiedyś m ów iłem (§ 4. str. ż e n ie r o b im y te g o p r z e z p o m y łk ę .8. z n a n y m jeszcze z języka C. n a p r z y k ła d ta k ą o p e ra c ję : wsk_intl = wsk_int2. B ez r z u to w a n i a k o m p i l a t o r u z n a j e t< p rz y p is a n ie z a b łę d n e . // s t a r y s t y l O p e r a c ję ta k ą m o ż n a p r z e t łu m a c z y ć n a lu d z k i ję z y k ja k o : — W i e m . ż e w s k _ i n t l je s t w s k a ź n i k i e m ( d o ) i n n e g o t y p u .8 . P rzy zw y c za ja jm y się na razu do w id o ku obu fo rm ! Potem z e starej fo rm y z re zy g n u je m y . W skaźniki O perator rzutow ania r e i n t e r p r e t _ c a s t . W s k a ź n i k d o i n t m o ż i p o k a z y w a ć n a j p i e r w n a je d e n o b i e k t ty p u int. c o o z n a c z a : „ a te r a z n ie c h w s k a ź n i k w s k i n t l p o k a z u j e n a to s a m o . k o m p ila to r z e . n a c o p o k a z u je w s k a ź n i k w s k _ i n t 2 - c z y l i n a o b ie k t ty p u i n t ? C h y b a s ię p o m y liłe ś ? W ta k im m ie js c u p a m ię c i . wsk_double = reinterpret_cast<double *> (w s k _ i n t 1) . a le p o t r a k t u j g o ja k o w s k a ź n ik ( d o ) ty p u d o u b l e i m i m o w s z y s t k o u s t a w w s k a ź n i k w s k d o u b l e n a to s a m o .ta k ie o p e r a c je s ą o c z y w is te . ż e je s t t a m o b ie k t ty p u double. 8. a wskaźniki W tra k c ie p r o g r a m u r o b iliś m y r ó ż n e r z e c z y . a p o te m n a in n y o b ie k t ty p i in t.262 Rozdz. g d z i e je s t n a p r a w d ę o b ie k t ty p u i n t . g d z i e m o ż e m y z o b a c z y ć g o w s y tu a c ji. //b łą d b ę d z i e p r z e z k o m p i l a t o r s y g n a l i z o w a n a ja k o b łą d . M o ż e m y o c z y w iś c i e s o b ie ta k w s k a ź n i k i u s ta w ić . W z a s a d z ie k o m p i l a t o r m a rację. D o te g o j e d n a k m u s i b y ć r z u t o w a n i e . 1• • I K o m p ila to r z a p r o t e s tu je : — J a k to . P o s ł u ż y ć s ię m o ż e m y w t y m c e lu o p e r a c ją r z u t o w a n i a . N ie m a p r o b l e m u . ty lk e ś w i a d o m ie . d o k tó r e j z o s t a ł w y m y ś lo n y : . że rzutow anie m ożni robić w sta rym sty lu . n ie je s t d o b r z e p r a c o w a ć u d a ją c . w s k a ź n ik ie m d o p o k a z y w a n i a n a o b i e k t y ty p u d o uble c h c e s z p o k a z a ć n a to s a m o . 1 2 1 . a m o żn a też nowocześnie u żyw a ją c now ych operatorów rzutow ania.6 . 114). //n c r w y s ty l w skd o u b l e = (double *)wsk intl. P am iętasz może. s tr . O to ta k ie r z u t o w a n i e w in s tr u k c ji p r z y p i s a n i a w s k a ź n i k ó w . a le tu n a d s z e d c z a s . O p e ra c ja ta o z n a c z a : „ a te ra z n ie c h w s k a ź n i k ws k _ d o u b l e p o k a z u j e n a to s a m e c o w s k a ź n ik w s k i n 1 2 ". c< w s k a ź n ik w s k _ i n t 2 " . a le w t e d y tr z e b a w y r a ź n i k o m p i la t o r o w i d a ć d o z r o z u m ie n i a . J e d n a k o p e r a c ja wskdouble = wsk_int2.

czyli niepowiązane są związkami dziedziczenia. że m a m y d w a ty p y X o raz Y 4 X ob jx . O perator ten pozwala na konw ersję jednego typu w skaźnika na inny typ wskaźnika. //d e fin ic ja o b ie k tu ty p u X X *wsk_x = &objx. jak zam ien ić w sk aźn ik je d n eg o ty p u na w skaźnik innego ty p u . w s k a ź n ik a i z a p a m ię ta n ie w n im a d r e s u objx Y *w s k_y. Naprawdę chcesz tego. że co p ra w d a . Z ałóżm y.? U w aga: M ó w im y tu o tym .n ie d o z w o lo n e !!! wsk ~ y = reinterpret_cast<Y*> (wsk_x) . gdy mówisz k o m u ś : M a s z tu na kartce adres snopowiązałki.p o p r a w n e D zięki zasto so w a n iu o p erato ra r e i n t e r p r e t e a s t m o żliw e było p rzep isa­ nie ad resu p rzec h o w y w an eg o w e w sk _ x do obiektu w sk _ y . Wyobraź sobie. N ie chciałbym . fak często w życiu zdarza Ci się sytuacja. / / < . 4) Dla wtajemnicznonych: . W skaźniki 263 O perator rzutow ania r e i n t e r p r e t _ c a s t . byś z ro z u m ia ł to jako z ac h ętę d o takich zam ian. //def.. jakby tam stał budynek Opery " ? Z atem ten p a ra g ra f m ów i raczej o ty m .a te typy X i Y nie mają ze sobą nic wspólnego. Najczęściej ta k ie zam ian y nie m ają sensu. Są jednak sytuacje.Rozdział. ż e w d an y m szczeg ó ln y m p rzy p ad k u m a o n a sens). . 8.. to jest d o tego specjalny operator.. I to nie dow olnym typami: został on w ym yślo n y dla w skaźników. ale jeśli n a p ra w d ę chcesz takiej karkołom nej z a m ia n y dokonać (bo w iesz. ale potraktuj to miejsce tak. w s k a ź n ika d o ty p u Y //------------------p ró b y p r z y p is a n ia a d re su d o in n e g o t y p u w s k a ź n ik a wsk y .. //def. Tymczasem chcesz adres tej snopowiązałki wstawić do wskaźnika do budynków opery.wsk x. // <. a wskaźniki O perator r e i n t e r p r e t _ c a s t służy do konwersji m iędzy typami.. k o m p ilato r słusznie nie pozw ala na ta k ie bezsensow ne konw ersje. że masz wskaźnik do snopowiązałek pokazujący na jakąś konkretną snopowiązałkę rdzewiejącą w jakiejś stodole. g d y sp raw a w y d aje się zaw sze oczyw ista: Zamiana adresu na liczbę całkowitą (i odwrotnie) O p erato r r e i n t e r p r e t _ c a s t d o d atk o w o . m iędzy którymi konw ersja nie może za jść niejawnie..

//u s ta w ie n ie w s k a ź n ik a p rze z za ła d o w a n ie d o n ieg o adresu będącego liczb ą całkow itą wsk sygnału = reinterpret_cast<int*> (numeryczny_adres).w ystarcz] p o szu k ać ed y to rem w tekście p ro g ram u słów " r e i n t e r p r e t _ c a s t " . by p o k azy w ał na p o d a n y nam liczbow o adres: int *wsk_sygnalu. Jeśli program źl< działa.jak w ielokrotnie już m ów iliśm y . int schowek. W skaźniki W skaźniki typu v o i d W n aszy m p ro g ra m ie definiujem y w ięc sobie w skaźnik i ustaw iam y go. Jeśli jesteś początkującym program istą. Jest w ięc ten o p e ra to r r e i n t e r p r e t _ c a s t t a k sam o n ieb ezp ieczn y . p o c h o d z ą c e jeszcze z języka C. 8. najlepiej tego o p erato ra nie używaj. a p o d ejrzew am y .6 Wskaźniki typu void W skaźnik . //O d c z y ta n ie a d r e s u p rze c h o w y w a n e g o w e w sk a ź n ik u cout << "Wskaźnik pokazuje na komorke pamięci numer: " « reinterpret_cast<int>(wsk_sygnalu) « endl. p lus w ied za o ty m . że to z p o w o d u zbyt śm iałych k o n w ersji .łatwiej g o znaleźć w program ie. Takie staro m o d n e rzutow anie ma postać na przykład: wsk_sygnalu = (int*) numeryczny_adres. jak to mogły robić d o tej po ry tc tradycyjne sposoby rzu to w an ia.to adres jakiegoś miejsca w parnię ci. int numeryczny_adres = 0x0f6a2fl. jakiego typu o b iek t pokazuje się. Czyli z definicji: int *wsk. .264 Rozdz. W P rz y p o m in a m : O p erato r r e i n t e r p r e t _ c a s t postępuje ze w sk aźn ik am i tak. Jest jed n ak różnica . jak te star< sposoby. 8.

że to a d re s obiektu ty p u int. II. Bez rzu to w a n ia k o m p ilato r u z n a je to p rzy p isan ie z a błędne. 8. Ten balast odczuwa się szczególnie w starszych funkcjach bibliotecznych. by móc w poprawny sposób wskaźnikiem poruszać po ewentualnych sąsiednich obiektach . na to sam o m iejsce pam ięci. które nie wymaga rzutowania Z apis ten o zn acza: niech w sk aźn ik ty p u void p o k azu je na to sam o miejsce w pam ięci. k tó ry m m o żn a p rz e c h o w a ć a d re s jakiegoś o b iektu. N ie m o żn a też n im p o ru s z a ć po sąsiadach. A teraz u w ażaj: Jeśli w sk aźn ik stojący po lewej stro n ie naszeg o p rzy p isan ia (p o d staw ien ia) b y łby typu v o i d . wv = wc. M ożem y w ię c w y k o n y w a ć tak ie operacje: // definicje kilku wskaźników void *wv. n ajp ierw jed n ak m ałe p rzy p o m n ien ie. d o u b l e itd). na k tó re pokazu je w sk a ź n ik innego ty p u . a ta w ie d z a . Pytanie: Po co nam wobec tego taki upośledzony wskaźnik? Po to. n a k tó re pokazuje. wv = w i .służy po to. że sk o ro z tej „ w ie d z y " św iad o m ie rezy g n u jem y .przypisanie. l/typuvoid char *wc. Jasn e jest. n a k tó re w łaśn ie p o k azu je w sk aźn ik typu int. W skaźniki 265 W skaźniki typu v o i d w y n ik a. M ó w iliśm y n ie d aw n o .gdy mamy je zebrane w tablicę. void *wsk_void.. • void *wsk_v. Funkcję taką nie interesuje co tam jest. T eraz m a m y w sk a ź n ik ty p u voi d. . to a u to m aty c zn ie n asz w sk aźn ik n ie m o ż e słu ży ć d o o d czy tan ia tego m iejsca.wd. int *wi. do których trzeba wysłać adres jakiegoś obiektu w pamięci. by można było poprawnie wskazywane miejsce zinterpretować (rozkodować jako obiekt typu i n t . // tutaj w programie ustawia się te wskaźniki na jakieś obiekty / j a teraz przypisania do wskaźnika typu void (bez konieczności rzutowania) wv . Z araz w y jaśn ię. a jedynie gdzie to jest. że c z a sa m i ta w ied za staje się n iep o trzeb n y m b alastem . że jest to w s k a ź n ik ty p u v o i d . to m im o braku rz u to w a n ia k o m pilator by nie zap ro testo w ał. double *wd. int *wsk int. „Wiedza" ta . wsk_void = wsk int. M ożem y je d n a k zd efin io w ać w sk a źn ik bez tej „ w ie d z y " . oraz po to.przypominam . to p ew n o ść. / / <. M ó w im y w ted y . konieczne jest rz u to w a n ie . że aby u s ta w ić w sk a źn ik jednego ty p u .Rozdział.. ~ _ . ż e ws k to w sk aźn ik .

Wobec pow yższego sformułujmy wniosek: *• ° . .<*■ - W trakcie takiego przypisywania przekazywany jest adres. który miał być przecież c o n s t. wc = (char *) wv. dowolny w skaźnik <-------. Uwaga dla programistów C 5) Dla wtajemniczonych: do wskaźnika v o id * nie można przypisać żadnego wskaźnika d< funkcji ani wskaźnika do składnika klasy. a „w iedza jest zapominana . _ // Jak widzisz wskaźnikowi typu void można przypisać U inny wskaźnik typu void. 8. // nowy styl wd = r e i n t e r p r e t _ c a s t < d o u b l e * > (w v ). To oczywiście dlatego. . wc = r e i n t e r p r e t _ c a s t < c h a r * > (w v ). konieczny jest tu operator rzutowania. wi = r e i n t e r p r e t _ c a s t < i n t * > (w v ).w skaźn ik v o i d Dla powyżej zdefiniowanych wskaźników wygląda to tak: // stary styl wd = (double *) wv. bo następuje przypisanie double* v o id* in t* v o id* c h a r* v o id * Reasumując: W iedzę o typie obiektu pokazyw anego można ewentualnie nieza­ uważenie zapomnieć. • ' • •• W skaźnik każdego (niestałego) typu^ m ożna przypisać w skaźnikow i typu vc id # w skaźnik void <---------dowolny w skaźnik (non—const). mąpiPWNMWiiwiin iiwwMfwwaamitWM n w m w w n i«w»tti<r«—»"». wi = (int *) wv. by zapobiec oszustwom. W skaźniki W skaźniki typu v o i d v o id * w v _ d ru g i. wv d r u g i = wv. To znaczy: w skaźnika typu void nie m ożna przypisać w skaźn iko w i „praw dziwem u". Nabyć tej w iedzy niezauw ażenie niemożna Trzeba to świadom ie wyspecyfikować operacją rzutowania. . Tu nieco wybiegnę w przyszłość: Jest jeden warunek: nie można wskaźnikowi typu v o i d przypisać treść wskaźnika do obiektu z przydomkiem c o n s t. Po takim przypisaniu można by bezkarnie zmienić obiekt.266 Rozdz. 1/<r. Trzeba posłużyć się operatorem rzutowania.rzutowanie -----.i to jest w porządku. N atom iast nie da się odwrotnie. . Jak widać.wskaźnik v o id do wskaźnika v o id .

7 C zte ry d o m e n y z a s to s o w a n ia w s k a źn ik ó w W skaźniki sto su je się w sytuacjach. / jd e fin ic ja tablicy to instrukcja wskaźnik = & tablica [w].1 Ćwiczenia z mechaniki ruchu w skaźnika Jeśli m am y następujące definicje: int *wskaznik. O dbiera ona (lub zw raca) ten adres za pom ocą w skaźnika void* i już. //u sta w ien ie w sk a źn ik a pow oduje. że czasam i w iedza o ty p ie pokazyw anego ob iek tu . dlatego regułę można zaostrzyć. .metnory allocation). do których trzeba w y słać (lub odebrać) a d re s jakiegoś obiektu w pam ięci.Rozdział. 8. Możemy teraz wrócić do pytania: D laczego w y m y ślo n o taki u p o śled zo n y w skaźnik? D latego. a m y już m usieliśm y zatroszczyć się o resztę.u le p sze n ie pracy z tablicam i. «$► . Ten balast o d czu w ało się szczególnie w starszych funkcjach bibliotecznych. Funkcję taką nie interesuje co tam jest. W dalszej części tego rozdziału przyjrzym y się p rzy k ład o m z tych czterech d zied zin zastosow ań. Zatem „wiedzę" nabywało się także niezauważenie. W AN SI C było tak. W skaźniki 267 Cztery domeny zastosowania wskaźników Jest to jedna z różnic między C++. Ponieważ w C++ do tego celu służą dziecinne proste operatory new i d e l e t e . a AN SI C.d o stę p do specjalnych k o m ó rek pamięci.8.rezerw ację obszarów pam ięci. w skaźnikiem do pokazyw ania na obiekty typu i n t . U d e fin ic ja w sk a źn ik a int tablica [10]. że w skaźnik ustaw ia się na elemencie tablicy o indeksie n. Stara funkcja malloc () d aw ała n am adres zarezerw o w an eg o miejsca w pam ięci jako w sk aźn ik void*. że niezależnie. . Było to jakby wyjście awaryjne dla umożliwienia łatwiejszego zapisu instrukcji rezerwujących pamięć. po której stronie operatora przypisania stał wskaźnik typu v o id n ie trzeba było używać rzutowania. (Funkcjami w rodza­ ju m a l l o c () . jak w iadom o. była n iepotrzeb­ nym balastem . ♦♦♦ . a jed y n ie g d zie to jest.8 Z a s to s o w a n ie w s k a źn ik ó w w obec tab lic . IW W W I— W IIIM IIH IM IM W W M lU IK U lllW m m IMWIIM— WHriOT . W skaźnik nasz jest.funkcje m ogące zm ieniać w artość przysyłanych d o nich argum entów . . g d y chodzi nam o: ♦> .

bo p rzec ież m o g ą być ta b lic e ty p u d o u b l e .268 Rozdz. że pokazuje on tyleż elementów tablicy dalej. 8. jakie są te ^ m e nty^ Im m N ie jest to ta k ie tryw ialne. tak: wskaźnik = &tablica(4]. ab y przeskoczyć o z a d a n ą liczb ę elem entów . W na­ szej o statn iej instrukcji po p ro stu w staw iam y d o w sk a ź n ik a ad res n -te g o e e- m entu tablicy. Niezależnie od tego.z n a ro zm iar je d n e g o elem en tu i m oże p rz y ją ć na to p o p raw k ę.n azw a tablicy je st rów nocześnie a d re s e m jej p o czą tk u . jest u sta w ie n ie m w skaźnika n a zerow ym elem encie. by o d c z y ta ć n a stę p n y pociąg. Jest to b a r d z o w ażn y fakt: Dodanie do wskaźnika jakiejś liczby całkowitej powoduje. Instrukcja wskaźnik = &tablica[0]. będzie coś b a rd z o ciekawego: Jeśli u s ta w iliś m y w sk a źn ik na ż ą d a n y ele m e n t tablicy. d lateg ró w n ie d o b rz e m oglibyśm y tę ostatnią instrukcję n a p is a ć tak: wskaźnik = tablica. // inaczej: w s k a ź n ik = w s k a ź n i k + n . A te ra z u w ażaj. A b y w sk aźn ik p rz e s u n ą ć o n elem en tó w w y sta r­ czy in stru k cja wskaźnik +. czy li na p o czątk u tablicy. na k tó r y p o k azu ją w sk a źn ik i In tere su je n a s tutaj tylko a d re s . to. . k tó ry ch e le m e n ty z a j m u j pam ięci w ię k sz a p rzestrz eń n iż n p . na k tó ry w sk a ź n ik p o k a z u je .n. C h w ilo w o ni za jm u je m y się tym . Zobaczmy teraz na przykładzie. czyli krócej wskaznik++. To jest w ła ś n ie ta prostota p rzesu n ię cia w ro zk ład zie ja z d y palca o jedną kratkę. co p o d o w y m a d resem się kryje. by pokazyw ał n a n a s tę p n y elem en t tej tablicy w y starczy d o niego d o d ać 1 wskaźnik = wskaźnik + 1. jak im typem m a si« z ajm o w ać . Skąd to w ie? Z e swojej w łasnej definicji! Jest p rzec ież w sk a ź n ik ie m d o p o k a z y ­ w a n ia n a o b ie k ty jakiegoś w y b ra n e g o typu. jak sprytne jest przesuwanie wskaźników P o n iż sz y p ro g ra m słu ży d o w y d ru k u ad re su . W ie d z ą c . ty p u i n t . a Ty o b iecałeś p o w iesić s° ble *-° nad b iu rk iem ) . w ięc w sz y stk o się zg ad za. ab y g o p o te m p rzesu n ąć tak. że w ie jak się m a p rz e s u n ą ć . P o n iew aż (już kiedyś m ów iliśm y o tym. np. A jed n ak w sk a ź n ik jest n a tyle in telig en tn y . W skaźniki Zastosowanie wskaźników wobec tablic E lem enty naszej tablicy są w łaśn ie typu i n t .

© Pętla. // . N ie m a w niej nic niezw ykłego poza tym . to rów nie d o b rz e m ożna użyć zap isu . n O Po uruchomieniu takiego programu na ekranie pojawi się przykładowo taki tekst O to . 1245000 3) wi 1245044. j a k p r z y in k r e m e n ta c ji w skaźników z m i e n i a j ą s i e u k r y te w n ic h a d r e s y : 0) wi 1245032. Po p ro stu d o każdego w sk a ź­ nika w sta w ia się adres obiektu.do pokazywania na obiekty i n t d o u b le *wd. wd++) // © { cout << " i= "<< i « ") wi = " « r e i n t e r p r e t c a s tc u n s ig n e d in t > ( w i) // © « << r e i n t e r p r e t _ c a s t < u n s i g n e d in t> (w d ) << e n d l. © wd = &td[0]. wd++. że p o k ażd y m obiegu w y k o n y ­ w ane są: wi++ . ja k p rz y i n k r e m e n ta c ji w sk a zn ik o w \n << " z m ie n ia ją s i e u k r y t e w n ic h a d r e s y : \ n " . Tablica ti m a elem enty typu int. // . W skaźniki 269 Zastosowanie wskaźników wobec tablic # in c lu d e < io s tre a m > u s in g n a m e sp a c e s t d . na który ma on p o k azy w ać.do pokazywania na obiekty d o u b le wi = &ti [0]. wi++. i+ + .Rozdział. czyli p rzesu n ię cie w skaźników na n astęp n y elem ent tablic. 1245008 4) wi 1245048. . // inaczej: wi = t i . w skaźn ik wd m oże pokazyw ać na obiekty typu double. Skoro mają p o k azy w ać na początki tych tablic. © Definicje w sk aźn ik ó w . Tablica td m a elem enty ty p u double. i < 6 . 8. © c o u t << "O to . 1244992 2 ) wi 1245040. który p o d a n y jest w kom entarzu. W skaźnik wi ma p o k azy w ać n a zerow y elem ent tablicy ti. n ato m iast w sk aźn ik wd m a p o k azy ­ wać na z e ro w y obiekt tablicy t d . 1244984 1) wi 1245036. 1245024 O D w ie definicje tablic. ^/★ ★ ★ ****-********************************* + *+ ***************** i n t m a in () // definicje dwóch tablic O int t i [6] // -jedna i n t double td[6] II-druga d o u b le //dum wskaźniki: © i n t * w i. na które pokazują. 1245016 i= 5) wi 1245052. © i O N a d a n ie w arto ści początkow ych w skaźnikom . fo r(in t i = 0 . W skaźnik wi m oże p o k azy w ać na obiekty ty p u int. // inaczej: wd = t d .

na k tó ry w sk a źn ik wi p o k azu je. chcem y ad res ten w y p isa ć n a e k r a n ie ta k .. 8..n a n astęp ny*elem entM.. 1( ' ! : J (— *— :— i— i— a— wd t R y s . b y w s k a z a ć n a k o lejn y e le m e n t tab licy . W tyni w ła śn ie o b ja w ia się in telig en cja w sk a ź n ik a . 8-1. Z a u w a ż . ___________ 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 . że p rzecież g o zd efin io w aliśm ) ^ jako: „ w s k a ź n ik s łu ż ą c y d o p o k a z y w a n ia n a elem enty ty p u double" W miejscu wypisywania wskaźnika na ekranie widzisz cout << reinterpret_cast<unsigned int>(wd)... ) ( .. E lem en ty ta b licy ty p u double zajm u ją w ięcej m iejsca w p a m ię c i niż e lem en t ty p u int. ale przeczytajmy ten adres zamieńmy go na liczbę typu unsi gned in t" (i taką liczbę wydrukujmy na ekranie).. Przypomnę. że oznacza to mniej więcej coś takiego: „co prawda wdjest H wskaźnik. J e d n a k ż e w sk a źn ik .... W sk a źn ik i p rzesu w ają się sto so w n ie do rozm iaru sw o ic h typów. W ie on jak n a p r a w d ę m a się z m ie nić. a n ie te.. T o. • | J !1 wi i f 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016... k tó re p o k a z a ł n a sz o sta tn i p ro g ram )... M y tu taj. jak a d r e s o w a n e są k o m ó rk i p am ięci w d a n y m k o m p u te rz e .a w sk a źn ik sam popraw nie się p o zycjo n u je . z p o m o c ą operacji rz u to w a n ia .. W ska źn il sa m "w ie".. Takie rzutowanie może dla nas zrobić operator r e i n t e r p r e t _ c a s t. czyli zawiera w zasadzie adres.. A dres to jakaj liczba. ż e n a e k ra n ie liczby sy m b o lizu ją ce ad resy zm ien ia ją się z różnym sk o k iem . m im o ż e p rzec ież d o d a w a liś m y d o w sk aźn ik a ty lk o jedynki. S k ąd w s k a ź n ik w ie n a jaki ty p p o k a z u je ? S tąd. (Liczby n ad ta b lic a m i oznaczają p r z y k ła d o w e a d r e s y p o szcze g ó ln y ch k o m ó re k pam ięci (b ajtó w ) zajm o w an y cł p rz e z e le m e n ty tablic. r : : ) ( : i : ■ 3 (.270 Rozdz. Z e w z g lę d ó w estety czn y ch w y b ra łe m b ard ziej o k rąg łt liczby. P rzy jrzy jm y s ię p o n iż sz e m u o b razk o w i. Zatem m ó w im y mu tylko: "-sk o ci . jak b y to b y ła w arto ść ty p u unsigned int. k tó ry jest p rz e z n a c z o n y d o p o k a z y w a n ia ni d a n e ty p u int. j O W y p isa n ie te g o s a m e g o o w s k a ź n ik u wd . na które p o kazu je. W skaźniki Zastosowanie wskaźników wobec tablic © W y p isa n ie n a e k r a n a d re s u . w ie jak ma się z m ien ia ć p r z y p rz e c h o d z e n iu d o sąsiedm eg< .. ja k d u że są elem enty.zależ}) o d ty p u k o m p u te ra ..

je ś li w p rzyszłości b ęd ziem y sobie w ym yślali tablice z elem en tó w m ających p o 5) W obu przypadkach sami musimy zadbać o legalność naszych poczynań. to wyrażenie (wf .trzeb a p rzesk o czy ć o te cztery bajty. Tak w ięc p am ięta m y o d tą d . . ż e ten bajt i trzy n a stę p n e m a in terp reto w ać jako z a k o d o w a n ą liczbę ty p u i n t . a w y ra ż e n ie P rzy k ład : a d a) W y o b raź sobie b o w iem . ab y p rzesu n ąć się do n astęp n eg o e lem en tu ty p u int .1) jest jakby adresem nieistniejącego elementu o indeksie: -1 (minus 1). że w y rażen ie (wi++) o zn ac za p rzesu n ięcie w sk aźn ik a d o n astępnego elem en tu tablicy. W sk aźn ik i są tak w sp a n iale po m y ślan e. a d b) K o n ty n u u jąc p o w y ższy p rzy k ład : W p rz y p a d k u tablicy ty p u int.Rozdział. że ten bajt i sie d e m n astęp n y ch (razem osiem ) m a ro zu m ieć jako zak o d o w an ą liczb ę ty p u double.osiem. a na obiekty typu double . jak z a c h o w a ć się p rz y p rzejściu d o n astęp n e g o elem en tu tablicy double. W przypadku Twojego kompilatora może być inaczej. C o ciek aw sz e . że w sk a źn ik p o k azu je na jakiś b ajt w pam ięci2. Jeśli w sk a źn ik jest ty p u i n t . D o d a n ie 1 d o w sk a źn ik a p rz e su w a go o w łaściw ą ilość bajtów i p o k azu je on n a n a stę p n y elem ent. W p rz y p a d k u tablicy ty p u double trzeb a p rzesk o czy ć rzeczone 8 bajtów . to w ie d z ia łb y on. Zakładam tu. na który w ła śn ie w sk a z u ję w sk a ź n ik wd. to w ie. P o d o b n ie w sk a ź n ik p rz e z n a c z o n y d o p o k a z y w a n ia na elem e­ nty ty p u double w ie. Jeśli wf pokazuje na początek tablicy. że nie m u sim y o tych sp raw ach w ie ­ dzieć. W skaźniki 271 Zastosowanie wskaźników wobec tablic e le m e n tu tablicy. że nasz kompilator na obiekty typu int przeznacza cztery bajty. O tych sprawach pomówimy za chwilę przy arytmetyce wskaźników. Jeśli zaś na ten sam bajt pam ięci p o k a z y w a łb y w sk a źn ik ty p u double. 8. D zięki te m u w y ra ż e n ie (wd + 3) d aje w su m ie a d re s trzecieg o z kolei elem entu tablicy z a tym .

Życie w świecie takich wyobrażeń. 5 . D ygresja: Często mówiłem tutaj: wskaźnik „wie" . 8.lepiej odpowiada mi interpretacji nadająca pewne cechy osobowości wskaźnikom. d o u b le t a b d b l [ 1 0 ] . Kompilator nasze wyrażenie wi++ zamienia na dodanie odpowiednie liczby do obecnie tkwiącego w wi adresu. 7 . // ustawienie wskaźnika wd = &tabdbl[0]. Jednak . 1. //******************************«***************************** i n t main() i int *wi. uprzyjemnia programowanie. 3 . Czyli to kompilator jest ta mądry.zobaczm y jak korzystać z tego. 8. do tablicy double O } cout « "Tresc tablic na poczatku\n". którego przyzwyczajenia zm się na wylot. Z acznijm y od pro g ram u . wi++. gdzie wskaźnik to stary znajomy. // załadowanie tablicy d o u b l e wartościami początkowymi for(int i = 0 . #include <iostream> using namespace std. n © wd = tabdbl. Będzie to p ro g ram na proste operacje n a tablicach jed n ak w y k o n y w an e będ ą one za pom ocą w skaźników . to i tak d o d an ie jedynki d o w skaźnika służącego d o pokazy^ w a n ia na tę tablicę p rzesu n ie popraw nie w sk aźn ik na następny e le m e n t.0.wybacz mi tę słabość . 6 . 9 ). 8 . na co w skaźnik bieżąco pokazuje. tylko kompil ator. i < 10 . II nowe ustawienie wskaźników----- . for(int k = 0 . k++) { cout « k « ") \t" « *wi « "\t\t\t\t" « *wd << endl. Oczywiście to nie wskaźnik „wie". double *wd.nadając wskaźnikowi jakąś osobo wość i wolność działania.2 U życie w skaźnika w pracy z tablicą S koro już w iem y. i++) * * (Wd++) = i / 10. wi = tabint. W skaźniki Zastosowanie wskaźników wobec tablic kilk aset bajtów .2 . jaki jest m echanizm p rzesu w an ia w sk aźn ik ó w . int tabint[10] = i 0 . wd++. II wpis wart. k < 10 .8. 4 .272 Rozdz.

6 tabint[7] = .Rozdział. W skaźniki 273 Zastosowanie wskaźników wobec tablic wi = &tabint[5]. © Definicja tablicy typu double. m++) *(wi++) = -222.5 tabint[5] = -222 t a b d b l [5] = . N ie inicjalizujemy. 8.-222 t a b d b l [6] = 0. // © * (wd++) = -777.7 7 7 . p < 10 .7 8) 0. O d razu następuje inicjalizacja (zbiorcza). U c zy li wd = &tabdbl [2]. 5 tabint[3] = 3 t a b d b l [3] = .777. wi = tabint.5 tabint[4] = 4 t a b d b l [4] = .6 7) 0.7 7 7 .7 77 . for(int p = 0 . © U staw ienie w skaźnika na początkow y elem ent tablicy tabdbl.4 5) 0. // © wd = tabdbl + 2. W pisanie dzieje się z a spraw ą instrukcji .5 ' 6) 0.1 2) 0. m < 4 .9 Tresc tablic po wstawieniu nowych wartości tabint[0] = 0 t a b d b l 10] = 0 tabint[1] = 1 t a b d b l [1] = 0. 2 3) 0.7 tabint[8] = -222 t a b d b l [8] = 0.3 4) 0.5 tabint[6] . p++) cout << "tabint[" << p << "] = " << * (wi++) « " \t\ttabdbl[" « p « "] = " << *(wd++) << endl. © //wpisanie do tablic kilku nowych wartości- for(int m = 0 .222 t a b d b l [7] = 0.1 tabint[2] = 2 t a b d b l [2] = . ) i Po wykonaniu tego programu na ekranie pojawi się: Tresc tablic na początku 0} 0 1! 0. cout << "Tresc tablic po wstawieniu nowych wartosci\n".5. © Po u staw ien iu w skaźnika posługujem y się nim w p ętli wpisującej d o tablicy t a b d b l w artości początkow e. 9 Oto ciekawsze szczegóły programu: O Definicja tablicy typu i n t . wd = tabdbl.8 tabint[9] = 9 t a b d b l [9] = 0.8 9) 0.

0. P r z y w p is a n iu od r a z u d o k o n u je m y p o s tin k r e m e n ta c ji w s k a ź n ik ó w . © N a to m ia s t w p r z y p a d k u ta b lic y t a b d b l z a c z ą ć się to m a o d e l e m e n t u o in d e k sie 2. P o n ie w a ż c h c e m y to zrobi< m e to d ą p r z e s u w a n ia w s k a ź n ik ó w . P o p ro s tu w y r a ż e n ia ( t a b i n t ) o ra z ( s t a b i n t [ 0 ] ) s ą ró w n o w a ż n e .jak w ie m y - in s tru k c ja ty p u cout << *wi. W skaźniki Zastosowanie wskaźników wobec tablic * (wd++) = i / 10. 8. W . c o o z n a c z a in a czej * w d = i / 10.0. © Z a m ie r z a m y w w y b r a n e m iejsca ta b lic w p is a ć n o w e w a rto ś c i. © W y p is a n ie n a e k r a n e le m e n tu p o k a z y w a n e g o p r z e z w s k a ź n ik to . d c k o le jn y c h c z te re c h e le m e n tó w tab lic. wd++. g d z ie p o k a z u ją w s k a ź n ik i. ja k w id a ć . O d b y w a się w ię c tu ta j w p is a n ie lic z b y d o e le m e n tu ta b lic y p o k a z y w a n e g o w ła ś n ie p r z e z w s k a ź n ik wd. że p r z y k le is z s o b ie n a d b iu r k ie m k a rtk ę z n a p is e m : T o tłu m a c z y w s z y s tk o .274 Rozdz. © W tej lin ijce w id z i m y p r z e s u n ię c ie w s k a ź n ik a n a n a s tę p n y e l e m e n t ta b lic y M o g liś m y to z ro b ić ta k ż e z w ię ź le j w p o p r z e d n ie j lin ijc e o p e r a t o r e m p o s tin k re - m e n ta c ji z a p is u ją c cout << *(wi++). Z a s to s o w a liś m y tu in n y z a p is . © Z a r a z b ę d z ie p ę tla w y p is u ją c a n a e k r a n tre ś ć tab lic. a n a s tę p n ie p r z e s u n ię c ie te g o w s k a ź n ik a n a ele­ m e n t n a s tę p n y . S p o s ó b te n m o ż e n ie je s t ta k o d ra z u ja s n y . © W p is a n ie w te m ie js c a p a m ię c i. d la te g o m u s im y n a jp ie r w u s ta w ić s o b ie w s k a ź n ik . ż e p r z e c ie ż wd = tabdbl + 2. to to s a m o co: wd = &tabdbl[2]. c a ły c z a s p a m ię ta ją c . S k o ro c h ce m y u ż y ć d o te g o ce lu s z y b k ie g o s p o s o b u z a p o m o c ą w s k a ź n ik a . a le (p a m ię ta s z ? ) u m ó w il iś m y się. d la te g o tu ta j u s ta w ia m y je n a p o c z ą tk a c h ta b lic. W p r z y p a d k u t a b i n t u s t a w i a m y w s k a ź n ik n a e le m e n c ie t a b i n t [ 5 ] . Z a s to s o w a liś m y tu d la o d m ia n y in n y s p o s ó b u s ta w ia n ia w sk a źn ik a wi = tabint. W p is u je m y . N a s tę p n e lin ijk i p r o g r a m u to p o p ro s tu p o k a z a n i e e fe k tó w p r a c y n a e k ra n ie .

N a z w a tablicy. wskaźnik = tablica. czyli p rz e s u n ą ć w sk aźn ik tak . W skaźniki 275 Zastosowanie wskaźników wobec tablic W id zisz w ięc. ż e w sk a ź n ik o w i m o ż n a p rzy p isać n azw ę tab licy . że nie m a nic specjalnie tru d n e g o w p o słu g iw an iu się w sk a ź ­ nik am i. P o słu żen ie się w sk a ź n i­ k iem d a sz y b sz y p ro g ram . Jest jed n ak z a leta . ty lk o taki. iż to n ie zw y k ły w sk a ź n ik . Z apis tablica + 4 o z n a c z a to sam o . co {■tablica [4 ] P ytanie: C zy zatem za m ia st naszej złotej regułki: I N azw a tablicy jest rów nocześnie a d re s e m jej zerow ego elem en tu n ie p o w in n iśm y zastąp ić reg u łk ą: N azw a tablicy je st rów nocześnie w s k a ź n ik ie m do jej ze ro w e g o elem entu T ak. wskaźnik = &tablica[0). bez ż m u d n e g o licze­ n ia a d re s u . a w s k a ź n ik A te ra z w ró ć m y jeszcze d o sp ra w y o m aw ian ej w p u n k cie €). i już b y liśm y p rz y n a stę p n y m elem en cie. Isto tn ie . O ile m o ż em y postąpić tak: wskaznik++. to w łaściw ie z ac h o w u je się o n a ta k . M ó w iłem p rze- cięż. czyli. P o instrukcji wskaźnik = tablica. b y p o k azy w ał n a elem en t n astęp n y .A w łaściw ie. P am iętasz n aszą p rz y p o w ie ść o ro z k ła d z ie jazd y ? N a k a ż d e p y ta n ie „ -A n a s tę p n y ? " o d p o w ia d a liś m y instrukcją wi++.Rozdział. Z a p y ta sz p ew nie: „ . sk o ro d a się to zrobić s ta ry m sp o so b em p o słu g u ją c się tab licam i?" M asz rację. Liczenie a d re su p rzec ież chw ilę trw a. wskaźnik p o k azu je na p o czą tek tablicy. k tó reg o n ig d y nie b ęd ziem y p rzesu w ać (czyli: const). m o ż e m y to zrobić p o d w aru n k iem . p o co to w szystko. Będąc p rz y elem en cie tabint [ 5 ] je d n y m sk o k iem z n a jd o w a liśm y się p r z y elem encie tabint [ 6 ] .są o g ro m n e p o d o b ie ń stw a. jak w sk aźn ik . S koro d w ie p o n iż sz e instrukcje u staw iające w sk aźn ik na p o c z ą tk u tablicy są ró w n o w a ż n e . że b ę d z ie m y pam iętać. o tyle o p eracja tablica++. / / błąd !!! . 8. że b e z w sk a źn ik ó w m o ż n a żyć. P o k a ż m y tę różnicę jaśniej.

Jest tu jed n ak p o d o b n a sytuacja. M ożem y to zin terp reto w ać tak: będzie o n p o k azy w ał na takie m iejsce w pam ięci. jeśli m am y w skaźnik: i n t ‘ w sk a ź n ik . 8. W skaźniki Zastosowanie wskaźników wobec tablic M im o tej . b ez rujnow ania chińskiej restauracji. 8. Tablica tak. że w d ru g im z tych w yrażeń dokonuje się zabronionego p rzesu w an ia w sk aźn ik a . to te n p aty k -w sk azm k jest obiektem m aterialnym ). tylko p o w edzeniem . że tam. Przynajm niej na p o czą tk u . ' O to ilustracja: G d y znajom i pytają mnie. 0 $ N azw a nie jest obiektem . Inn ą różnicą m ięd zy w skaźnikiem .to operacja. „T rz y dom y dalej" .b a rd z o m ądrej .konkluzji n ie radzę napisanej p rzed tem złote regułki zm ieniać i zastępow ać now ą. na co ten w skaźnik pokazuje. ta w sk aźn ik będzie p o k azy w ał na nieistniejący elem ent t a b l i c a [ 8 5 ] .3 Arytmetyka w skaźników M ów iliśm y już. w ów czas m ów ię. ale nazw a nie. Sam jestem obiektem (m aterialnym ). wię< p o n iższe w y rażen ia są ró w n o w ażn e tablica[3] * ( ta b lic a + 3 ) W artością obu jest treść tego elem entu tablicy. W skaźnikiem jest tutaj „chińska restauracja". w k tó ry m miejscu na długiej ulicy Bulów Strafie m ieszkam . w ięc m ożna ustalić jego w łasny ad res. N ie tego. ed z ie chińska restauracja. że m ożna d o d aw ać i odejm ow ać liczby całk o w ite do wskaż- ników i w ten sposób p rzesu w ać te w sk aźn ik i po w sk azy w an ej tablicy.n azw y tablicy. że chodzi nam o trzy pozycje dalej niż o n teraz pokazuje. ż e w skaźnik jest jakim ś obiektem w pam ięci. D odanie +3 nie je st przesunięciem . ty lk o trzy dom y dalej. Pojęcie „ad res" p rzeraża m niej m z pojęcie „stały w sk aźn ik ". Skoro n azw a tablicy to w łaściw ie w skaźnik. a n a z w ą tablicy jest to. g d zie ten w skaźnik sam się m ieści. a my w sk a ź n ik aktualnie pokazujący na elem en t t a b l i c a [5] p rzesu n iem y o 80 e lem en tó w dalej. n ato m iast moje imi<= obiektem nie jest. Gęśli ktoś na m nie p o k a ż e patykiem . O to dalsze konsekw encje. ale to. To też dobrze zapam iętać la m am na imię Jurek. jak z od n o szen iem się d o nich za pomocą konw encjonalnego . // definicja wskaźnika to jego ad res jest w artością w yrażenia: sw sk az n ik N ato m iast nie m o żn a takiej operacji p rzep ro w ad zić w sto su n k u do nazwy tablicy.„tablicow ego" zap isu : | N ie jest sp ra w d z a n a legalność takiej operacji. Robi się h j stary m sposobem . To znaczy: jeśli tablica ma tylko 10 elem entów .276 Rozdz. które . którą p rzep ro w ad za m y w m yśli.8. który m a in d e k s 3 N ie posądzaj m n ie też.

Dla w tajem n iczo n y ch i dociekliw ych: Rezultat ten jest jakiegoś typu całkowitego (ze znakiem)*. Jeśli m im o w sz y stk o sp ró b u jem y p rz e c z y ta ć to m iejsce w sk a z y w a n e p rz e z w sk a źn ik . a Ty coś ta m zapisałeś n iszcząc coś n iezn an eg o . k tó ry p o k a z u je na d z ie sią ty elem en t tablicy. to zastan ó w się n a d w sk aźn ik am i. g d y b y śm y ty lk o zd efin io w ali b y li tak d u ż ą tablicę. O b łę d z ie tak im nie o strz e ż e n as kom pilator. N a d o d a te k .d o tą d w szy stk o w y d a je się w p o rz ą d k u .p o k azy w ał o n na niew łaściw e m iejsce lu b (o zgrozo!) w o g ó le zap o m n iałeś n a d a ć w sk a źn ik o w i jak ąk o lw iek w artość p o czą tk o w ą. T akie b łę d y są n ajtru d n iejsz e d o znalezienia. N ajczęściej o k aże się. o trz y m a m y b ezsen so w n y w y n ik . D opóki nie k o rzy stam y z tej zn iszczo n ej d an ej . b o w ie m objaw iają się w p ro g ram ie c za se m b a rd z o d alek o o d m iejsca.zn iszczy istniejącą tam legalnie in n ą d a n ą .w miejscu ty m są z u p e łn ie in n e d a n e . Liczba ta m oże być ze znakiem ujem nym lub dodatnim . W skaźniki 277 Zastosowanie wskaźników wobec tablic z a jm o w a łb y elem en t t a b l i c a [ 8 5 ] . O djęcie od siebie dwóch w skaźników pokazujących na różne elem enty tej sam ej tablicy daje w rezultacie liczbę dzielących je elem entów tablicy. Jest to zapewne skrót od ang. W rezultacie p o k a z y w a ł o n w p rz y p a d k o w e miejsce. p ro g ram m o że w y k azać b łęd n e d z ia ła n ie . wa) Z d ro w y ro zsąd ek p o d p o w ia d a : 5 elem entów . n ato m iast p ró b a za p isa n ia tam cz e g o ś . 8. w k tó ry m je sp o w o d o w aliśm y .w przypadku Twojego kompilatora . że g d y w p isyw ałeś coś w m iejsce pam ięci p o k a z y w a n e p rzez w sk a źn ik . R zeczyw iście w arto ścią tego w y ra ż e n ia jest liczba 5.możesz sprawdzić zaglądając do pliku nagłówkowego < cstddef> . n iek o n ieczn ie od ra z u po z n isz c z e n iu . Oprócz tych operacji można też wskaźniki od siebie odejmować Co z ta k iej operacji w y n ik a? Z astan ó w m y się: jeśli m a m y w sk a źn ik wa. to jaka jest różnica m ię d z y ty m i w sk a źn ik am i? Czyli jaka je st w arto ść w y rażen ia (wb .Rozdział. L eg aln o ść p o k azy w an ia w sk a ź n i­ kiem n ie jest b o w iem s p ra w d z a n a . który p o k a z u je n a p iętn asty elem en t tablicy. O to m o ja rada: Jeśli p ro g ram z z u p ełn ie n ie w iad o m y ch p rzy czy n b łę d n ie d ziała czy zaw iesza się.Typ ten nazywa się p t r d i f f t. pointer difference (różnica wskaźników). P o n iew aż je d n a k tego nie zro b iliśm y . oraz w sk a ź n ik wb.naprawdę kryje się za tak przezwanym (instrukcją t y p e d e f ) typem . . O to p r o s ty p rzy k ład : 8) Co .

278 Rozdz. ż e w ielokrotnie p o d k reślałem . A teraz d o d a tk o w o na drugiej ścianie zaw ieszam y inną m ap ę. P odsum ujm y: . M apy m ają inne skale w iszą na p rz y p ad k o w y ch ścianach. co przy u w z g lęd n ien iu po d ziałk i m a p y m oże ozn a­ czać tyle-set k ilom etrów . a d ru gim na g w iazd o z b ió r O riona. wsk_a = i t a b l i c a [5]. wsk_c) = -6 (wsk_c .******************************************* i n t main() 1 int t a b l i c a [1 5 ] . N ie m a sensu m n o ż e n ie dw óch w sk aźn ik ó w (n aw et p o k azu jący ch na tę sam< tablicę) . wsk_a) = 5 (wsk_c . Jed n y m d rew n ian y m w sk aźn ik iem po k azu jem y n a Rzym . Z /*****************. Jaka jest różnica tych w skaźników ? (odległość m iędzy tym i w sk aźn ik am i). że ta o d p o w ied ź m a sens. wsk_c = s t a b l i c a [11].wsk_b) = " << (wsk_c . / / d e f i n i c j a ta b l ic y i n t *wsk_a. n a przykłac m ap ę nieba.no bo. cout << " ( w s k b . co b y to m iało oznaczać? N ie m a też sensu d zielen ie. 8. iż m u szą to być w skaźnik pokazujące na tę sa m ą tablicę? D laczego to takie w ażne? Przykład z geografii N a ścianie wisi m a p a Europy. O d p o w ie d ź jest na p rzy k ­ ład taka: 28 cen ty m etró w . wsk_b) = 1 (wsk_a . d re w n ia n y m w sk aźn ik iem p o k azu jem ) na tej m apie na P ary ż. itd. W skaźniki Zastosowanie wskaźników wobec tablic #include <iostream> using naraespace std. wsk_a) = 6 C zy zau w aży łeś. ł “ W rezultacie jako wynik otrzymamy (wsk_b .wsk_a).wsk a) =" « (wsk_c .wsk_a) << "\n(wsk_c .wsk_c) « "\n(wsk c . Jak jest różnica tych w sk a ź n ik ó w (odległość m ięd zy tym i w sk aźn ik am i)? To p y tan ie nie m a sensu. Jeśli n a w e t w eźm iem y ta śm ę m ierniczą zm ierzy m y tę o d leg ło ść.wsk a) = " << ( w s k b . k tóry m o ż n a sensow nie z in terp reto w ać tylko w ted y . a d ru g im w sk aźn ik iem n a Berlin. *wsk_b. wsk_b = & t a b l i c a [10]. to co ona b ęd zie oznaczać? Pam iętajm y w ięc - O d ejm o w an ie w skaźników daje w y n ik . *wsk_c.wsk_b) << "\n(wsk_a . g d y te w sk aźn ik i p o k azu ją na ele^ m en ty w tej sam ej tablicy.wsk_c) = " << (wsk_a . P rzyznasz. Jednym .

i zo stały one ju ż u staw io n e tak. 8. Dla p o ró w n an ia dw óch w sk aźn ik ó w p o słu g u je m y się o p erato ram i == != < > <= >= Jeśli m am y d w a w sk aźn ik i i n t *w skl. to znaczy. 2) odejm owanie dwóch wskaźników pokazujących na tę samą tablicę. i f ( w s k l == wsk2) c o u t « "oba w s k a ź n ik i p o k a z u ją na t o samo ! " . Jeśli w sk aźn ik i są różne. w sk _ c z e r = & t a b l i c a [ 3 ] .8. i n t *w sk _ czer. i f ( i < 0 | | i > 4) c o u t « " \n N ie ma ta k ie g o e le m e n tu w t e j t a b l i c y ! " . pokazuje na o b iek t o mniej­ sz y m indeksie. że po k azu ją n a różne obiekty. Jeżeli dw a w sk aźn ik i pokazują na jakieś elem enty tej sam ej tablicy. if (w skl != wks2) c o u t << " w s k a ź n ik i p o k a z u ją na r o ż n e o b ie k ty " . *wsk2. to w sk aźn ik . c o u t << "Mamy p ie c io e le m e n to w a t a b l i c e \n " "Wskaźnik czerwony pokazuje na " " e le m e n t o in d e k s i e 3\r. !/************************************************************* i n t m a in () 1 i n t t a b l i c a [5 ]. który jest m niejszy. ■ ■ ■ . E lem ent p iąty je st innym o b iek tem niż elem en t szósty.(daje to przesu­ w anie wskaźników).4 ) : c i n >> i . in t i. że pokazują na jakieś obiekty. * w s k _ z ie l." "Na k tó r y e le m e n t ma pokazyw ać " "w sk aźn ik z ie lo n y ? ( 0 . to ró w n o ść tych w sk a ź n ik ó w oznacza. Z w ra c a m u w ag ę. że pokazują one na ten sam obiekt. . # in c lu d e < io stre a m > u s in g nam espace s t d . że elem en ty tablicy to są też obiekty.Rozdział. e ls e { wsk z i e l = & t a b l i c a [ i ] . _ c o u t « "\nZ p rzep ro w ad zo n eg o p o ró w n an ia w sk a zn ik o w \n " "czerw o n eg o z zielo n y m w y n ik a.4 Porów nyw anie w skaźników W sk aźn ik i m o żn a ze sobą porów nyw ać. ze: \ n " . W skaźniki 279 Zastosowanie wskaźników wobec tablic D ozw olone operacje arytm etyczne na w skaźnikach to: 1) dodaw anie i odejm owanie od nich liczba naturalnych .

280 Rozdz. 8. ) else if(wsk_czer < wsk_ziel) cout « "zielony pokazuje na element " "o wyzszym indeksie". którym się p o sługujem y. ale ich zn ac zen ie jest chyba oczyw iste. W ynik i jego n a sz a interpretacji zależy tutaj od k o n k retn eg o kom pilatora. ) > > Po wykonaniu tego programu i przykładowej odpowiedzi 4. Pow ód jes d o k ład n ie taki sam jak przy arytm etyce w skaźników . Jest tylko kw estia.----------------------- if(wsk_czer > wsk_ziel) cout « "zielony pokazuje na element " "bliżej początku tablicy". W skaźniki Zastosowanie wskaźników wobec tablic // w ła śc iw a akcja p o ró w n a n ia ---------. h se // czy li: w sk_czer =. jeśli tylko w sk aźn ik i są tego sam ego ty p u .czyli inaczej: słu żą d o pokazyw ani! na obiekty tego sam eg o typu (int albo char itd. W arto znow u p rzypom nieć. W olno n am także p orów nać w skaźniki p o kazujące w łaśn ie na zu pełn ie odosobnione zm ienne. jaki sens m a ta k ie po ró w n an ie A sens jakiś ma! D ow iadujem y się w ten sposób. W olno p o ró w n ać zw ykły w sk aźn ik ze w sk aźn ik iem ty p u v 0 ^ ' albo n a w e t dw a w skaźniki ty p u v o i d ze sobą. w s k jz ic l * cout « "zielony i czerwony pokazują " "na to samo\n". na ekranie pojawi się tekst: Mamy piecioelementowa tablice Wskaźnik czerwony pokazuje na element o indeksie i Na który element ma pokazywać wskaźnik zielony ? (0 4): 4 Z przeprowadzonego porównania wskaźników czerwonego z zielonym wynika. to m im o p o w y ższeg o zastrzeżen ia. N ajczęściej porów n anie tak ie jest rodzajem zap y tan ia: "czy one pokazują teraz na to samo?" . ze: zielony pokazuje na element o wyzszym indeksie W przy k ład zie nie m a użycia o p erato ró w <= i >=.) .i pokazują o n e na obiekty nn należące do tej sam ej tablicy. w olno nam j< porów nać. że operacje > < >= <= m ają sens tylko dla w sk aźn ik ó w pokazujących na tę sam ą tablice. jak w pam ięci kom puten u lo k o w an e są w zg lęd em siebie te obiekty.

(nawet bez używania tego zera czy NULLa ) if(!wsk) cout << "Wskaźnik nie ustawiony!".n u li pisanym małymi literami. (Znak ten u ży w an y jest najczęś­ ciej d o oznaczenia. na które skierow uje się w skaźnik.. W ów czas zam ieniany jest o n na typ bool w e d łu g zasady: ad res 0 -> false. ♦♦♦ i f (! w s k ) . in n y a d re s —» true Skoro tak. 8. bo W yrażen iem w aru n k o w y m w instrukcji i f m oże być tak że w skaź­ nik. O znaczało ono znak A SC II o kodzie zerowym. Zauważ zaprzeczenie: jest tu operator negacji-wykrzy knik. Jest to p rz y d a tn a w łaściw ość. by zazn aczy ć. ale teraz ten zwyczaj zanika) . które mają zdefiniowaną nazwę NULL (dawniej było to powszechne. że tu o to jest koniec C -stringu). W kompilatorach. W skaźniki 281 Zastosowanie wskaźników wobec tablic 8.. gdy chce się zaznaczyć. Potem m ożem y to ew en tu a ln ie łatw o sp ra w d z ić if(wsk == 0) cout « "Wskaźnik nie pokazuje na nic sensownego !". W Na koniec jeszcze jedno.prawda. bo u staw ien ie w sk aźn ik a na ten ad res często służy n am . gdy w skaźnik p o k azu je na "coś " (na adres nie zerowy).5 W skaźnik m ożna porównać z adresem 0 K ażdy w sk aźn ik m o ż n a p o ró w n ać z ad resem 0 (zwanym dawniej adresem NULL).. W pisujem y tam d o w sk a źn ik a celow o 0: wsk = 0. gdy w skaźnik p o k azu je na "nic" (na adres zerowy). . . Spotkaliśm y się już ze słowem. Ta o statn ia form a jest m ożliw a.to samo sprawdzenie wskaźnika można było wykonać jako if(wsk == NULL) cout « "Wskaźnik nie ustawiony!".Rozdział. że w skaźnik nie p o k azu je na nic sensow nego. albo jeszcze prościej. to o d tą d m o żem y spraw dzać u staw ien ie w skaźnika p o p ro stu tak: ♦♦♦ i f (ws k ) . II lub dawniej: wsk = NULL..prawda. Tutaj mamy N U L L pisany wielkimi literami O znacza to "adres zerowy". czyli specjalne miejsce. że chw ilow o nie będzie p o k azy w ał nic sensow nego.

to w sk aźn ik i jako a rg u m e n ty funkcji. że są 4 do m en y zasto so w an ia w skaźników . W zasad z ie m ów iliśm y już < tym trochę w ro zd ziale o funkcjach. to funkcja ta o trzy m u je w ów czas do p racy kopię zm iennej x (a nie oryginał) Jeżeli n aw et w obrębie funkcji na tej k opii dokonujem y jakichś zm ian . ale najpierw Przypomnienie Jeśli m am y funkcję z jednym arg u m e n tem i n t f u n k c j a ( i n t