Professional Documents
Culture Documents
1BEVEZETS.................................................................................................................... 5
2JELLSEK.....................................................................................................................7
3ALAPISMERETEK..........................................................................................................8
3.1Forrsprogram............................................................................................................8
3.2Fordts...................................................................................................................... 8
3.3Kapcsolszerkeszts (link).................................................................................... 12
3.4Futtats.....................................................................................................................12
3.5Tblzat ksztse.................................................................................................... 13
3.6Bemenet, kimenet.................................................................................................... 21
3.7Tmbk....................................................................................................................28
3.8Fggvnyek.............................................................................................................. 31
3.9Prodzsekt................................................................................................................. 35
3.10Karaktertmb s karakterlnc................................................................................ 37
3.11Loklis, globlis s bels, kls vltozk..............................................................41
3.12Inicializls............................................................................................................ 46
4TPUSOK S KONSTANSOK......................................................................................49
4.1Elvlaszt-jel........................................................................................................... 50
4.2Azonost................................................................................................................. 51
4.3Tpusok s konstansok a nyelvben...........................................................................52
4.3.1Egsz tpusok s konstansok............................................................................. 55
4.3.2Felsorols (enum) tpus s konstans................................................................. 58
4.3.3Vals tpusok s konstans................................................................................. 61
4.3.4Karakter tpus s konstans................................................................................ 63
4.4Karakterlnc (string literal):.....................................................................................68
4.5Deklarci ...............................................................................................................71
4.5.1Elemi tpusdefinci (typedef).......................................................................... 75
5MVELETEK S KIFEJEZSEK................................................................................ 77
5.1Aritmetikai mveletek (+, -, *, / s %).....................................................................79
5.1.1Multiplikatv opertorok (*, / s %)..................................................................80
5.1.2Additv opertorok (+ s -)............................................................................... 83
5.1.3Matematikai fggvnyek...................................................................................83
5.2Relci opertorok ( >, >=, <, <=, == s !=)........................................................... 85
5.3Logikai mveletek ( !, && s ||)...............................................................................86
5.4Implicit tpuskonverzi s egszellptets...........................................................87
5.5Tpusmdost szerkezet......................................................................................... 89
5.6sizeof opertor......................................................................................................... 90
5.7Inkrementls (++), dekrementls (--) s mellkhats........................................... 91
5.8Bit szint opertorok ( ~, <<, >>, &, ^ s |).............................................................92
5.9Feltteles kifejezs ( ? :).......................................................................................... 96
5.10Hozzrendels opertorok..................................................................................... 98
5.11Hozzrendelsi konverzi....................................................................................100
5.12Vessz opertor................................................................................................... 101
5.13Mveletek prioritsa ........................................................................................... 102
6UTASTSOK............................................................................................................. 106
6.1sszetett utasts.................................................................................................... 106
6.2Cmkzett utasts.................................................................................................. 107
6.3Kifejezs utasts................................................................................................... 107
6.4Szelekcis utastsok............................................................................................. 108
6.5Itercis utastsok.................................................................................................111
6.6Ugr utastsok...................................................................................................... 116
2 TARTALOMJEGYZK S ELSZ
7ELFELDOLGOZ (PREPROCESSOR).................................................................. 119
7.1res (null) direktva...............................................................................................120
7.2#include direktva.................................................................................................. 121
7.3Egyszer #define makr........................................................................................ 121
7.4Elredefinilt makrk............................................................................................ 123
7.5#undef direktva..................................................................................................... 123
7.6Paramteres #define direktva................................................................................124
7.7Karaktervizsgl fggvnyek (makrk).................................................................125
7.8Feltteles fordts................................................................................................... 128
7.8.1A defined opertor.......................................................................................... 130
7.8.2Az #ifdef s az #ifndef direktvk...................................................................130
7.9#line sorvezrl direktva...................................................................................... 130
7.10#error direktva.................................................................................................... 131
7.11#pragma direktvk.............................................................................................. 132
8OBJEKTUMOK S FGGVNYEK......................................................................... 133
8.1Objektumok attribtumai....................................................................................... 133
8.1.1Trolsi osztlyok........................................................................................... 134
8.1.1.1Automatikus (auto, register) trolsi osztly........................................... 134
8.1.1.2Statikus (static, extern) trolsi osztly................................................... 137
8.1.2lettartam (lifetime, duration)........................................................................ 140
8.1.2.1Statikus (static vagy extern) lettartam.................................................... 140
8.1.2.2Loklis (auto vagy register) lettartam.................................................... 141
8.1.2.3Dinamikus lettartam............................................................................... 141
8.1.3Hatskr (scope) s lthatsg (visibility)...................................................... 141
8.1.3.1Blokk (loklis, bels) hatskr................................................................ 142
8.1.3.2Fggvny hatskr................................................................................... 142
8.1.3.3Fggvny prototpus hatskr..................................................................142
8.1.3.4Fjl (globlis, kls) hatskr..................................................................143
8.1.3.5Lthatsg................................................................................................ 143
8.1.3.6Nvterlet (name space).......................................................................... 144
8.1.4Kapcsolds (linkage).................................................................................... 144
8.2Fggvnyek............................................................................................................ 145
8.2.1Fggvnydefinci.......................................................................................... 146
8.2.1.1Trolsi osztly........................................................................................ 148
8.2.1.2A visszatrsi rtk tpusa........................................................................149
8.2.1.3Formlis paramterdeklarcik................................................................149
8.2.1.4A fggvny teste...................................................................................... 151
8.2.2Fggvny prototpusok................................................................................... 152
8.2.3Fggvnyek hvsa s paramterkonverzik.................................................. 155
8.2.4Nem szabvnyos mdostk, hvsi konvenci.............................................. 157
8.2.5Rekurzv fggvnyhvs..................................................................................159
9MUTATK.................................................................................................................. 161
9.1Mutatdeklarcik................................................................................................. 161
9.1.1Cm opertor (&)............................................................................................ 162
9.1.2Indirekci opertor (*).................................................................................... 163
9.1.3void mutat..................................................................................................... 164
9.1.4Statikus s loklis cmek................................................................................. 164
9.1.5Mutatdeklartorok.........................................................................................165
9.1.6Konstans mutat............................................................................................. 166
9.2Mutatk s fggvnyparamterek.......................................................................... 167
C programnyelv 3
9.3Tmbk s mutatk............................................................................................... 168
9.3.1Index opertor................................................................................................. 169
9.3.2Tmbdeklartor s nem teljes tpus tmb..................................................... 172
9.4Mutataritmetika s konverzi.............................................................................. 173
9.4.1sszeads, kivons, inkrementls s dekrementls..................................... 174
9.4.2Relcik.......................................................................................................... 175
9.4.3Feltteles kifejezs.......................................................................................... 175
9.4.4Konverzi....................................................................................................... 176
9.5Karaktermutatk.................................................................................................... 178
9.5.1Karakterlnc kezel fggvnyek.....................................................................178
9.5.2Vltoz paramterlista.................................................................................... 184
9.6Mutattmbk........................................................................................................186
9.7Tbbdimenzis tmbk......................................................................................... 187
9.7.1Vletlenszm genertor...................................................................................190
9.7.2Dinamikus memriakezels............................................................................ 192
9.8Tmbk, mint fggvnyparamterek..................................................................... 196
9.9Parancssori paramterek........................................................................................ 198
9.9.1Programbefejezs............................................................................................202
9.10Fggvny (kd) mutatk...................................................................................... 203
9.10.1atexit fggvny..............................................................................................206
9.10.2Tpusnv....................................................................................................... 208
9.11Tpusdefinci (typedef)...................................................................................... 209
9.12Ellenrztt bemenet............................................................................................. 211
10STRUKTRK S UNIK...................................................................................... 216
10.1Struktradeklarci ............................................................................................. 217
10.1.1Tpusdefinci............................................................................................... 219
10.2Struktratag deklarcik...................................................................................... 220
10.3Struktrk inicializlsa.......................................................................................222
10.4Struktratagok elrse..........................................................................................223
10.5Struktrk s fggvnyek.....................................................................................227
10.6nhivatkoz struktrk s dinamikus adatszerkezetek .......................................234
10.7Struktra trillesztse...........................................................................................240
10.8UNIK................................................................................................................ 242
10.8.1Unideklarcik............................................................................................243
10.9Bitmezk (bit fields)............................................................................................ 245
10.10Balrtk jobbrtk...........................................................................................247
10.11Nvterletek.......................................................................................................248
11MAGAS SZINT BEMENET, KIMENET...............................................................251
11.1Folyamok megnyitsa.......................................................................................... 251
11.2Folyamok pufferezse.......................................................................................... 252
11.3Pozcionls a folyamokban................................................................................ 255
11.4Bemeneti mveletek ............................................................................................257
11.5Kimeneti mveletek............................................................................................. 259
11.6Folyamok lezrsa............................................................................................... 260
11.7Hibakezels.......................................................................................................... 260
11.8Elre definilt folyamok...................................................................................... 264
11.8.1Bemenet az stdin-rl..................................................................................... 266
11.8.2Kimenet az stdout-ra..................................................................................... 270
11.9Egyb fggvnyek................................................................................................278
12IRODALOMJEGYZK............................................................................................. 280
4 TARTALOMJEGYZK S ELSZ
13FGGELK............................................................................................................... 281
13.1CHDEL.C............................................................................................................ 281
13.2EGYESIT.C......................................................................................................... 281
13.3HEXA.C...............................................................................................................282
13.4IKSZ.C................................................................................................................. 283
13.5INDEXEU.C........................................................................................................ 284
13.6JANI.C................................................................................................................. 285
13.7KOZEPRE.C........................................................................................................285
13.8LAPOZ.C............................................................................................................. 286
13.9NEVREND.C.......................................................................................................287
13.10PELDA18X.C.................................................................................................... 288
13.11PELDA18Y.C.................................................................................................... 289
13.12PELDA28X.C.................................................................................................... 291
13.13PLUSSZ.C......................................................................................................... 293
13.14ROTL.C............................................................................................................. 293
13.15STRMAKRO.C................................................................................................. 293
13.16STRMIN.C........................................................................................................ 294
13.17STRRV.C...........................................................................................................295
13.18STRSTRXT.C....................................................................................................296
13.19TOBBOSZL.C................................................................................................... 297
13.20XPLUSZOR.C................................................................................................... 297
Kedves Kollegina, Kollga!
A jegyzetet nnek ksztettem azrt, hogy referencia anyaga legyen a
Programozs trgyhoz.
Szeretnm a segtsgt ignybe venni abbl a clbl, hogy a jegyzet mi-
nl pontosabb, megbzhatbb legyen. pp ezrt arra krem, ha az olvass
sorn valamilyen magyartalansgba, nem elgsges magyarzatba vagy
uram bocs' hibba tkzne, jelezze vissza nekem!
Tnykedst elre megksznm.
Gyr, 2004. jlius Bauer Pter
(B609) Tel.: (96) 503400/3254 e-mail: bauer@sze.hu
C programnyelv 5
1 BEVEZETS
A Szchenyi Istvn Egyetem klnfle informatika szakjai s szakir-
nyai C programnyelvi jegyzetignyt hivatott kielgteni ez a dokumen-
tum. Az olvasrl felttelezi, hogy tisztban van a szmtstechnikai alap-
fogalmakkal [1]. Alapos strukturlt programozsi ismereteket szerzett, s
jratos az alapvet algoritmikus elemekben [2]. Jratos mr egy program-
nyelvben s fejleszt krnyezetben. Magyarn ismer, s kezel ilyen fogal-
makat, mint:
- Adatok, adattpusok s adatstruktrk.
- Konstansok, vltozk s azonostk.
- Vezrlsi szerkezetek: szekvencia, szelekci s iterci. Utastsok.
- Tmbk s sztringek (karakterlncok).
- Programszerkezeti elemek: eljrsok, fggvnyek, blokkok s prog-
rammodulok.
- Lncolt adatszerkezetek: listk s fk.
- Elemi bemeneti s kimeneti eszkzk, fjlok stb.
A C nyelvet tervezje, Dennis
Ritchie, a Bell Laboratriumban
fejlesztette ki az 1970es vek
vgn [4], s a UNIX opercis
rendszer programnyelvnek
sznta. Ezt a vltozatot jelli az
brn a K&R. A C nyelv ezt k-
veten praktikussga miatt sz-
les krben elterjedt. Sokan k-
sztettek sokfle C fordtt sajt,
vagy krnyezetk ignyeinek
megfelelen. A soksznsgben
amerikai nemzeti szabvnnyal
(ANSI) teremtettek rendet az
1980as vek vgn [5]. Az
ANSI C szabvnyt aztn Eurpban (ISO) is elfogadtk nhny vvel k-
sbb. Az brbl ltszik, hogy az ANSI C bvtette a K&R C halmazt.
Tovbbi trtneti ttekintshez a [4] s az [5] bevezet rszeit ajnl-
juk!
fordt
ANSI C
K & R
6 BEVEZETS S ALAPISMERETEK
Az brn a legbvebb C halmaz a fordt. Ha valamikor is valami-
lyen gondunk lenne azzal, hogy egy konkrt C utasts, mdost stb.
megfelele az ANSI C szabvnynak, akkor fordts eltt kapcsoljuk be az
integrlt programfejleszt rendszer egy menpontjval az ANSI C kom-
patibilis fordtst!
A C ltalnos cl programnyelv, mely tmrsgrl, hatkonysgrl,
gazdasgossgrl s portabilitsrl (hordozhatsgrl) ismert. Nem
tartalmaz tl sok vezrlsi szerkezetet. Bsges viszont az opertorkszle-
te, s tbb adattpus meglte jellemzi. Jl hasznlhat teht mszakitu-
domnyos, vagy akr adatfeldolgozsi problmk megoldsra.
A C elg alacsony szint hardver kzeli programnyelv is egyben,
hisz tervezje a UNIX opercis rendszert e nyelv segtsgvel ksztette
el nhny szz gpi kd utasts felhasznlsval. A C programok gyak-
ran ugyanolyan gyorsak, mint az ASSEMBLER nyelven kszltek, de j-
val knnyebben olvashatk s tarthatk karban.
Jegyzetnkben nem kvnunk elmerlni konkrt integrlt programfej-
leszt rendszerek, opercis rendszerek s processzorok rszleteinek tag-
lalsban. Teljes ltalnossgban azonban mg sem clszer a dolgokrl
beszlni, mert akkor ilyeneket kne mondani, mint:
- Kpezzk az opercis rendszernek megfelel vgrehajthat fjlt!
- Futtassuk a vgrehajthat fjlt az opercis rendszerben!
Ehelyett rgztsk azt, hogy fogalmainkkal az IBM PC kompatibilis sze-
mlyi szmtgpek terletn maradunk! Erre a gpcsaldra is rengeteg
cg ksztett C fordtt (compiler). Itt llapodjunk meg kt f gyrtnl: a
Borlandnl s a Microsoftnl! Az integrlt programfejleszt keretrendszer
legyen menvel irnythat, s ne parancssori paramterknt megadott kap-
csolkkal kelljen vezrelni a fordtt s a kapcsolszerkesztt (linker).
Az opercis rendszer szmunkra jobbra csak olyan szempontbl rde-
kes, hogy legyen karakteres szabvnyos bemenete (standard input), s l-
tezzen karakteres szabvny kimenete (standard output), valamint szabv-
nyos hibakimenete (standard error output). A szabvny bemenet alaprtel-
mezs szerint a billentyzet, a kimenetek viszont a karakteres zemmd
kpernyre, vagy a karakteres konzol ablakba dolgoznak. A karakteres
kperny, vagy konzol ablak felbontsa termszetesen vltoztathat, de
mi minden pldnl felttelezzk a 25 sorszor 80 oszlopot! A szabvny
kimeneteken a mindenkori aktulis pozcit kurzor jelzi.
C programnyelv 7
2 JELLSEK
Figyelem felkelts. Valamely kvetkeztets levonsa az eddigiek-
bl. Esetleg: merre tallhatk tovbbi rszletek a krdses tmval kap-
csolatban.
Lexiklis ismeretek taglalsa. Valamely folyamat pontosabb rszle-
tei. Egy fogalom preczebb defincija.
e Valamilyen arnylag knnyedn elkvethet, de nehezen lokalizl-
hat hiba.
` Egy alapvet, gy nevezett kl szably.
Forrsprogramok s kperny tartalmak szvege.
Valamilyen konkrtummal helyettestend szintaktikai egysg.
Kulcssz vagy valamilyen azonost.
A fogalom els elfordulsnak jellsre szolgl.
A megoldand feladatokat gy jelltk. Ha a feladat lersnak vgn
{nv.C} fjlazonost ll, akkor a FGGELKben ugyanezen fejezetc-
men megtallhat egy megolds programlista is.
8 BEVEZETS S ALAPISMERETEK
3 ALAPISMERETEK
3.1 Forrsprogram
Els kzeltsben induljunk ki abbl, hogy a C program (a forrsprog-
ram) fjlazonostjban C kiterjesztssel rendelkez, ASCII kd szveg-
fjl, mely elllthat, ill. mdosthat
- akrmilyen ASCII kd szvegszerkesztvel, vagy
- a programfejleszt rendszer beptett szvegszerkesztjvel.
Az ASCII kd szvegfjl sorokbl ll. Egy sorban a szveg sorbeli
karaktereinek ASCII kdjai kvetkeznek rendre az egyms utni bjtok-
ban. A sorhoz vgl mg kt, a soremelst ler bjt tartozik, melyekben
egy soremels (Line Feed 10) s egy kocsi vissza (Carriage Return 13)
vezrl karakter van.
e Vigyzni kell ASCII kd szvegfjlban a decimlisan 31 rtk
bjt hasznlatval, mert ez fjlvg jelzs a legtbb opercis rendszerben!
Ksztsk el els C programunkat, s mentsk el PELDA1.C nven!
/* PELDA1.C */
#include <stdio.h>
void main(void){
printf(Ez egy C program!\n); }
Fordtsuk le a programot, szerkesszk meg a vgrehajthat fjlt, s fut-
tassuk le!
A mindenki ltal gyantott vgeredmny az a kpernyn, hogy megjele-
nik a szveg, s a kvetkez sor elejn villog a kurzor:
Ez egy C program!
_
3.2 Fordts
A fordt sikeres esetben a forrsprogrambl egy vele azonos nev
(OBJ kiterjeszts) trgymodult llt el,
PELDA1.C
fordt
PELDA1.OBJ
1. bra: Fordts
s zeneteket jelentet meg tbbek kzt a hibkrl. A hibazenetek leg-
albb ktszintek:
- (fatlis) hibazenetek s
C programnyelv 9
- figyelmeztet zenetek.
e A (fatlis) hibkat, melyek jobbra szintaktikai jellegek, mindig ki-
javtja a programoz, mert korrekcijuk nlkl nem kszti el a trgymo-
dult a fordt. A figyelmeztet zenetekkel azonban, melyek sok esetben a
legslyosabb problmkat jelzik, nem szokott trdni, mert a fordt ltre-
hozza a trgymodult, ha csak figyelmeztet zenetekkel zrul a fordts.
A PELDA1.C programunk els sora megjegyzs (comment). A meg-
jegyzs rsszablya ltszik a sorbl, azaz:
- /* karakter prral kezddik s
- */ karakter prral vgzdik.
A megjegyzs tbb forrssoron t is tarthat, minden sorba is rhat egy,
st akr egy soron bell tbb is megadhat a szintaktikai egysgek kztt.
e Egyetlen tilos dolog van: a megjegyzsek nem gyazhatk egyms-
ba!
/* Ez a befoglal megjegyzs eleje.
/* Itt a begyazott megjegyzs. */
Ez meg a befoglal megjegyzs vge. */
Vegyk szre, hogy brmely hibs program rgtn hibtlann vlik,
ha /*ot tesznk az elejre, s a zr */t elfelejtjk megadni a tovbbi
forrsszvegben!
A fordtt egybeptettk egy specilis elfeldolgozval (preprocessor),
mely az igazi fordts eltt
- elhagyja a forrsszvegbl a megjegyzseket,
- vgrehajtja a neki szl direktvkat, s
- ezeket is elhagyja a forrsszvegbl.
PELDA1.C
elfeldolgoz
+
fordt
PELDA1.OBJ
2. bra: Fordts pontosabban
Az elfeldolgoz direktvk egy sorban helyezkednek el, s #tel kez-
ddnek. Pontosabban # kell, legyen a sor els nem fehr karaktere.
Fehr karakterek a szkz, a soremels, a lapdobs karakter, a vz-
szintes s a fggleges tabultor karakter. Meg kell emlteni, hogy a meg-
jegyzs is fehr karakternek minsl. A fehr karakterek szolglhatnak
10 BEVEZETS S ALAPISMERETEK
szintaktikai egysgek elvlasztsra, de a felesleges fehr karaktereket el-
veti a fordt.
A PELDA1.C programunk msodik sora egy #include direktva, mely-
nek hatsra az elfeldolgoz megkeresi s betlti a paramter szvegfjlt
a forrsszvegbe, s elhagyja belle ezt a direktvt.
A pillanatnyilag betltend szvegfjl, az stdio.h, H kiterjeszts. Az
ilyen kiterjeszts szvegfjlokat C krnyezetben fejfjloknak (header)
nevezik. A fejfjl egy tmval kapcsolatos adattpusok, konstansok defin-
ciit s a vonatkoz fggvnyek jellemzit tartalmazza.
Fedezzk fel, hogy az stdio a standard input output rvidtsbl
szrmazik, s gy lnyegben a szabvny kimenetet s bemenetet kapcsol-
tuk programunkhoz.
Nem volt mg sz arrl, hogy a paramter fjlazonost <> jelek k-
ztt ll! A <> jel pr tjkoztatja az elfeldolgozt, hogy milyen knyvt-
rakban keresse a szvegfjlt. A programfejleszt rendszer menpontjai
kzt van egy, melynek segtsgvel megadhatk a fejfjlok (include fj-
lok) keressi tjai. <fjlazonost> alak paramter hatsra az #include
direktva csak a programfejleszt rendszerben elrt utakon keresi a fjlt,
s sehol msutt.
PELDA1.C programunk harmadik s negyedik sora a main (f) fgg-
vny defincija. A fggvnydefinci szintaktikai alakja:
tpus fggvnynv(formlisparamterlista) { fggvnytest }
- A visszatrsi rtk tpusa void, mely kulcssz ppen azt jelzi, hogy
a fggvnynek nincs visszaadott rtke.
- A fggvnynv main. C krnyezetben a main az indt program.
- A formlisparamterlista mindig ()ben van. Pillanatnyilag itt is a
void kulcssz lthat, ami e helyt azt rgzti, hogy nincs formlis
paramter.
- A fggvnytestet mindig {}ben, gy nevezett blokk zrjelek-
ben, kell elhelyezni.
A { nyitja, a } zrja a blokkot (BEGIN s END). A { } prok ssze-
tartoznak. A } mindig a forrsszvegben t megelz {t zrja.
A forrsprogram tbb forrsmodulban (forrsfjlban) is elhelyezhe-
t. Vgrehajthat program ltrehozshoz azonban valamelyik forrsmo-
dulnak tartalmaznia kell a maint. Az indt program a vgrehajthat
C programnyelv 11
program belpsi pontja is egyben. Ez az a hely, ahova a memriba tr-
tnt betlts utn tadja a vezrlst az opercis rendszer.
Az indt programnak termszetesen a vgrehajthat program iga-
zi indtsa eltt el kell ltnia nhny ms feladatot is, s a programoz l-
tal rt mainbeli fggvnytest csak ezutn kvetkezik. A gyrtk az indt
programot rendszerint trgymodul (OBJ) alakjban szoktk rendelkezsre
bocstani.
A PELDA1.C programban a main fggvny teste egyetlen fggvnyh-
vs. A fggvnyhvs szintaktikja:
fggvnynv(aktulisparamterlista)
- A fggvnynv a printf, mely fggvny az aktulis paramtert
megjelenteti a szabvny kimeneten.
- A ()ben ll aktulisparamterlista egytag, s momentn egy
karakterlnc konstans.
A karakterlnc konstans rsszablya ltszik: idzjelek kz zrt
karaktersorozat. A karakterlnc konstanst a memriban meg kpzeljk
gy el, hogy a fordt a szveg karaktereinek ASCII kdjait rendre elhe-
lyezi egymst kvet bjtokban, majd vgl egy tiszta zrustartalm (min-
den bitje zrus) bjttal jelzi a karakterlnc vgt!
A pldabeli karakterlnc konstans vgn azonban van egy kis fur-
csasg: a \n!
Ha valaki ttanulmnyozza az ASCII kdtblt, akkor lthatja, hogy a
lehetsges 256 kdpozci nem mindegyikhez tartozik karakterkp. Em-
ltsk csak meg a szkz (32) alatti kdpozcikat, ahol az gy nevezett
vezrl karakterek is elhelyezkednek! Valahogyan azt is biztostania kell a
programnyelvnek, hogy ezek a karakterek, ill. a karakterkp nlkli kd-
pozcik is megadhatk legyenek. A C programnyelvben erre a clra az
gynevezett escape szekvencia (escape jelsorozat) szolgl.
Remlhetleg vilgoss vlt az elz okfejtsbl, hogy az escape
szekvencia helyfoglalsa a memriban egyetlen bjt!
Az escape szekvencia \ jellel kezddik, s ezutn egy karakter kvet-
kezik. A teljessg ignye nlkl felsorolunk itt nhnyat!
Escape szekvencia Jelents
\b visszatrls (back space)
\n soremels vagy j sor (line feed)
\r kocsi vissza (carriage return)
\t vzszintes tabultor (horizontal tab)
12 BEVEZETS S ALAPISMERETEK
\ egyetlen karakter
\\ egyetlen \ karakter
\0 karakterlnc zr bjt, melynek
minden bitje zrus
\ooo
az ok oktlis szmok
Vegyk szre, hogy ha idzjelet kvnunk a karakterlnc konstans-
ba rni, akkor azt csak \ mdon tehetjk meg! Ugyanez a helyzet az esca-
pe szekvencia kezdkaraktervel, mert az meg csak megkettzve kpez
egy karaktert! Lssuk mg be, hogy a \ooo alakkal az ASCII kdtbla br-
mely karaktere lerhat! Pldul a \012 azonos a \nnel, vagy a \060 a 0
szmjegy karakter.
A printf fggvnyhvs utn ll ; utastsvg jelzs.
PELDA1.C programunk utols fehr foltja a printf, mely egyike
a szabvnyos bemenet s kimenet fggvnyeinek.
3.3 Kapcsolszerkeszts (link)
A gyrtk a szabvny bemenet, kimenet s ms tmacsoportok fggv-
nyeinek trgykdjt statikus knyvtrakban (LIB kiterjeszts fjlokban)
helyezik el. Nevezik ezeket a knyvtrakat futsidej knyvtraknak (run
time libraries), vagy szabvny knyvtraknak (standard libraries) is. A
knyvtrfjlokbl a szksges trgykdot a kapcsolszerkeszt msolja
hozz a vgrehajthat fjlhoz. Lssuk brn is a szerkesztst!
PELDA1.OBJ
indt program
(OBJ)
knyvtrak (LIB)
kapcsol
szerkeszt
PELDA1.EXE
3. bra: Kapcsolszerkeszts
e A programfejleszt keretrendszerben a sikeres mkdshez bizo-
nyosan be kell lltani a statikus knyvtrfjlok (library) keressi tjait.
Azt is meg kell adni termszetesen, hogy hova kerljenek a fordts s a
kapcsolszerkeszts sorn keletkez kimeneti fjlok.
3.4 Futtats
A vgrehajthat fjl a parancssorbl azonostjnak begpelsvel indt-
hat. Valsznleg a programfejleszt rendszer menjben is van egy
pont, mellyel az aktulis vgrehajthat fjl futtathat.
Tbbnyire ltezik a hrom lpst (fordts, kapcsolszerkeszts s fut-
tats) egyms utn megvalst egyetlen menpont is.
C programnyelv 13
e Ha programunk kimenete nem lthat a kpernyn, akkor egy msik
menpont segtsgvel t kell vltani a felhasznli kpernyre (user scre-
en), vagy aktuliss kell tenni a futtatott vgrehajthat fjl programabla-
kt.
3.5 Tblzat ksztse
Ksztsk el a kvetkez forinteur tszmtsi tblzatot! Egy eur
pillanatnyilag legyen 244 forint 50 fillr!
Adatstruktra:
- A vltozk a vals tpus euron
kvl, mind egszek. also lesz a tar-
tomny als hatra, felso a tarto-
mny fels rtke, lepes a lpskz, s ft a ciklusvltoz.
Algoritmus:
- Deklarljuk a vltozkat!
- Elltjuk ket az eurotl eltekintve kezdrtkkel.
- Megjelentetjk a tblzat fejlc sort s az alhzst.
- Mkdtetjk a ciklust, mg ft <= felso.
- A ciklusmagban kiszmtjuk az aktulis euro rtket, megjelentet-
jk az sszetartoz ft euro rtkprt, s vgl lptetjk az ft cik-
lusvltozt.
Ksztsk el a programot!
/* PELDA2.C: Forint-eur tszmtsi tblzat */
#include <stdio.h>
void main(void){
int also, felso, lepes, ft; /* Deklarcik */
float euro;
also = 100; /* Vgrehajthat utastsok */
felso = 1000;
lepes = 100;
ft = also;
printf(" Forint| Eur\n"
"---------+---------\n");
while(ft <= felso){ /* Begyazott (bels) blokk */
euro = ft / 244.5;
printf("%9d|%9.2f\n", ft, euro);
ft = ft + lepes; } }
A PELDA2.Cbl kitnen ltszik a C fggvny szerkezete, azaz az
gy nevezett blokkszerkezet:
Forint Eur
100 0.41
200 0.82
300 1.23
. . . . . .
1000 4.09
14 BEVEZETS S ALAPISMERETEK
- Elbb a deklarcis utastsok jnnek a blokkbeli vltozkra. A C
szigor szintaktikj nyelv:
- elzetes deklarci nlkl nem hasznlhatk benne a vltozk, s
- kivtel nlkl deklarlni kell minden hasznlatos vltozt!
- Aztn a vgrehajthat utastsok kvetkeznek.
e A blokkszerkezet deklarcis s vgrehajthat rszre bontsa a C
ben szigor szintaktikai szably, azaz egyetlen vgrehajthat utasts sem
keveredhet a deklarcis utastsok kz, ill. a vgrehajthat utastsok
kztt nem helyezkedhet el deklarcis utasts. Termszetesen a vgre-
hajthat utastsok kz begyazott (bels) blokkban a szably jra kez-
ddik.
Vegyk szre a pldaprogramunk vgn elhelyezked begyazott
vagy bels blokkot! Figyeljk meg a main kt els sorban, hogy a dekla-
rcis utasts szintaktikja:
tpus azonostlista;
Az azonostlista azonostk sorozata egymstl vesszvel elvlasztva.
Megfigyelhet mg, hogy az azonostk kpzshez az angol bc
beti hasznlhatk fel!
Foglalkozzunk kicsit a tpusokkal!
Az int (integer) 16, vagy 32 bites, alaprtelmezs szerint eljeles (sig-
ned), fixpontos belsbrzols egsz tpus. Vegyk, mondjuk, a 16 bites
esetet! A legnagyobb, mg brzolhat pozitv egsz binrisan s decim-
lisan:
0111 1111 1111 1111
2
= 2
15
1 = 32767
A negatv rtkek kettes komplemens alakjban troltak. A legkisebb,
mg brzolhat rtk gy:
1000 0000 0000 0000
2
= 2
15
= 32768
Eljeltelen (unsigned) esetben nincsenek negatv rtkek. A szmbrzo-
lsi hatrok zrus s
1111 1111 1111 1111
2
= 2
16
1 = 65535
kzttiek.
Az elzk 32 bites esetre ugyanilyen knnyedn levezethetek!
C programnyelv 15
A float (floating point) 4 bjtos, lebegpontos belsbrzols vals t-
pus, ahol a mantissza s eljele 3 bjtot, s a karakterisztika eljelvel egy
bjtot foglal el. Az brzolsi hatrok: 3.4*10
-38
3.4*10
+38
. Ez a man-
tissza mret 6 7 decimlis jegy pontossgot tesz lehetv.
Nhny programfejleszt rendszer a lebegpontos knyvtrakat
(LIB) csak akkor kapcsolja be a kapcsolszerkeszt ltal keressnek al-
vethet knyvtrak kz, ha a programban egyltaln igny jelentkezik
valamilyen lebegpontos brzols, vagy mvelet elvgeztetsre.
A PELDA2.C vgrehajthat rsznek els ngy utastsa rtkads.
e Ki kell azonban hangslyozni, hogy a Cben nincs rtkad utas-
ts, csak hozzrendels opertor, s a hozzrendelsekbl azrt lesz utas-
ts, mert ;t rtunk utnuk.
A hozzrendelsre rgtn visszatrnk! Vegyk szre elbb az
egsz konstans rsszablyt! Elhagyhat eljellel kezddik, s ilyenkor
pozitv, s ezutn az egsz szm jegyei kvetkeznek.
A fejlc sort s az alhzst egyetlen printf fggvnyhvssal valstot-
tuk meg. Ltszik, hogy a tblzat oszlopait 9 karakter szlessgre vlasz-
tottuk.
Figyeljk meg, hogy a pontos pozcionlst segtend a fejlc sort
s az alhzst a printfben kt egyms al rt karakterlnc konstansknt
adtuk meg!
A C fordt a csak fehr karakterekkel elvlasztott karakterlnc
konstansokat egyesti egyetlen karakterlnc konstanss, s gy a pldabeli
printfnek vgl is egyetlen paramtere van.
A PELDA2.Cben az elltesztel ciklusutasts kvetkezik, melynek
szintaktikja:
while(kifejezs) utasts
A kifejezs aritmetikai, azaz szmrtk. Az elltesztel ciklusutasts ha-
tsra lpsenknt a kvetkez trtnik:
1. Kirtkeli a fordt a kifejezst. Ha hamis (zrus), akkor vge a cik-
lusnak, s a while-t kvet utasts jn a programban.
2. Ha a kifejezs igaz (nem zrus), akkor az utasts vgrehajtsa, s
aztn jbl az 1. pont kvetkezik.
Vilgos, hogy a kifejezs rtknek valahogyan vltoznia kell az
utastsban, klnben a ciklusnak soha sincs vge. Az utasts llhat tbb
utastsbl is, csak {}be kell tenni ket. A {}ben ll tbb utastst
16 BEVEZETS S ALAPISMERETEK
sszetett utastsnak nevezik. Az sszetett utasts szintaktikailag egyet-
len utastsnak minsl.
A PELDA2.Cben a while kifejezse relci. A relcijelek a szokso-
sak: kisebb (<), kisebb egyenl (<=), nagyobb (>) s nagyobb egyenl
(>=). A relci kt lehetsges rtke: az igaz s a hamis logikai rtk. A
Cben azonban nincsen logikai adattpus, gy az igaz az 1 egsz rtk, s
a zrus a hamis.
A pldabeli bels blokk els s utols utastsa hozzrendels, melynek
szintaktikai alakja:
objektum = kifejezs
A hozzrendels opertor (mveleti jel) bal oldaln valami olyan objek-
tumnak kell llnia, ami rtket kpes felvenni. A szaknyelv ezt mdost-
hat balrtknek nevezi. Pldnkban az sszes hozzrendels bal oldaln
egy vltoz azonostja ll. Az = jobb oldaln meghatrozhat rtk ki-
fejezsnek (jobbrtknek) kell helyet foglalnia. A hozzrendels hatsra a
kifejezs rtke - esetlegesen az objektum tpusra trtnt konverzi utn -
fellrja az objektum rtkt. Az egsz konstrukci rtke az objektum
j rtke, s tpusa az objektum tpusa.
A legutbbi mondat azt clozza, hogy ha a hozzrendels kifejezs
rsze, akkor ez az rtk s tpus vesz rszt a kifejezs tovbbi kirtkel-
sben.
A begyazott blokkbeli kt hozzrendels kifejezse aritmetikai. Az arit-
metikai mveleti jelek a szoksosak: sszeads (+), kivons (), szorzs
(*) s az oszts (/).
Vegyk szre, hogy az eddigi printf fggvnyhvsainknak egyetlen
karakterlnc konstans paramtere volt, mely vltozatlan tartalommal je-
lent meg a karakteres kpernyn! A bels blokkbeli printfben viszont
hrom aktulis paramter van: egy karakterlnc konstans, egy int s egy
float. A gond ugye az, hogy az int s a float paramter rtkt megjelen-
tets eltt karakterlncc kne konvertlni, hisz binris bjtok kpernyre
vitelnek semmifle rtelme nincs!
A printf els karakterlnc paramtere
- karakterekbl s
- formtumspecifikci kbl
ll. A karakterek vltozatlanul jelennek meg a kpernyn, a formtumspe-
cifikcik viszont meghatrozzk, hogy a printf tovbbi paramtereinek
C programnyelv 17
rtkeit milyen mdon kell karakterlncc alaktani, s aztn ezt hogyan
kell megjelentetni.
A formtumspecifikci % jellel indul s tpuskarakterrel zrul. A for-
mtumspecifikcik s a printf tovbbi paramterei balrl jobbra haladva
rendre sszetartoznak. St ugyanannyi formtumspecifikci lehet csak,
mint ahny tovbbi paramter van.
Felsorolunk nhny tpuskaraktert a kvetkez tblzatban:
Tpuskarakter A hozztartoz
paramter tpusa
Megjelents
d egsz tpus decimlis egszknt
f lebegpontos tizedes trt alakjban
c egy karakter karakterknt
s karakterlnc karakterlncknt
A formtumspecifikci pontosabb alakja:
%<szlessg><.pontossg>tpuskarakter
A <>be ttel az elhagyhatsgot hivatott jelezni. A szlessg annak a
meznek a karakteres szlessgt rgzti, amiben a karakterlncc konver-
tlt rtket alaprtelmezs szerint jobbra igaztva, s balrl szkzfeltl-
tssel kell megjelentetni. Ha a szlessget elhagyjuk a formtumspecifi-
kcibl, akkor az adat a szksges szlessgben jelenik meg. Maradjunk
annyiban pillanatnyilag, hogy a pontossg lebegpontos esetben a tizedes
jegyek szmt hatrozza meg!
Lssuk be, hogy a "%9d|%9.2f\n" karakterlnc konstansbl a %
9d s a %9.2f formtumspecifikcik, mg a | s a \n sima karakterek!
Vegyk szre, hogy a nagy pozcionlgats helyett tblzatunk fejlc
sornak s alhzsnak megjelentetst gy is rhattuk volna:
printf("%9s|%9s\n---------+---------\n",
"Forint", "Eur");
Foglalkoznunk kell mg egy kicsit a mveletekkel! Vannak
- egyoperandusos (opertor operandus) s
- ktoperandusos (operandus opertor operandus)
mveletek. Az egyoperandusos opertorokkal kevs problma van. Az
eredmny tpusa tbbnyire egyezik az operandus tpusval, s az rtke az
operandus rtkn vgrehajtva az opertort. Pldul: vltoz. Az ered-
mny tpusa a vltoz tpusa, s az eredmny rtke a vltoz rtknek
1szerese.
18 BEVEZETS S ALAPISMERETEK
Problmk a ktoperandusos mveleteknl jelentkezhetnek, s ha-
nyagoljuk el a tovbbiakban az eredmny rtkt! Ha ktoperandusos m-
veletnl a kt operandus tpusa azonos, akkor az eredmny tpusa is a k-
zs tpus lesz. Ha a kt operandus tpusa eltr, akkor a fordt a rvidebb,
pontatlanabb operandus rtkt a hosszabb, pontosabb operandus tpusra
konvertlja, s csak ezutn vgzi el a mveletet. Az eredmny tpusa ter-
mszetesen a hosszabb, pontosabb tpus. A ft/244.5 osztsban a ft
egsz tpus s a 244.5 konstans lebegpontos. A mvelet elvgzse
eltt a ft rtkt lebegpontoss alaktja a fordt, s csak ezutn hajtja
vgre az osztst. Az eredmny teht ugyancsak lebegpontos lesz. Ezt
implicit tpuskonverzinak nevezik.
Vegyk szre kzben a vals konstans rsszablyt is! Elhagyhat
eljellel kezddik, amikor is pozitv, s aztn az egsz rsz jegyei jnnek.
Aztn egy tizedespont utn a trt rsz szmjegyei kvetkeznek.
e A problma a ms nyelv programoz szmra egszek osztsnl
jelentkezik, hisz egszek osztsnak eredmnye is egsz, s nincs semmi-
fle maradkmegrzs, lebegpontos talakts!
Ttelezzk fel, hogy 50 fillrrel cskkent az eur rfolyama! Alakt-
suk csak t az euro=ft/244.5 hozzrendelst euro=ft/244re, s
rgtn lthatjuk, hogy az eredmnyekben sehol sincs trt rsz!
Felvetdik a krds, hogyan lehetne ilyenkor a helyes rtket meg-
hatrozni? A vlasz: explicit tpusmdosts segtsgvel, melynek szin-
taktikai alakja:
(tpus)kifejezs
Hatsra a kifejezs rtkt tpus tpusv alaktja a fordt. A konkrt
esetben az oszts legalbb egyik operandust floatt kne mdostani, s
ugye akkor a ktoperandusos mveletekre megismert szably szerint a
msik operandus rtkt is azz alaktan a fordt a mvelet tnyleges el-
vgzse eltt, azaz:
euro = (float)ft / 244;
Megoldand feladatok:
Ksztsen programot, mely a kperny 21 sorszor 21 oszlopos terletn
a csillag karakter felhasznlsval megjelentet:
- Egy keresztet a 11. sor s 11. oszlop feltltsvel! {PLUSSZ.C}
- A ftlt (bal fels sarokbl a jobb alsba ment)!
- A mellktlt (a msik tlt)!
C programnyelv 19
- Egyszerre mindkt tlt, azaz egy X-et! {IKSZ.C}
A forinteur tszmtsi tblzatot elkszt PELDA2.C megold-
sunkkal az a baj, hogy tl sok vltozt hasznlunk. Knnyen belthat-
juk, hogy az fttl eltekintve a tbbi vltoz nem is az, hisz a program fu-
tsa alatt nem vltoztatja meg egyik sem az rtkt!
Ksztsnk PELDA3.C nven egy jobb megoldst!
/* PELDA3.C: Forint-eur tszmtsi tblzat */
#include <stdio.h>
void main(void){
int ft;
printf("%9s|%9s\n---------+---------\n",
"Forint", "Eur");
for(ft=100; ft<=1000; ft=ft+100)
printf("%9d|%9.2f\n", ft, ft/244.5); }
PELDA3.C programunkban kt j dolog lthat. Az egyik a
for(<initkifejezs>; <kifejezs>; <lptetkifejezs>) utasts
elltesztel, iteratv ciklusutasts, melynek vgrehajtsa a kvetkez l-
psek szerint trtnik meg:
1. A fordt vgrehajtja az initkifejezst, ha van. Az elhagyhatsgot
most is <> jelekkel szemlltetjk!
2. Kirtkeli a kifejezst. Ha hamis (zrus), akkor vge a ciklusnak, s a
for-t kvet utasts jn a programban. Lthat, hogy a szintaktika
szerint ez a kifejezs is elhagyhat. Ilyenkor 1nek (igaznak) min-
sl.
3. Ha a kifejezs igaz (nem zrus), akkor az utasts vgrehajtsa jn.
Az utasts most is lehetne sszetett utasts is!
4. Vgl az ugyancsak elhagyhat lptetkifejezs, majd jbl a 2.
pont kvetkezik.
Ha a for utastst while-lal szeretnnk felrni, akkor azt gy tehetjk
meg:
<initkifejezs>;
while(kifejezs) { utasts; <lptetkifejezs>; }
A szintaktikai szablyt sszefoglalva: a for-bl akr mindegyik kife-
jezs is elhagyhat, de az els kettt zr pontosvesszk nem!
A PELDA3.C programbeli msik j dolog az, hogy a printf aktulis
paramtereknt kifejezs is megadhat.
20 BEVEZETS S ALAPISMERETEK
A PELDA3.C ugyan sokat rvidlt, de ezzel a megoldssal meg az
a problma, hogy tele van varzskonstansokkal. Ha megvltoztatnnk t-
szmtsi tblzatunkban a tartomny als, ill. fels hatrt, mdostannk
a lpskzt, vagy az eur rfolyamot, akkor ennek megfelelen t kellene
rnunk varzskonstansainkat is. Az ilyen trogats 8 soros programnl
knnyen, s remlhetleg hibamentesen megvalsthat. Belthat azon-
ban, hogy nagymret, esetleg tbb forrsfjlbl ll szoftver esetben,
amikor is a varzskonstansok rengeteg helyen elfordulhatnak, ez a
mdszer megbzhatatlan, vagy legalbb is nagyon hibagyans.
A C a problma megoldsra a szimbolikus konstansok, vagy ms meg-
nevezssel: egyszer makrk, hasznlatt javasolja. A metdus a kvetke-
z:
1. Definilni kell a benne hasznlatos szimbolikus llandkat egy he-
lyen, egyszer, a forrsfjl elejn.
2. Aztn a programban vgig a konstansok helyett szisztematikusan a
szimbolikus konstansokat kell hasznlni.
A vltoztats is nagyon egyszerv vlik gy:
- a megvltozott konstans rtkt egy helyen t kell rni, s
- a tbbi felhasznlsa automatikusan mdosul a kvetkez fordts-
nl.
A szimbolikus lland a
#define azonost helyettestszveg
elfeldolgoz direktvval definilhat. A szimbolikus lland tulajdon-
kppen az azonost a direktva helytl a forrsszveg vgig van r-
vnyben. Az elfeldolgoz kihagyja a direktvt a forrsszvegbl, majd
vgigmegy rajta, s az azonost minden elfordulst helyettestszveg-
re cserli.
Lssuk a medvt!
/* PELDA4.C: Forint-eur tszmtsi tblzat */
#include <stdio.h>
#define ALSO 100 /* A tartomny als hatra */
#define FELSO 1000 /* A tartomny fels rtke */
#define LEPES 100 /* A lpskz */
#define ARFOLYAM 244.5 /* Ft/eur rfolyam */
void main(void){
int ft;
printf( "%9s|%9s\n---------+---------\n",
"Forint", "Eur");
for(ft=ALSO; ft<=FELSO; ft=ft+LEPES)
printf("%9d|%9.2f\n", ft, ft/ARFOLYAM); }
C programnyelv 21
Szoks mg klnsen tbb forrsmodulos esetben a #define direk-
tvkat (s mg ms dolgokat) kln fejfjlban elhelyezni, s aztn ezt min-
den forrsfjl elejn #include direktvval bekapcsolni.
Ksztsk csak el ezt a varicit is!
/* BEGEND.H: Fejfjl az tszmtsi tblhoz */
#include <stdio.h>
#define ALSO 100 /* A tartomny als hatra */
#define FELSO 1000 /* A tartomny fels rtke */
#define LEPES 100 /* A lpskz */
#define ARFOLYAM 244.5 /* Ft/eur rfolyam */
#define begin { /* {} helyett begin-end! */
#define end }
#define then /* if utastsban then! */
#define LACI for /* Kulcsszavak tdefinilsa
nem javasolt! */
/* PELDA5.C: Forint-eur tszmtsi tblzat */
#include "BEGEND.H"
void main(void)
begin
int ft;
printf("%9s|%9s\n---------+---------\n",
"Forint", "Eur");
LACI(ft=ALSO; ft<=FELSO; ft=ft+LEPES)
printf("%9d|%9.2f\n", ft, ft/ARFOLYAM);
end
Vegyk szre, hogy az #include direktva fjlazonostja nem <>k,
hanem k kztt ll! Ennek hatsra az elfeldolgoz a megadott azo-
nostj fjlt elszr az aktulis mappban abban a knyvtrban, ahol az
a .C fjl is elhelyezkedik, melyben a #include direktva volt keresi. Ha
itt nem tallja, akkor tovbbkeresi a programfejleszt rendszerben bell-
tott utakon.
3.6 Bemenet, kimenet
A kiss lergott csont forinteur tszmtsi tblzatos pldnkban
nem volt bemenet. Megtanultuk mr, hogy a szabvny bemenet s kime-
net hasznlathoz be kell kapcsolni az STDIO.H fejfjlt:
#include <stdio.h>
Alaprtelmezs szerint szabvny bemenet (stdin) a billentyzet, s
szabvny kimenet (stdout) a kperny. A legtbb opercis rendszerben
azonban mindkett tirnythat szvegfjlba is.
Egy karaktert olvas be a szabvny bemenetrl az
int getchar(void);
22 BEVEZETS S ALAPISMERETEK
fggvny. Ezt aztn balrl zrus feltltssel intt tpusmdostja, s
visszaadja a hvnak.
Azt, ahogyan az elbb a getchart lertuk, fggvny prototpusnak
nevezik. A fggvny prototpus teljes formai informcit szolgltat a
szubrutinrl, azaz rgzti:
- a fggvny visszatrsi rtknek tpust,
- a fggvny nevt,
- paramtereinek szmt, sorrendjt s tpust.
A getchar fjl vgn, vagy hiba esetn EOFot szolgltat.
Az EOF az STDIO.H fejfjlban definilt szimbolikus lland:
#define EOF (1)
Tekintsk csak meg az STDIO.H fejfjlban! Nzegets kzben vegyk
azt is szre, hogy a fejfjl tele van fggvny prototpusokkal.
Mr csak az a krds maradt, hogy mi a fjlvg a szabvny bemene-
ten, ha az a billentyzet? Egy opercis rendszertl fgg billentykombi-
nci: Ctrl+Z vagy Ctrl+D.
A paramter karaktert kiviszi a szabvny kimenet aktulis pozcijra az
int putchar(int k);
s sikeres esetben vissza is adja ezt az rtket. A hibt pp az jelzi, ha a
putchar szolgltatta rtk eltr ktl.
Ksztsnk programot, ami a szabvny bemenetet tmsolja a szabvny
kimenetre!
/* PELDA6.C: Bemenet msolsa a kimenetre */
#include <stdio.h>
void main(void){
int k;
printf("Bemenet msolsa a kimenetre:\n"
"Gpeljen Ctrl+Z-ig sorokat!\n\n");
k=getchar();
while(k!=EOF){
if(k!=putchar(k))
printf("Hiba a kimeneten!\n");
k=getchar(); } }
Fogalmazzuk meg minimlis elvrsainkat egy programmal szemben!
` A szoftver indulsakor jelezze ki, hogy mit csinl!
C programnyelv 23
Ha valamilyen eredmnyt kzl, akkor azt lssa el tjkoztat szveg-
gel, mrtkegysggel stb.!
Ha valamit bekr, akkor tjkoztasson rla, hogy mit kell megadni, mi-
lyen egysgben stb.!
A bemenet ellenrzend! A hibs adat helyett a hiba okt esetleg kije-
lezve azonnal krjen jat a program!
A <, <=, >, >= relcijelekrl mr sz volt! A Cben != a nem egyenl
opertor s == az egyenl mveleti jel. Az == s a != radsul a tbbi re-
lcinl eggyel alacsonyabb prioritsi szinten foglal helyet. Kifejezs kir-
tkelse kzben elbb a magasabb priorits mveletet vgzi el a fordt,
s csak aztn kvetkezik az alacsonyabb.
eVigyzat! Az egyenl relcit az egyms utn rt, kt egyenlsg jel
jelzi. Az egyetlen egyenlsg jel a hozzrendels opertor!
A ktirny szelekci szintaktikai alakja:
if(kifejezs) utasts1
<else utasts2>
Az elhagyhatsgot most is a <> jelzi. Ha a kifejezs igaz (nem zrus), ak-
kor utasts1 vgrehajtsa kvetkezik. Ha a kifejezs hamis (zrus) s van
else rsz, akkor az utasts2 kvetkezik. Mindkt utasts sszetett utas-
ts is lehet.
A PELDA6.C megoldsunk tlzottan nem C z. Cben programunk
utols 5 sort gy kne megrni:
while((k=getchar())!=EOF)
if(k!=putchar(k))
printf("Hiba a kimeneten!\n");
A while kifejezse egy nem egyenl relci, melynek bal oldali ope-
randusa egy kln zrjelben ll hozzrendels. Elbb a hozzrendels
jobb oldalt kell kirtkelni. Lssuk csak sorban a kirtkels lpseit!
1. Meghvja a getchar fggvnyt a fordt.
2. A visszakapott rtkkel fellrja k vltoz rtkt.
3. A getchartl kapott rtket hasonltja EOFhoz.
eA kifejezsbl a hozzrendels krli kln zrjel nem hagyhat el,
mert a hozzrendels alacsonyabb priorits mvelet a relcinl. Ha
mgis elhagynnk, akkor a kirtkels sorn a fordt:
1. Meghvn elbb a getchar fggvnyt.
24 BEVEZETS S ALAPISMERETEK
2. A visszatrsi rtket hasonltan EOFhoz. Teht kapna egy logi-
kai igaz (1), vagy hamis (0) rtket!
3. A k vltoz felvenn ezt az 1, vagy 0 rtket.
Figyeljk meg a PELDA6.C futtatsakor, hogy a getchar a beme-
netrl olvasott karaktereket az opercis rendszer billentyzet pufferbl
kapja! Emlkezznk csak vissza! A parancssorban a begpelt szveget
szerkeszthetjk mindaddig, mg Entert nem nyomunk. A billentyzet
pufferben lev karakterek teht csak akkor llnak a getchar rendelkezs-
re, ha a felhasznl lettte az Enter billentyt.
Ksztsnk programot, mely fjlvgig leszmllja, hogy hny
- numerikus karakter,
- fehr karakter,
- ms egyb karakter s
- sszesen hny karakter
rkezett a szabvny bemenetrl!
Megoldsunkban az sszes vltoz egsz tpus. k tartalmazza a beolva-
sott karaktert. A num, a feher s az egyeb szmllk. Az algoritmus:
- Deklarljuk a vltozkat, s az sszes szmllt lssuk el zrus kez-
drtkkel!
- Jelentessk meg a program cmt, s tjkoztassunk a hasznlatrl!
- Mkdtessk addig a ciklust, mg EOF nem rkezik a bemenetrl!
- A ciklusmagban hromirny szelekci segtsgvel el kell gazni a
hrom kategria fel, s ott meg kell nvelni eggyel a megfelel
szmllt!
- A ciklus befejezdse utn megjelentetendk a szmllk rtkei
megfelel tjkoztat szvegekkel, s az is, hogy sszesen hny ka-
rakter rkezett a bemenetrl!
/* PELDA7.C: A bemenet karaktereinek
leszmllsa kategrinknt */
#include <stdio.h>
void main(void){
short k, num, feher, egyeb;
num=feher=egyeb=0;
printf("Bemeneti karakterek leszmllsa\n"
"kategrinknt EOF-ig, vagy Ctrl+Z-ig.\n");
while((k=getchar())!=EOF)
C programnyelv 25
if(k>='0'&&k<='9')++num;
else if(k==' '||k=='\n'||k=='\t')++feher;
else ++egyeb;
printf("Karakter szmok:\n"
"----------------\n"
"numerikus: %5hd\n"
"fehr: %5hd\n"
"egyb: %5hd\n"
"----------------\n"
"ssz: %10ld\n",
num, feher, egyeb,
(long)num+feher+egyeb); }
Pontostani kell a deklarcis utasts eddig megismert szintaktikjt!
<tpusmdostk> <alaptpus> azonostlista;
Az elhagyhat alaptpus alaprtelmezs szerint int. Az ugyancsak elhagy-
hat tpusmdostk az alaptpus valamilyen jellemzjt vltoztatjk meg.
int tpus esetn:
- Az egsz alaprtelmezs szerint eljeles (signed), s lehetne mg
eljeltelen (unsigned). A signed s az unsigned mdostk egy-
mst kizrak.
- Kt, egymst kizr hosszmdostval az egsz belsbrzolsa
- bizonyosan 16 bites (short), ill.
- biztos 32 bites (long).
Vgl is a klnfle int tpusok mretei gy sszegezhetk:
short <= int <= long
Vegyk szre, hogy az ismertetett szablyok szerint a short, a short
int s a signed short int azonos tpusok. A short s a short int rsmd-
nl figyelembe vettk, hogy signed az alaprtelmezs. A short felrsakor
mg arra is tekintettel voltunk, hogy a meg nem adott alaptpus alaprtel-
mezse int. Ugyanezek mondhatk el a long, a long int s a signed long
int vonatkozsban is.
e Ugyan a szintaktika azt mutatja, de a deklarcis utastsban a t-
pusmdostk s az alaptpus egyszerre nem hagyhatk el!
Feltve, hogy a, b s c balrtkek, az
a=b=c=kifejezs
rtelmezse megint abbl fakad, hogy a hozzrendels a Cben opertor,
azaz:
a=(b=(c=kifejezs))
26 BEVEZETS S ALAPISMERETEK
A fordt jobbrl balra halad, azaz kirtkeli a kifejezst, s vissza-
fel jvet berja az eredmnyt a balrtkekbe.
A konstrukci hatsra a fordt gyorsabb kdot is hoz ltre. Ugyan-
is a
c=kifejezs;
b=kifejezs;
a=kifejezs;
rsmdnl hromszor kell kirtkelni ugyanazt a kifejezst.
Cben a tbbg (N) szelekcira az egyik kdolsi lehetsg:
if(kifejezs1)utasts1
else if(kifejezs2)utasts2
else if(kifejezs3)utasts3
/* . . . */
else utastsN
Ha valamelyik if kifejezse igaz (nem zrus) a konstrukciban, akkor a
vele azonos sorszm utasts vgrehajtsa kvetkezik, majd a konstruk-
cit kvet utasts jn. Ha minden kifejezs hamis (zrus), akkor viszont
utastsN hajtand vgre.
Fedezzk fel a karakter konstans rsszablyt: aposztrfok kztt
karakter, vagy escape szekvencia.
A karakter konstans belsbrzolsa int, gy az ASCII kd egsz r-
tknek is minsl kifejezsekben.
A PELDA7.Cbl lthat, hogy a logikai s mveletet && jelli, s
a logikai vagy opertor a ||.
A ktoperandusos logikai opertorok prioritsa alacsonyabb a rel-
ciknl, s az && magasabb priorits, mint a ||. Ha a ktoperandusos lo-
gikai mvelet eredmnye eldl a bal oldali operandus kirtkelsvel, ak-
kor a C bele sem kezd a msik operandus rtkelsbe. Az s mvelet
eredmnye eldlt, ha a bal oldali operandus hamis. A vagy pedig akkor
ksz, ha az els operandus igaz.
A Cben van inkrementls (++) s dekrementls () egsz rtkekre.
Mindkt mvelet egyoperandusos, teht nagyon magas priorits. A ++
operandusa rtkt eggyel nveli meg, s a pedig eggyel cskkenti,
azaz:
++vltoz vltoz=vltoz+1
--vltoz vltoz=vltoz1
C programnyelv 27
e A problmk ott kezddnek azonban, hogy mindkt mvelet ltezik
eltag (prefix) s uttag (postfix) opertorknt is!
Foglalkozzunk csak a ++ opertorral! A ++vltoz s a vltoz++
hatsra a vltoz rtke eggyel mindenkpp megnvekedik. Kifejezs r-
szeknt eltag opertor esetn azonban a vltoz j rtke vesz rszt a to-
vbbi kirtkelsben, mg uttag mveletnl a vltoz eredeti rtke sz-
mt be. Feltve, hogy a s b egsz tpus vltozk, s b rtke 6:
a = ++b; /* a=7 s b=7 */
a = b++; /* a=7 s b=8 */
Figyeljnk fel r, hogy a PELDA7.C utols printf utastsban
hosszmdostk llnak a d tpuskarakterek eltt a formtumspecifikcik-
ban! Ltszik, hogy a h jelzi a printfnek, hogy a formtumspecifikci-
hoz tartoz aktulis paramter short tpus (2 bjtos), ill. l tudatja vele,
hogy a hozztartoz aktulis paramter long (4 bjtos).
e A megfelel hosszmdostk megadsa a formtumspecifikcik-
ban elengedhetetlen, hisz nem mindegy, hogy a fggvny a verem kvet-
kez hny bjtjt tekinti a formtumspecifikcihoz tartoznak!
Vegyk azt is szre, hogy a tpusokhoz a mezszlessggel is felk-
szltnk: a maximlis pozitv short rtk bizonyosan elfr 5 pozcin, s
long pedig 10en!
Lthat mg, hogy arra is vigyztunk, hogy a hrom maximlis
short rtk sszege rszeredmnyknt se csonkuljon! Ezrt az explicit
longg mdosts a printf utols paramterben:
(long)num+feher+egyeb
Megoldand feladatok:
Ksztsen programokat a PELDA4.C alapjn a kvetkezkppen:
- A forint 1000-tl 100ig cskkenjen 100asval!
- Az eur nvekedjk 1tl 10ig egyesvel!
- A forint 100tl 2000ig nvekedjen 100asval! Az eredmnyt a
kpernyn fejlccl elltva kt oszlop prban oszlopfolytonosan ha-
ladva kell megjelentetni. A bal oldali oszlop pr 100zal, a jobb ol-
dali viszont 1100zal kezddjk!
- A feladat maradjon ugyanaz, mint az elbb, de a megjelentets le-
gyen sorfolytonos. A bal oldali oszlop pr kezddjk 100zal, a
jobb oldali viszont 200zal, s mindegyik oszlop prban 200 legyen
a lpskz!
28 BEVEZETS S ALAPISMERETEK
- Maradva a sorfolytonos megjelentetsnl, krjk be elbb a kijel-
zend oszlop prok szmt ellenrztt inputtal! Az oszlop prok
szma 1, 2, 3 vagy 4 lehet. A mg kijelzend fels rtk ennek meg-
felelen 1000, 2000, 3000 vagy 4000. Az eredmny a kpernyn
fejlccl elltva az elrt szm oszlop prban jelenjen meg gy,
hogy 100 tovbbra is a lpskz! {TOBBOSZL.C}
- A forint 100tl 10000ig nvekedjen 100asval! A lista nem fut-
hat el a kpernyrl, azaz fejlccl elltva lapozhatan kell megje-
lentetni! Ez azt jelenti, hogy elszr kiratjuk a lista egy kperny
lapnyi darabjt, majd vrunk egy gombnyomsra. A gomb letse-
kor produkljuk a lista kvetkez lapjt, s jbl vrunk egy gomb-
nyomsra, s gy tovbb. {LAPOZ.C}
- Legyen ugyanaz a feladat, mint az elz pontban, de a lista a kper-
nyn fejlccl elltva nem csak elre, hanem elrehtra lapozhat-
an jelenjen meg!
Ksztsen programokat, melyek a szabvny bemenetet EOFig olvas-
sk, s kzben megllaptjk, hogy:
- Hny sor volt a bemeneten? A bemenet karakterei kzt a \neket
kell leszmllni. Az utols sor persze lehet, hogy nem \nnel vg-
zdik, hanem EOFfal.
- Hny sz volt a bemeneten? A sz nem fehr karakterekbl ll. A
szavakat viszont egymstl fehr karakterek vlasztjk el. Az utols
sz lehet, hogy nem fehr karakterrel zrul, hanem EOFfal.
3.7 Tmbk
Ksztsnk programot, mely a szabvny bemenetet olvassa EOF-ig!
Megllaptand s kijelzend, hogy hny A, B, C stb. karakter rkezett! A
kis s nagybetk kztt nem tesznk klnbsget! A betkn kvli tb-
bi karaktert tekintsk egy kategrinak, s ezek darabszmt is jelezzk ki!
Megoldsunkban az elvalaszto karakteres vltoz, a k, a tobbi s a betu
viszont egsz tpus. A k tartalmazza a beolvasott karaktert, s ciklusvl-
tozi funkcikat is ellt. A tobbi s a betu szmllk. A betu annyi ele-
m tmb, mint ahny bet az angol bcben van. A tobbi a betkn k-
vli tbbi karakter szmllja. Az elvalaszto karakteres vltozra azrt
van szksg, mert az eredmny csak kt oszlop pros listaknt kzlhet
egy kpernyn. Az algoritmus:
C programnyelv 29
- Deklarljuk a vltozkat, s a tmbt! A szmllk nullzandk!
Az elvalaszto induljon szkz kezdrtkkel!
- Jelentessk meg a program cmt, s tjkoztassunk a hasznlatrl!
- Mkdtessk addig a ciklust, mg EOF nem rkezik a bemenetrl!
- A ciklusmagban hromirny szelekcival el kell gazni hrom ka-
tegria fel: nagybet, kisbet s ms karakter. Megnvelend
eggyel termszetesen a megfelel szmll!
- A ciklus befejezdse utn kt oszlop pros tblzatban megjelente-
tendk a betszmllk rtkei, s vgl egy kln sorban a tbbi
karakter kategria szmllja!
/* PELDA8.C: Betszmlls a bemeneten */
#include <stdio.h>
#define BETUK 26 /* Az angol bc betszma */
void main(void){
char elvalaszto; /* Listelvlaszt karakter. */
int k, /* Bemeneti kar. s ciklusvltoz. */
tobbi, /* Nem betk szmllja. */
betu[BETUK]; /* Betszmllk. */
tobbi=0; /* Kezdrtk ads. */
for(k=0; k<BETUK; ++k) betu[k]=0;
elvalaszto=' ';
printf("Bemenet betinek leszmllsa\n"
"EOF-ig, vagy Ctrl+Z-ig.\n");
while((k=getchar())!=EOF)
/* Nagybetk: */
if(k>='A'&&k<='Z')++betu[k-'A'];
/* Kisbetk: */
else if(k>='a'&&k<='z')++betu[k-'a'];
/* Ms karakterek: */
else ++tobbi;
/* Eredmnyek kzlse: */
printf("\nBet|Darab Bet|Darab\n"
"----+----- ----+-----\n");
for(k=0; k<BETUK; ++k){
printf("%4c|%5d%c", k+'A', betu[k], elvalaszto);
if(elvalaszto==' ') elvalaszto='\n';
else elvalaszto=' '; }
printf("\nTbbi karakter: %5d\n", tobbi); }
A char tpus vltoz egyetlen karakter trolsra alkalmas. A char
ugyanakkor 8 bites, alaprtelmezs szerint eljeles (signed), fixpontos
belsbrzols egsz tpus is 0111 1111
2
= 2
7
1 = 127 s 1000 0000
2
=
2
7
= 128 brzolsi hatrokkal. Az unsigned char 0 s 255 kztti b-
rzolsi lehetsgekkel rendelkezik.
30 BEVEZETS S ALAPISMERETEK
A legtbb programfejleszt rendszerben az unsigned char alaprtelme-
zsknt is bellthat karakter tpus.
A PELDA8.Cbl kitnen ltszik, hogy a tmb defincija
tpus tmbazonost[mret];
alak. Pontosabban a deklarcis utasts azonostlistja nem csak egy-
szer vltozk azonostibl llhat, hanem tmbazonost[mret] konst-
rukcik is lehetnek kztk. A tmbdefinciban a mret pozitv, egsz r-
tk lland kifejezs, s a tmb elemszmt hatrozza meg.
lland kifejezs az, aminek fordtsi idben kiszmthat az rt-
ke.
A tmb egy elemnek helyfoglalsa tpustl fgg. Az egsz tmb a me-
mriban sszesen
sizeof(tmbazonost) mret*sizeof(tpus)
bjtot ignyel. Pldul 16 bites intet felttelezve a sizeof(betu) 26*si-
zeof(int) pontosan 52.
A magas priorits, egyoperandusos sizeof opertor megadja a m-
gtte zrjelben ll objektum, vagy tpus ltal elfoglalt bjtok szmt.
A tmb egy elemre val hivatkozst indexes vltoznak is nevezik s
szintaktikailag a kvetkez:
tmbazonost[index]
ahol az index nem negatv rtk egsz kifejezs
0 <= index <= mret1
rtkhatrokkal.
e A tmbindexels Cben mindig zrustl indul, s a legnagyobb mg
ltez indexrtk a mret1! Pldul a betu tmbnek ltezik betu[0],
betu[1], betu[2], s vgl betu[BETUK1] eleme, s ezek gy helyezked-
nek el a memriban:
betu[0] betu[1] betu[2] . . . betu[24] betu[25]
Vegyk szre, hogy a betu[0]ban a program az A, a betu[1]ben a
B, , s a betu[25]ben a Z karaktereket szmllja! Ttelezzk fel, hogy
k rtke 68! Ez ugyebr a D bet ASCII kdja. Ilyenkor a betu[kA]
szmll n eggyel. Az A ASCII kdja 65. Teht betu[6865]rl, azaz
betu[3] nvelsrl van sz!
Figyeljnk fel mg arra, hogy az eredmnyeket kzl ciklusbeli
printfben a k+A egsz kifejezs rtkt %c formtumspecifikcival
C programnyelv 31
jelentetjk meg, azaz rendre 65t, 66ot, 67et stb. ratunk ki karaktere-
sen, teht At, Bt, Ct stb. ltunk majd.
Lssuk mg be, hogy az elvalaszto vltoz rtke szkz s sor-
emels karakter kzt vltakozik, s gy kt betdarab pr kpes megjelen-
ni egy sorban. Teht az elvalaszto vltoz segtsgvel produkljuk a kt
oszlop pros eredmnylistt.
` Listzni csak azt rdemes, ami valamilyen informcit hordoz!
Teht a zrus darabszm betk kijelzse teljesen felesleges! Magyarn
a for ciklusbeli printfet gy kne mdostani:
if(betu[k]>0) printf("%4c|%5d%c", k+'A',
betu[k], elvalaszto);
Megoldand feladatok:
Fokozza gy a PELDA8.Cben megoldott feladatot, hogy megszmll-
ja a magyar kezetes kis s nagybetket is!
Ksztsen programot, mely a szabvny bemenetet EOFig olvassa!
Szmllja meg s jelezze ki, hogy hny 0, 1, 2 stb. karakter rkezik! A
nem numerikus karaktereket tekintse egy kategrinak, s ezek szmt is
kzlje!
3.8 Fggvnyek
A fggvnyeket tbbflekppen csoportosthatnnk, de a legpraktiku-
sabb gy, hogy:
- Vannak elre megrtak. Knyvtrakban (.LIB), vagy trgymodulok-
ban (.OBJ) tallhatk, s a kapcsol-szerkeszt kapcsolja be ket a
vgrehajthat fjlba. Pldul: a printf, a getchar, a putchar, vagy a
main stb. Minden vgrehajthat programban kell lennie egy fgg-
vnynek, az indt programnak (a main-nek), mely az egsz prog-
ram belpsi pontjt kpezi.
- Mi rjuk ket. Forrsfjlokban helyezkednek el, s kdjukat a fordt
generlja.
A nyelv kzponti eleme a fggvny. A ms programozsi nyelvekben
szoksos eljrs (procedure) itt explicit mdon nem ltezik, mert a C szel-
lemben az egy olyan fggvny, aminek nincs visszaadott rtke:
void eljrs();
Jelezzk ki egy tblzatban az 1001 s 1010 kztti egsz szmok k-
bt!
32 BEVEZETS S ALAPISMERETEK
/* PELDA9.C: Kbtblzat */
#include <stdio.h>
#define TOL 1001 /* A tartomny kezdete. */
#define IG 1010 /* A tartomny vge. */
long kob(int); /* Fggvny prototpus. */
void main(void){
int i;
printf(" Szm|%11s\n-----+-----------\n", "Kbe");
for(i=TOL; i<=IG; ++i) /* Fggvnyhvs. */
printf("%5d|%11ld\n", i, kob(i)); }
long kob(int a){ /* Fggvnydefinci. */
return (long)a*a*a; }
A fggvnydefinci s a fggvnyhvs fogalmval megismerkedtnk
mr a Kapcsolszerkeszts fejezetben. A fggvnydefinciban van
meg a fggvny teste, azaz az a kd, amit a fggvny meghvsakor vg-
rehajt a processzor.
e Egy fggvnyre a programban csak egyetlen definci ltezhet, s
ennek nem mondhatnak ellent a prototpusok (deklarcik)!
A fggvnydefinciban elrt visszaadott rtk tpusnak egyeznie kell
ebbl kvetkezleg a programban brhol elfordul, e fggvnyre vonat-
koz prototpusokban (deklarcikban) megadott visszatrsi rtk tpus-
sal. A meghvott fggvny akkor ad vissza rtket a hv fggvnynek a
hvs pontjra, ha a processzor kifejezssel elltott return utastst hajt
vgre benne. A valamit szolgltat fggvnyben teht lennie kell leg-
albb egy return kifejezs; utastsnak, s r is kell, hogy kerljn a ve-
zrls. A visszaadott rtk meghatrozatlan, ha a processzor nem hajt vg-
re return utastst, vagy a return utastshoz nem tartozott kifejezs.
e A visszaadott rtk tpusa brmi lehet vgl is eltekintve a tmbtl
s a fggvnytl. Lehet valamilyen alaptpus, de el is hagyhat, amikor is
az alaprtelmezs lesz rvnyben, ami viszont int.
Nzzk a return szintaktikjt!
return <kifejezs>;
A fordt kirtkeli a kifejezst. Ha a fggvny visszatrsi tpusa tpus,
akkor a kifejezs tpusnak is ennek kell lennie, vagy implicit konverzi-
val ilyen tpusv alaktja a kifejezs rtkt a fordt, s csak azutn adja
vissza.
Lssuk be, hogy a PELDA9.Cbeli returnben az explicit (long)
tpusmdosts nem azrt van, hogy megtakartsuk a kifejezs rtknek
visszaads eltti implicit konverzijt! Az igazi ok az, hogy egy 16 bites
int kbe nem biztos, hogy elfr az intben! Gondoljunk 1000 kbre, ami
1000000000! Ez jval meghaladja a 32767es felsbrzolsi korltot.
C programnyelv 33
e Cben az egsz tpusok terletn nincs sem tlcsorduls, sem alul-
csorduls! Pontosabban ami tlcsordul, vagy alulcsordul, az mindenfle
zenet nlkl elveszik.
A fggvnyhvs truhzza a vezrlst a hv fggvnybl a hvottba
gy, hogy az aktulis paramtereket is tadja ha vannak rtk szerint.
A vezrlst a fggvnytest els vgrehajthat utastsa kapja meg. void
visszatrs fggvny blokkjban aztn a vgrehajts addig folytatdik,
mg kifejezs nlkli return utasts nem kvetkezik, vagy a fggvny
blokkjt zr }-re nem kerl a vezrls. Ezutn a hvsi ponttl folytat-
dik a vgrehajts.
Vegyk szre, hogy a return utasts szintaktikjban az elhagyhat
kifejezs a paramter nlkli returnt kvnta jellni!
Belthat, hogy a fggvny prototpusnak mindig meg kell elznie a h-
vst a forrsszvegben. A fordt gy tisztban van a hvs helyn a fgg-
vny paramtereinek szmval, sorrendjvel s tpusval, ill. ismeri a
fggvny visszatrsi rtknek tpust is.
A fordt a prototpus ismeretben implicit tpuskonverzit is vgrehajt
az aktulis paramter rtkn a fggvnynek trtn tads eltt, ha az ak-
tulis paramter tpusa eltr.
e Ha nincs prototpus, akkor nincs implicit konverzi, s csak a cso-
da tudja, hogy mi trtnik az tadott nem megfelel tpus rtkkel. Pl-
dul a kob(3.0) hvs eredmnye zrus, ami remlhetleg kellen szem-
llteti a prototpus megadsnak szksgessgt.
e Ha nincs prototpus, akkor a fordt azt felttelezi (teht olyan hv-
si kdot generl), hogy a fggvnynek az alaprtelmezs miatt int vissza-
adott rtke van. Ez ugyebr elgg rdekes eredmnyre vezet void, vagy
lebegpontos visszatrs fggvnyek esetben.
A nem int visszaadott rtk fggvnyt legalbb deklarni kell a
hv fggvnyben!
A fggvnydeklarci bemutatshoz trjuk a PELDA9.Ct:
/* PELDA9.C: Kbtblzat */
#include <stdio.h>
#define TOL 1001 /* A tartomny kezdete. */
#define IG 1010 /* A tartomny vge. */
void main(void){
int i;
long kob(); /* Fggvnydeklarci. */
printf(" Szm|%11s\n-----+-----------\n", "Kbe");
for(i=TOL; i<=IG; ++i) /* Fggvnyhvs: */
printf("%5d|%11ld\n", i, kob(i)); }
34 BEVEZETS S ALAPISMERETEK
long kob(int a){ /* Fggvnydefinci. */
return (long)a*a*a; }
Vegyk szre rgtn, hogy deklarcis utastsunk szintaktikja is-
mt mdosult! Az azonostlista nem csak egyszer vltozk azonosti-
bl s tmbazonost[mret] konstrukcikbl llhat, hanem tartalmazhat
fggvnynv()
alakzatokat is.
Termszetesen a teljes fggvny prototpus is berhat a deklrcis uta-
stsba,
long kob(int); /* Fggvnydeklarci. */
de ilyenkor a fggvny prototpus csak ebben a blokkban lesz rvnyben.
Lssuk be, hogy az utbbi mdszer nem ajnlhat olyan tbb fgg-
vnydefincibl ll forrsfjlra, ahol a krdses fggvnyt tbb helyrl
is meghvjk! Sokkal egyszerbb a forrsszveg elejn megadni egyszer a
prototpust, mint minden t hv fggvnyben kln deklarlni a fgg-
vnyt.
A fggvny defincija prototpusnak is minsl, ha megelzi a for-
rsszvegben a fggvnyhvst.
/* PELDA9.C: Kbtblzat */
#include <stdio.h>
#define TOL 1001 /* A tartomny kezdete. */
#define IG 1010 /* A tartomny vge. */
long kob(int a){ /* Fggvnydefinci. */
return (long)a*a*a; }
void main(void){
int i;
printf(" Szm|%11s\n-----+-----------\n", "Kbe");
for(i=TOL; i<=IG; ++i) /* Fggvnyhvs: */
printf("%5d|%11ld\n", i, kob(i)); }
e Cben tilos fggvnydefincin bell egy msikat kezdeni, azaz a
fggvnydefincik nem gyazhatk egymsba!
Ugyan a Tblzat ksztse fejezetben mr rgztettk a fggvny
szerkezett, vagyis a blokkszerkezetet, de itt jra kihangslyozzuk, hogy a
fggvnydefinciban
- elbb a deklarcis utastsok jnnek, s
- a vgrehajthat utastsok csak ezutn kvetkeznek, s
- a kt rsz nem keveredhet egymssal.
C programnyelv 35
Ebben a fejezetben csak az rtk szerinti hvsrl szltunk, vagyis
amikor a formlis paramterek rtkt kapja meg a meghvott fggvny.
Van termszetesen nv (cm) szerinti hvs is a Cben, de ezt most mg
nem trgyaljuk!
3.9 Prodzsekt
Ha a vgrehajthat program forrsszvegt tmnknt, vagy funkcin-
knt klnkln forrsfjlokban kvnjuk elhelyezni, akkor Cs prog-
ramfejleszt rendszerekben ennek semmifle akadly sincs. Be kell azon-
ban tartani a kvetkez szablyokat:
- Egy s csak egy forrsmodulban szerepelnie kell az indt program-
nak (main).
- Prodzsektfjl t kell kszteni, melyben felsorolandk a program tel-
jes szvegt alkot forrsfjlok.
Szedjk szt kt forrsmodulra: FOPROG.Cre s FUGGV.Cre, a
PELDA9.C programunkat!
/* FOPROG.C: Kbtblzat */
#include <stdio.h>
#define TOL 1001 /* A tartomny kezdete. */
#define IG 1010 /* A tartomny vge. */
long kob(int); /* Fggvny prototpus. */
void main(void){
int i;
printf(" Szm|%11s\n-----+-----------\n", "Kbe");
for(i=TOL; i<=IG; ++i) /* Fggvnyhvs: */
printf("%5d|%11ld\n", i, kob(i)); }
/* FUGGV.C: A fggvnydefinci. */
long kob(int a){return (long)a*a*a; }
Hozzunk ltre egy j prodzsektet! Soroljuk fel benne, vagy szrjuk bele
a kt forrsfjlt, s mentsk el, mondjuk, PRODZSI fjlazonostval! A
prodzsektfjl nvadsnl csak arra vigyzzunk, hogy egyetlen benne fel-
sorolt fjl azonostjval se egyezzen meg a neve!
Azrt nem konkretizljuk a prodzsektfjl kiterjesztst, mert az
programfejleszt rendszerenknt msms lehet!
A programfejleszt rendszerben kell lennie olyan menpontoknak,
melyekkel j prodzsektet hozhatunk ltre, meglvt tlthetnk be, nyitha-
tunk meg, menthetnk el, trlhetnk, zrhatunk le stb.
e Betlttt, vagy megnyitott prodzsekt esetn azonban a fejleszt
rendszer mindaddig a prodzsekt fordtsval, kapcsolszerkesztsvel s
futtatsval foglalkozik, mg nem trljk, nem zrjuk be. Akrmilyen
36 BEVEZETS S ALAPISMERETEK
ms forrsfjlokat is nyitogatnnk meg klnfle ablakokban, a program-
fejleszt rendszer az aktulis prodzsekt bezrsig nem ezek fordtsval,
szerkesztsvel, vagy futtatsval foglalkozik.
Lssuk a prodzsekt fordtst s kapcsolszerkesztst!
FOPROG.C
FUGGV.C
fordts
FOPROG.OBJ
FUGGV.OBJ
4. bra: A PRODZSI prodzsekt fordtsa
FOPROG.OBJ
FUGGV.OBJ
indt program
(OBJ)
knyvtrak (LIB)
kapcsol
szerkeszts
PRODZSI.EXE
5. bra: A PRODZSI prodzsekt kapcsolszerkesztse
Fedezzk fel, hogy a vgrehajthat fjl a prodzsekt nevt kapja
meg!
A prodzsektet alkot fjlok kztt implicit fggsg van. Ez azt je-
lenti, hogy a prodzsekt futtatsakor csak akkor trtnik meg a trgymodul
alakjban is rendelkezsre ll forrsfjl fordtsa, ha a forrsfjl utols
mdostsnak ideje (dtuma s idpontja) ksbbi, mint a vonatkoz
trgymodul. A kapcsolszerkeszts vgrehajtshoz az szksges, hogy
a trgymodulok, ill. a knyvtrak valamelyiknek ideje ksbbi legyen a
vgrehajthat fjlnl. Az implicit fggsg fennll a forrsfjl s a bele
#include direktvval bekapcsolt fjlok kztt is. A trgymodult akkor is
jra kell fordtani, ha valamelyik forrsfjlba behozott fjl ideje ksbbi a
trgymodulnl.
Bizonyos programfejleszt rendszereknl elfordulhat, hogy az
implicit fggsgi mechanizmust gy kell kln aktivlni (menpont), ill.
hogy a forrsfjlok, s a beljk behozott fjlok kzti fggsget explicit
mdon kell biztostani.
C programnyelv 37
stdio.h
PRODZSI.EXE
foprog.obj
fuggv.obj
indt prog.
knyvtrak
foprog.c
fuggv.c
6. bra: Implicit fggsg a PRODZSI prodzsektnl
A prodzsektfjlban a forrsmodulokon kvl megadhatk trgymo-
dulok (OBJ) s knyvtrak (LIB) fjlazonosti is. A kapcsolszerkesz-
t a trgymodulokat beszerkeszti a vgrehajthat fjlba. A knyvtrakban
pedig fggvnyek trgykdjait fogja keresni.
A prodzsektfjlban tulajdonkppen a gyri indt program s a szabvny
knyvtrak is kicserlhetek, de ennek pontos megvalstsa mr
igazn a programfejleszt rendszertl fgg.
3.10 Karaktertmb s karakterlnc
A karaktertmbk defincija a Tmbk fejezetben ismertetettek sze-
rint:
char tmbazonost[mret];
Az egsz tmb helyfoglalsa:
mret*sizeof(char) mret
bjt. A tmbindexels ebben az esetben is zrustl indul s mret1ig
tart.
A Cben nincs kln karakterlnc (sztring) adattpus. A karakter-
lncokat a fordtnak s a programoznak karaktertmbkben kell elhe-
lyeznie. A karakterlnc vgt az t tartalmaz tmbben egy zrusrtk
bjttal (\0) kell jelezni. Pldul a Karakterlnc karakterlncot gy kell
letrolni a tomb karaktertmbben:
tomb K a r a k t e r l n c \0
0 1 2 3 4 5 6 7 8 9 10 11 12
Vegyk szre, hogy a karakterlnc els jele a tomb[0]ban, a mso-
dik a tomb[1]ben, s a legutols a tomb[11]ben helyezkedik el, s az ezt
kvet tomb[12] tartalmazza a lnczr zrust!
Figyeljnk fel arra is, hogy a karakterlnc hossza (12) megegyezik a
lezr \0 karaktert magba foglal tmbelem indexvel!
Fedezzk mg rgtn fel, hogy a zrus egsz konstans (0) s a
lnczr \0 karakter rtke ugyanaz: zrus int tpusban! Hiszen a karak-
ter konstans belsbrzolsa int.
38 BEVEZETS S ALAPISMERETEK
e A Cben nincs kln karakterlnc adattpus, s ebbl kvetkezleg
nem lteznek olyan sztring mveletek sem, mint a karakterlncok
- egyestse,
- sszehasonltsa,
- hozzrendelse stb.
Ezeket a mveleteket bjtrlbjtra haladva kell kdolni, vagy fggvnyt
kell rni rjuk, mint ahogyan azt a kvetkez pldban bemutatjuk.
Ksztsen programot, mely neveket olvas a szabvny bemenetrl EOF
ig vagy res sorig! Megllaptand egy fordtsi idben megadott nvrl,
hogy hnyszor fordult el a bemeneten! A feladat megoldshoz kszten-
d
- Egy int strcmp(char s1[], char s2[]) fggvny, mely sszehasonlt-
ja kt karakterlnc paramtert! Ha egyeznek, zrust ad vissza. Ha
az els htrbb van a nvsorban (nagyobb), akkor pozitv, egyb-
knt meg negatv rtket szolgltat.
- Egy int getline(char s[], int n) fggvny, mely behoz a szabvny
bemenetrl egy sort! A sor karaktereit rendre elhelyezi az s karak-
tertmbben. A befejez soremels karaktert nem viszi t a tmbbe,
hanem helyette lnczr \0t r a karakterlnc vgre. A getline
msodik paramtere az s karaktertmb mretnl eggyel kisebb
egsz rtk, azaz a lnczr zrus nlkl legfeljebb n karaktert trol
a tmbben a fggvny. A getline visszatrsi rtke az s tmbben
vgl is elhelyezett karakterlnc hossza.
/* PELDA10.C: Nvszmlls */
#include <stdio.h>
#define NEV "Jani" /* A szmllt nv. */
#define MAX 29 /* A bemeneti sor maximlis mrete.
Most egyben a leghosszabb nv is. */
int getline(char s[],int n); /* Fggvny prototpusok. */
int strcmp(char s1[], char s2[]);
void main(void){
int db; /* Nvszmll. */
char s[MAX+1]; /* Az aktulis nv. */
db=0; /* A szmll nullzsa. */
printf("A(z) %s nv leszmllsa a bemeneten.\nAdjon\
meg soronknt egy nevet!\nProgramvg: res sor.\n",NEV);
/* Sorok olvassa res sorig a bemenetrl: */
while(getline(s,MAX)>0)
/* Ha a sor pp a NEV: */
if(strcmp(s,NEV)==0) ++db;
/* Az eredmny kzlse: */
printf("A nevek kzt %d darab %s volt.\n",db,NEV); }
C programnyelv 39
int strcmp(char s1[], char s2[]){
int i;
for(i=0; s1[i]!=0&&s1[i]==s2[i]; ++i);
return(s1[i]-s2[i]);}
int getline(char s[],int n){
int c,i;
for(i=0;i<n&&(c=getchar())!=EOF&&c!='\n';++i) s[i]=c;
s[i]='\0';
return(i); }
Ha a forrskd egy sort lezr soremels karaktert kzvetlenl \ jel
elzi meg, akkor mindkt karaktert elveti a fordt, s a kt fizikai sort
egyesti, s egynek tekinti. Az ilyen rtelemben egyestett sorokat mr a
msodiktl kezdve folytatssornak nevezik.
A main els printfjt folytatssorral ksztettk el.
A kt elksztett fggvny prototpusbl s defincijbl vegyk
szre, hogy a formlis paramter karaktertmb (s persze ms tpus tmb
is) mret nlkli!
Az strcmp megrsakor abbl indultunk ki, hogy kt karakterlnc akkor
egyenl egymssal, ha ugyanazon pozciikon azonos karakterek llnak,
s radsul a lnczr zrus is ugyanott helyezkedik el. Az i ciklusvlto-
zt zrusrl indtva, s egyesvel haladva, vgigindexeljk az s1 karakter-
tmbt egszen a lnczr nullig (s1[i]!=0) akkor, ha kzben minden i
re az s1[i]==s2[i] is teljeslt. Ebbl a ciklusbl teht csak kt esetben van
kilps:
- Ha elrtnk s1 karaktertmb lnczr zrusig (s1[i]==0).
- Ha a kt karakterlnc egyazon pozcijn nem egyforma rtk ll
(s1[i]!=s2[i]).
A visszaadott s1[i]s2[i] klnbsg csak akkor:
- Zrus, ha s1[i] zrus s s2[i] is az, azaz a kt karakterlnc egyenl.
- Negatv, ha s1 kisebb (elbbre van a nvsorban), mint s2.
- Pozitv, ha s1 nagyobb (htrbb van a nvsorban), mint s2.
Az strcmpt mr megrtk. Trgykdja benne van a szabvny
knyvtrban. Nem fradtunk azonban feleslegesen, mert a szabvny
knyvtri vltozat ugyangy funkcionl, mint a PELDA10.Cbeli. Hasz-
nlathoz azonban be kell kapcsolni a prototpust tartalmaz STRING.H
fejfjlt.
rjuk be a PELDA10.C #include direktvja utn a
40 BEVEZETS S ALAPISMERETEK
#include <string.h>
, s trljk ki a forrsszvegbl az strcmp prototpust s defincijt!
Vgl prbljuk ki!
e Feltve, hogy s1 s s2 karaktertmbk, lssuk be, hogy C program-
ban, ugyan szintaktikailag nem helytelen, semmi rtelme sincs az ilyen
kdolsnak, hogy:
s1==s2, s1!=s2, s1>=s2, s1>s2, s1<=s2, s1<s2
E mdon ugyanis s1 s s2 memriabeli elhelyezkedst hasonltjuk ssze,
azaz bizton llthatjuk, hogy az s1==s2 mindig hamis, s az s1!=s2 pedig
mindig igaz.
A getline ciklusvltozja ugyancsak zrusrl indul, s a ciklus vgig
egyesvel halad. A ciklusmagbl ltszik, hogy a szabvny bemenetrl r-
kez karakterekkel tlti fel az s karaktertmbt. A ciklus akkor ll le,
- ha az s tmb kimerlt, s nem tlthet tovbb (i>=n), vagy
- ha a beolvasott karakter EOF jelzs (c==EOF), vagy
- ha a bejv karakter soremels (c==\n).
Ezutn kitesszk a tmb iik elemre a lnczr zrust, s visszaadjuk it,
azaz a behozott karakterlnc hosszt.
getline fggvnynk j prblkozs az egy sor behozatalra a szabvny
bemenetrl, de van nhny problmja, ha a bemenet a billentyzet:
1. A bemeneti pufferben lev karakterek csak soremels (Enter) utn
llnak rendelkezsre, s addig nem.
2. Az EOF karakter (Ctrl+Z) rkezse nem jelenti tulajdonkppen a
bemenet vgt, mert utna mg egy soremelst is vgre kell hajtani,
hogy szlelni tudjuk.
3. Ha a bemeneti pufferben az Enter megnyomsakor nnl tbb ka-
rakter van, akkor a puffer (az egy sor) csak tbb getline hvssal ol-
vashat ki.
rjuk csak t a PELDA10.C mainjben a
while(getline(s,MAX)>0)
sort a kvetkezre
while(getline(s,4)>0)
, s a program indtsa utn gpeljk be a
JenJaniJojJani
C programnyelv 41
sorokat!
Az els kt problma az opercis rendszer viselkedse miatt van, s je-
lenleg sajnos nem tudunk rajta segteni. A msodik gondhoz mg azt is
hozz kell fznnk, hogy fjlvget a billentyzet szabvny bemeneten a
getlinenak csak res sor megadsval tudunk elidzni.
A harmadik problma viszont knnyedn orvosolhat, csak ki kell ol-
vasni a bemeneti puffert vgig a getlinebl val visszatrs eltt. Teht:
int getline(char s[],int n){
int c,i;
for(i=0;i<n&&(c=getchar())!=EOF&&c!='\n';++i)s[i=c;
s[i]='\0';
while(c!=EOF&&c!='\n') c=getchar();
return(i); }
Megoldand feladatok:
Ksztse el a kvetkez fggvnyeket, s prblja is ki ket egy rvid
programmal!
- A void strcopy(char cl[], char forrs[]) tmsolja a cl karakter-
tmbbe a forrs karakterlncot a lezr nulljval egyetemben.
- A void strct(char s1[], char s2[]) egyesti s1be a kt paramter
karakterlncot. Javasoljuk, hogy az algoritmus indexeljen elre s1
lnczr zrusig, s ettl kezdve csak ide kell msolni s2t!
- Az unsigned strlen(char s[]) visszaadja az s karakterlnc hosszt.
Emlkezznk r, hogy a lnczr zrus indexe a karaktertmbben
egyben a karakterlnc hossza is!
- A void strrv(char s[]) megfordtja a sajt helyn a paramter karak-
terlncot. Pldul a Janibl inaJnak kell szletnie.
rjon programot, mely a getline segtsgvel sorokat olvas res sorig a
szabvny bemenetrl, s megkeresi a legrvidebbet, s persze ki is jelzi a
hosszval egytt! Javasoljuk, hogy a pillanatnyi minimum mentshez
hasznlja fel az strcopy fggvnyt! {STRMIN.C}
3.11 Loklis, globlis s bels, kls vltozk
Ha alaposan ttanulmnyozzuk a PELDA10.Ct, akkor szrevehetjk,
hogy mind az strcmpben, mind a getlineban van egyegy, int tpus i
vltoz. Feltehetnnk azt a krdst, hogy mi kzk van egymshoz? A r-
vid vlasz nagyon egyszer: semmi. A hosszabb viszont kicsit bonyolul-
tabb:
42 BEVEZETS S ALAPISMERETEK
- Mindkt i vltoz loklis a sajt fggvnyblokkjra.
- A loklis vltoz hatskre az a blokk, amiben definiltk.
- A loklis vltoz lettartama az az id, mg sajt fggvnyblokkja
aktv, azaz benne van a vezrls.
Teht a kt i vltoznak a nvegyezsen tl nincs semmi kze sem egy-
mshoz.
A vltoz hatskre az a programterlet, ahol rvnyesen hivat-
kozni lehet r, el lehet rni. Nevezik ezt ezrt rvnyessgi tartomnynak
is.
A loklis vltoz hatskre az a blokk, s annak minden begya-
zott blokkja, amiben definiltk. A blokkon bellisge miatt a loklis vl-
tozt bels vltoznak is nevezik.
A vltoz lettartama az az idszak, amg memrit foglal.
A loklis vltoz akkor jn ltre (rendszerint a veremben), amikor
a vezrls bejut az t definil blokkba. Ha a vezrls kikerl onnt, ak-
kor a memriafoglalsa megsznik, helye felszabadul (a veremmutat
helyrejn).
A fggvnyekben, gy a mainben is, definilt vltozk mind loklisak
arra a fggvnyre, amelyben deklarltk ket. Csak az adott fggvnyen
bell lehet hozzjuk frni. Ez a loklis hatskr. Futsi idben a fgg-
vnybe val belpskor jnnek ltre, s kilpskor meg is semmislnek.
Ez a loklis lettartam. A loklis vltoz kezdrtke ebbl kvetkezleg
szemt. Pontosabban az a bitkombinci, ami azokban a memriabj-
tokban volt, amit most ltrejvetelekor a rendszer rendelkezsre bocs-
tott. Teht a bels vltoznak nincs alaprtelmezett kezdrtke. Az alap-
rtelmezett kezdrtket implicit kezdrtknek is szoktk nevezni.
Mi dnti el, hogy a bels vltoz melyik blokkra lesz loklis?
Nyilvnvalan az, hogy az t definil deklarcis utastst melyik blokk
elejn helyezik el.
Tisztzzuk valamennyire a vltoz deklarcija s defincija kz-
ti klnbsget! Mindkt deklarcis utastsban megadjk a vltoz n-
hny tulajdonsgt, de memriafoglalsra csak definci esetn kerl sor.
A loklis vltoz az elzekben ismertetetteken kvl auto trol-
si osztly is.
Egsztsk ki jbl a deklarcis utasts szintaktikjt!
<trolsiosztly><tpusmdostk> <alaptpus> azonostlista;
C programnyelv 43
A trolsiosztly a kvetkez kulcsszavak egyike lehet: auto, register,
static, vagy extern. E fejezet keretben nem foglalkozunk a register s a
static trolsi osztllyal!
A szintaktikt betartva most felrhat, hogy
auto i;
, ami az auto signed int tpus, i azonostj vltoz defincija.
Hogyan lehet auto trolsi osztly a loklis vltoz? Nyilvn
gy, hogy a loklis helyzet deklarcis utastsban az auto trolsi osz-
tly alaprtelmezs. Az auto kulcssz kirsa ezekben az utastsokban
teljesen felesleges.
Foglaljuk ssze a loklis vltozval, vagy ms nven bels vltozval,
kapcsolatos ismereteinket!
Neve: Brmilyen azonost.
Tpusa: Valamilyen tpus.
Hatskre: Az a blokk, ahol definiltk.
lettartama: Amg a blokk aktv, azaz a vezr-
ls benne van.
Alaprtelmezett trolsi osztlya: auto
Alaprtelmezett kezdrtke: Nincs.
Deklarcis utastsnak helye: Annak a blokknak a deklarcis
rsze, ahol a vltozt hasznlni k-
vnjuk.
Memriafoglals: Futsi idben, tbbnyire a verem-
ben.
Meg kell emlteni, hogy a fggvnyek formlis paramterei is lok-
lis vltozknak minslnek, de
- deklarcijuk a fggvnydefinci fej rszben s nem a blokkjban
helyezkedik el, s
- rtkk az aktulis paramter rtke.
Az elfeldolgozson tesett forrsmodult fordtsi egysgnek neve-
zik. A fordtsi egysg fggvnydefincikbl s kls deklarcikbl ll.
Kls deklarci alatt a minden fggvny testn kvli deklarcit rt-
jk. Az gy definilt vltozt kls vltoznak, vagy globlis vltoznak
nevezik. Az ilyen vltoz:
- Hatskre a fordtsi egysgben a deklarcis utastsnak pozci-
jtl az n. deklarcis ponttl indul, s a modul vgig tart. Ezt
a hatskrt fjl hatskrnek, vagy globlis hatskrnek nevezik.
44 BEVEZETS S ALAPISMERETEK
- lettartama a program teljes futsi ideje. A memria hozzrendels
mr fordtsi idben megtrtnik. Rendszerint az elsdleges adatte-
rleten helyezkedik el, s biztos, hogy nem a veremben. Ez a stati-
kus lettartam.
- Alaprtelmezett (implicit) kezdrtke: minden bitje zrus. Ez az
aritmetikai tpusoknl zrus. Karaktertmb esetben ez az res ka-
rakterlnc, hisz rgtn a lnczr nullval indul.
- Alaprtelmezett trolsi osztlya extern.
e Bnjunk csnjn az extern kulcssz explicit hasznlatval, mert
deklarcis utastsban val megadsa ppen azt jelenti, hogy az utasts
nem definci, hanem csak deklarci! Ms fordtsi egysgben definilt
kls vltozt kell ebben a forrsmodulban gy deklarlni a r val hivat-
kozs eltt.
/* Forrsmodul 1 */
extern int i;
extern char t[];
/* . . . */
/* Forrsmodul 2 */
int i;
char t[10];
/* . . . */
7. bra: extern deklarci
Prodzsektnk lljon e kt forrsmodulbl! Az int tpus i vltozt s a t
karaktertmbt Forrsmodul 2ben definiltk. Itt trtnt teht meg a
helyfoglalsuk. Ezek a vltozk Forrsmodul 1ben csak akkor rhetk
el, ha a rjuk trtn hivatkozs eltt extern kulcsszval deklarljk ket.
Vegyk szre, hogy a Forrsmodul 1 elejn elhelyezett deklarcis
utastsok egyrszt globlis szinten vannak, msrszt valban csak dekla-
rcik, hisz a tmb deklarcijban mret sincs!
e Persze azt, hogy a tmb mekkora, valahonnt a Forrsmodul 1ben
is tudni kell!
rjuk t gy a PELDA10.Ct, hogy a beolvasott sor trolsra hasznla-
tos tmbt globliss tesszk, majd nevezzk t PELDA11.Cre!
/* PELDA11.C: Nvszmlls */
#include <stdio.h>
#define NEV "Jani" /* A szmllt nv. */
#define MAX 29 /* A bemeneti sor maximlis mrete.
Most egyben a leghosszabb nv is. */
int getline(void); /* A fggvny prototpusok. */
int strcmp(char s2[]);
void main(void){
C programnyelv 45
int db; /* Nvszmll. */
db=0; /* A szmll nullzsa. */
printf("A(z) %s nv leszmllsa a bemeneten.\nAdjon\
meg soronknt egy nevet!\nProgramvg: res sor.\n",NEV);
/* Sorok olvassa res sorig a bemenetrl: */
while(getline()>0)
/* Ha a sor pp a NEV: */
if(strcmp(NEV)==0) ++db;
/* Az eredmny kzlse: */
printf("A nevek kzt %d darab %s volt.\n",db,NEV); }
char s[MAX+1]; /* Az aktulis nv */
int strcmp(char s2[]){
int i;
for(i=0; s[i]!=0&&s[i]==s2[i]; ++i);
return(s[i]-s2[i]);}
int getline(void){
int c,i;
for(i=0;i<MAX&&(c=getchar())!=EOF&&c!='\n';++i)
s[i]=c;
s[i]='\0';
while(c!=EOF&&c!='\n') c=getchar();
return(i); }
Vegyk szre, hogy a PELDA10.Cs verzihoz kpest a getline pa-
ramter nlkliv vlt, s az strcmpnek meg egyetlen paramtere ma-
radt! Miutn a globlis s karaktertmb deklarcis pontja megelzi a kt
fggvny defincijt, a fggvnyblokkok s hatskrben vannak. Bellk
teht a tmb egyszer hivatkozssal elrhet, s nem kell paramterknt t-
adni. A getline msodik paramtere tulajdonkppen a MAX szimbolikus
konstans volt, s ezt beptettk a for ciklusba.
Elemezgessk egy kicsit a kls vltoz, vagy paramter problmt!
- Globlis vltozkat hasznlva megtakarthat fggvnyhvskor a
paramterek tadsa, vagyis kevesebb paramterrel oldhat meg a
feladat.
- Kls vltozkat manipull fggvnyek msik programba viszont
csak akkor msolhatk t s hvhatk meg vltoztats nlkl, ha
ezeket a vltozkat is velk visszk. Ltszik, hogy az ilyen fggv-
nyek mobilitst, jrafelhasznlhatsgt cskkentik a jrulkos,
globlis vltozk.
- A csak paramtereket s loklis vltozkat alkalmaz fggvnyek
tmsols utn vltoztats nlkl hasznlhatk ms programokban.
Legfeljebb az aktulis paramterek lesznek msok a hvsban.
Vilgos, hogy nincs egyrtelmen s ltalnosan ajnlhat megolds
a problmra. A feladat konkrt sajtossgai dntik el, hogy mikor milyen
fggvnyeket kell rni, kelleneke kls vltozk stb.
46 BEVEZETS S ALAPISMERETEK
Summzzuk a globlis vltozval, vagy ms nven kls vltozval,
kapcsolatos ismereteinket!
Neve: Brmilyen azonost.
Tpusa: Valamilyen tpus.
Hatskre: Globlis, vagy fjl. A deklarcis
ponttl a forrsmodul vgig tart.
lettartama: Statikus. A program teljes futsi
ideje alatt l.
Alaprtelmezett trolsi osztlya: extern
Alaprtelmezett kezdrtke: Minden bitje zrus.
Deklarcis utastsnak helye: A forrsmodul minden fggvny-
defincijn kvl.
Memriafoglals: Fordtsi idben, vagy legalbb is
az indt program kezddse eltt.
3.12 Inicializls
Az inicializls kezdrtk adst jelent a deklarciban, azaz az inicia-
liztorok kezdrtkkel ltjk el az objektumokat (vltozkat, tmbket
stb.).
A statikus lettartam objektumok egyszer a program indulsakor inici-
alizlhatk. Implicit (alaprtelmezett) kezdrtkk tiszta zrus, ami:
- Zrus az aritmetikai tpusoknl.
- res karakterlnc karaktertmb esetn.
A loklis lettartam objektumok inicializlsa minden ltrejvetelk-
kor megvalsul, de nincs implicit kezdrtkk, azaz szemt van ben-
nk.
Mdostsuk jra a deklarcis utasts szintaktikjt vltozkra s tm-
bkre!
tpus azonost<=inicializtor>;
tpus tmbazonost[<mret>]<={inicializtorlista}>;
, ahol az inicializtorlista inicializtorok egymstl vesszvel elvlasztott
sorozata, s a tpus a <trolsiosztly><tpusmdostk> <alaptpus>t
helyettesti.
A vltozkat egyszeren egy kifejezssel inicializlhatjuk, mely kifeje-
zs opcionlisan {}-be is tehet. Az objektum kezdeti rtke a kifejezs
rtke lesz. Ugyanolyan korltozsok vannak a tpusra, s ugyanazok a
konverzik valsulnak meg, mint a hozzrendels opertornl. Magyarn
az inicializtor hozzrendels-kifejezs. Pldul:
C programnyelv 47
char y = z, k; /* y z rtk, s a knak meg */
/* nincs kezdrtke. */
int a = 10000; /* a 10000 kezdrtk. */
C-ben a statikus lettartam vltozk inicializtora csak konstans kifeje-
zs lehet, ill. csak ilyen kifejezsek lehetnek tmbk inicializtorlistj-
ban. A loklis objektumok inicializtoraknt viszont brmilyen leglis ki-
fejezs megengedett, mely hozzrendels kompatibilis rtkk rtkelhet
ki a vltoz tpusra.
#define N 20
int n = N*2; /* Statikus objektum inicializtora
csak konstans kifejezs lehet. */
/* . . . */
void fv(int par){
int i = N/par; /* A loklis objektum viszont
brmilyen leglis kifejezs.
. . . */ }
Emlkezznk vissza, hogy globlis vltozk csak egyszer kapnak
kezdrtket: a program indulsakor. A loklis objektumok viszont mind-
annyiszor, valahnyszor blokkjuk aktvv vlik.
A szvegben hasznlatos objektum fogalom nem objektumorien-
tlt rtelm, hanem egy azonosthat memria terletet takar, mely kons-
tans vagy vltoz rtk(ek)et tartalmaz. Minden objektumnak van azono-
stja (neve) s adattpusa. Az adattpus rgzti az objektumnak
- lefoglaland memria mennyisgt s
- a benne trolt informci belsbrzolsi formjt.
Tmbk esetn az inicializtorlista elemeinek szma nem haladhatja
meg az inicializland elemek szmt!
float tomb[3] = {0., 1., 2., 3.}; /* HIBS: tbb
inicializtor van, mint tmbelem. */
Ha az inicializtorlista kevesebb elem, mint az inicializland objektu-
mok szma, akkor a maradk objektumok a statikus lettartam implicit
kezdrtk ads szablyai szerint kapnak rtket, azaz nullzdnak:
float tmb[3] = {0., 1.}; /* tmb[0]==0.0, tmb[1]==1.0 s
tmb[2]==0.0. */
Az inicializland objektum lehet ismeretlen mret is, ha az inicializ-
torlistbl megllapthat a nagysg. Pldul:
int itmb[] = { 1, 2, 3}; /* Az itmb hrom elem lesz. */
char nev[] = Lali, /* A lezr \0 karakter */
csaladnev[] = Kiss; /* miatt 5 elemek a tmbk.*/
Megoldand feladatok:
48 BEVEZETS S ALAPISMERETEK
rja t az eddig elksztett PELDAn.Cket, s a megoldott feladatok
programjait gy, hogy a vltozk kezdrtket mindig inicializlssal
kapjanak!
C programnyelv 49
4 TPUSOK S KONSTANSOK
A fordt a forrskdot szintaktikai egysgekre, vagy ms elnevezssel
szimblumokra, s fehr karakterekre trdeli. A tbb egymst kvet fe-
hr karakterbl csak egyet tart meg. Ebbl kvetkezleg:
- Egyetlen C utasts akr szimblumonknt klnkln sorba rha-
t.
- Egy sorban azonban tbb C utasts is megadhat.
Pontosan hat szimblum (int i ; float f ;) lesz a kvetkezkbl:
int
i
;
float f ;
vagy
int i; float f;
A karakter, vagy karakterlnc konstansokban elfordul, akrhny
fehr karaktert vltozatlanul hagyja azonban a fordt.
Emltettk mr, hogy a programnyelv szimblumokbl (token) ll. Most
ismertetjk a szimblum defincijt mdostott BackusNaur, metanyel-
vi lerssal:
szimblum (token):
opertor
kulcssz
elvlaszt-jel
azonost
konstans
karakterlnc (string literal)
Az rtelmezs nagyon egyszer: a felsorolt hat fogalom mindegyike
szimblum.
Az opertorokkal nem ebben a szakaszban foglalkozunk, hanem a M-
VELETEK S KIFEJEZSEKben!
A kulcsszavak:
auto double int struct
break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
50 TPUSOK S KONSTANSOK
default goto sizeof volatile
do if static while
Vannak ezeken kvl mg nem szabvnyos kulcsszavak s ms vdett
azonostk, de ezek mindig megtudhatk a programfejleszt rendszer se-
gtsgbl!
Ilyenekre kell gondolni, mint a cdecl, a pascal, az stdcall, vagy
egykt alhzs karakterrel kezddkre, mint pldul az __STDC__ stb.
ANSI C kompatibilis fordtst elrva mindig kiderthet, hogy az
illet fordt mely kulcsszavai, opertorai, vagy elvlasztjelei nem
szabvnyosak.
4.1 Elvlaszt-jel
A szintaktikai egysgeket (a szimblumokat) egymstl legalbb egy fe-
hr karakterrel el kell vlasztani. Nincs szksg azonban az elvlaszt fe-
hr karakterre, ha a kt nyelvi egysg kz a szintaktikai szablyok szerint
egybknt is valamilyen elvlaszt-jelet kell rni. Az opertorok is elv-
lasztjelnek minslnek kifejezsekben.
elvlaszt-jel: (a kvetkezk egyike!)
[ ] ( ) { } * , : = ; #
Nzzk meg nhny elvlasztjel funkcijt!
Az utastst zr pontosvessz minden pldban benne van.
A kerek zrjeleknek csoportost funkcija van kifejezsekben. Van,
amikor a szintaktika rsze. Fggvnyhvsnl az aktulis paramtereket,
fggvnydeklarciban s definciban a formlis paramtereket ebbe kell
tenni.
d = c*(a+b);
if(d==z) ++x;
fv(akt, par);
void fv2(int n);
A szgletes zrjelek tmbk deklarcijban s indexel opertorknt
hasznlatosak.
char kar, lanc[] = Sztan s Pan.;
kar = lanc[3];
A kapcsos zrjelekbe tett tbb utasts szintaktikailag egyetlen utasts-
nak minsl. A dolgot sszetett utastsnak, blokknak nevezzk.
e Az sszetett utasts (blokk) zr kapcsos zrjele utn tilos pontos-
vesszt tenni!
if(a<b){ /* Illeglis pontosvessz hasznlat. */
C programnyelv 51
a=2; z=b+6; };
A csillag elvlaszt-jelnek tbbfle szerepe van a nyelvben. Eddig csak
a szorzs opertor funkcijt ismerjk!
a = 3.14*b;
Az egyenlsg jel hozzrendels opertor, s deklarcis utastsban el-
vlasztja a vltozt az inicializtortl, vagy inicializtorlisttl.
char tomb[5] = {0, 1, 2, 3, 4};
int x=5, b, c=4;
b = x+c;
A ketts kereszt elfeldolgoz (preprocessor) direktva kezdete. A sor-
beli els nem fehr karakternek kell annak lennie.
#include <stdio.h>
#define TRUE 1
#define FALSE 0
4.2 Azonost
azonost:
nem-szmjegy
azonost nem-szmjegy
azonost szmjegy
nem-szmjegy: (a kvetkezk egyike!)
a ... z A ... Z _
szmjegy: (a kvetkezk egyike!)
0 1 2 3 4 5 6 7 8 9
Az azonost vltozknak, fggvnyeknek, felhasznl definilta adatt-
pusoknak stb. adott, a kvetkez pontokban pontostott nv:
- Kisbetvel, nagybetvel vagy alhzs (_) karakterrel kteles kez-
ddni.
- A tovbbi karakterek lehetnek szmjegyek is.
- Az azonost nem lehet kulcssz vagy valamilyen elredefinilt, v-
dett azonost.
- Az azonostk kis- s nagybet rzkenyek, azaz az Osszeg, az
osszeg vagy az osszeG hrom klnbz azonost.
- Kerlni kell a kt s az egy alhzs karakterrel kezdd nevek
hasznlatt is!
- Az azonostk els, mondjuk, 31 karaktere szignifikns. Ez azt je-
lenti, hogy hosszabb nevek is hasznlhatk, de az els 31 karakte-
rkben nem klnbz azonostk ugyanannak minslnek.
52 TPUSOK S KONSTANSOK
Az, hogy az azonost els hny karaktere szignifikns, a fordttl
fgg. Msrszt a programfejleszt rendszerben egy s ezen rtk kztt
vltoztathat is!
Bizonyos kls kapcsolds azonostkra, melyeket a kapcsol
szerkeszt illeszt, eltr megszortsok lehetnek rvnyben. Pldul keve-
sebb karakterbl llhatnak, vagy nem kis s nagybet rzkenyek stb.
Megoldand feladat:
A felsorolt pldaazonostk kzl az els hrom hibs. Magyarzza
meg, hogy mi a problma velk!
- 6os_villamos
- Moszer Aranka
- Nagy_Jnos
- Nagy_Jani
- puffer
4.3 Tpusok s konstansok a nyelvben
A nyelvben sszesen ngy tpuskategria van:
- A fggvny a nyelv kdgenerl egysge. Az sszes tbbi kategria
csak memrit foglal az adatoknak.
- A void tpus tbbnyire valaminek a meg nem ltt jelzi. Pldul
nincs paramtere s visszaadott rtke a void main(void) fggvny-
nek.
- Skalr az aritmetikai tpus, mely tovbb bonthat fixpontos egsz s
lebegpontos vals brzols tpusokra. Ilyen a felsorols (enum)
tpus s a mutat is.
- Aggregtum a tmb, a struktra s az uni.
A mutatkkal, a struktrkkal s az unikkal ksbbi szakaszokban
foglalkozunk!
A tpusokat gy is csoportosthatnnk, hogy vannak
- alaptpusok s
- szrmaztatott tpusok
Az alaptpusok a void, a char, az int, a float s a double. A szrmaztats
pedig a short, a long, a signed s az unsigned n. tpusmdostkkal tr-
C programnyelv 53
tnhet. A short s a long, valamint a signed s az unsigned egymst ki-
zr mdost prok, de a kt pr egyazon alaptpusra egyszerre is alkal-
mazhat, azaz ltezik
- unsigned long int vagy
- signed short int stb.
A signed s az unsigned mdost azonban csak egsz tpusokra (char s
int) alkalmazhat, lebegpontos vals s a void alaptpusra nem.
A szrmaztatott tpusokba mindig belertendk az ilyen tpus rtkkel
visszatr fggvnyek, az ilyen tpust paramterknt fogad fggvnyek,
a tmbk stb. Ha programunkban valamilyen azonostt hasznlni kv-
nunk, akkor elbb deklarlni (definilni) kell. A deklarci teremti meg a
kapcsolatot az azonost s az objektum kztt, s rgzti legalbb az ob-
jektum adattpust. A szrmaztatott tpust is szoks egyszeren tpusnak
nevezni.
Kszpnzre vltva az elz bekezdsben mondottakat: ha a tpus vala-
milyen nem void adattpus, akkor a deklarcik kvetkezkpp szemll-
tethetk:
tpus t, t1, t2; /* Hrom tpus tpus objektum. */
tpus f(void); /* Tpus tpus rtket visszaad,
paramter nlkli fggvny. */
void fv(tpus i); /*Tpus tpus paramtert fogad
eljrs. */
tpus tt[10]; /* 10 elem, tpus tpus tmb. Az
elemek rendre: tt[0], ..., tt[9]. */
Felttlenl emltst kell tennnk mg kt, definciban hasznlhat
mdostrl, melyek alaposan megvltoztatjk a deklarlt objektum tulaj-
donsgait. E kulcsszavakat minstk megnevezssel is illetik.
A const nem mdosthat objektumot definil, azaz meggtolja a hozz-
rendelst az objektumhoz, s az olyan mellkhatsokat, mint az inkremen-
tls, dekrementls stb. Magyarn: nem engedi meg az azonost elrst
balrtkknt. A const a deklarci elejn brmilyen alaptpussal, aggreg-
tum tpussal stb. llhat, de tilos tbbtteles deklarci els vesszje utn
kirni:
float f = 4.5, const cf = 5.6; /* HIBS. */
Ha a const objektum nem lehet balrtk, akkor hogyan lehet valami-
lyen rtkkel elltni?
54 TPUSOK S KONSTANSOK
A const tpus objektum rtkkel val elltsnak egyetlen mdja
az inicializls. Teht az ilyen objektum defincijban ktelez neki kez-
drtket adni, mert ez ksbb mr nem tehet meg. Pldul:
const float pi = 3.1415926;
const max2int = 32767;
Az el nem rt alaptpus miatt a deklarci specifiktorknt egyedl
ll const tulajdonkppen const int, s ezrt a max2int is az. E deklarci-
k utn botor dolgok a kvetkez utastsok:
pi = 3.; /* Szintaktikai hiba. */
int i = max2int++; /* Szintaktikai hiba. */
A volatile sz jelentse elprolg, illkony, llhatatlan. Mdostknt
azt jelzi, hogy az illet vltoz rtke program vgrehajtson kvli okbl
is megvltozhat.
Mi lehet a program vgrehajtsn kvli ok? Pldul megszakts,
B/K port, konkurensen fut vgrehajtsi szl stb.
A volatile kulcssz deklarcin belli elhelyezsnek szablyai
egyeznek a constival. A fordt az ilyen vltozt nem helyezheti el re-
giszterben, ill. az ilyen objektumot is tartalmaz kifejezs kirtkelse so-
rn nem indulhat ki abbl, hogy az rtk kzben nem vltozik meg. Sz-
val az ilyen vltoz minden hivatkozshoz elrsi kdot kell generlnia
akkor is, ha az ltszlag hatstalannak tnik. Pldul:
volatile ticks; /* volatile int a tpus. */
void interrupt timer(void) {++ticks;}
void varj(int ennyit){
ticks =0;
while( ticks < ennyit ); } /* Ne tegyen semmit. */
A while-beli felttel kirtkelsekor a ciklus minden temben tl-
teni kell ticks rtkt.
Lttuk, hogy egy objektumot egsz lettartamra volatilel tehe-
tnk deklarcival, de explicit tpusmdost szerkezettel a vltoz egyet-
len hivatkozst is volatilel minsthetjk.
int ticks;
void interrupt timer(void) {++ticks;}
void varj(int ennyit){
ticks =0;
while( (volatile)ticks < ennyit ); }
Egy objektum egyszerre lehet const s volatile, amikor is az t bir-
tokl program nem mdosthatja, de megvltoztathatja az rtkt brmely
aszinkron program vagy vgrehajtsi szl.
C programnyelv 55
Az adattpusok s konstansok trgyalsnak megkezdse eltt lssuk a
konstans defincijt!
konstans:
egsz-konstans
enum-konstans
lebegpontos-konstans
karakter-konstans
Tudjuk, hogy az objektum is lehet konstans, de itt most nem ilyen llan-
drl van sz. Az igazi konstans nem azonosthat memria terletet
takar, mely fix, a program futsa alatt meg nem vltoztathat rtket tar-
talmaz. A konstansnak nincs szoftveresen is hasznlhat cme, de van
adattpusa, mely meghatrozza az llandnak
- lefoglaland memria mennyisgt s
- a benne trolt rtk belsbrzolsi formjt.
4.3.1 Egsz tpusok s konstansok
Mr emltettk, hogy az egsz tpusok a char s az int alaptpusbl a
signed - unsigned, valamint a short - long mdost prok alkalmazs-
val llthatk el, azaz a deklarci rsszablya eltekintve a trolsi osz-
tlytl s az inicializlstl:
<tpusmdostk> <alaptpus> azonostlista;
A tpusmdostk alaptpus prost azonban a tovbbiakban is tpusnak
fogjuk nevezni. A szablyok a kvetkezk:
- Mind az alaptpus, mind a tpusmdostk elhagyhat. A kett
egytt azonban nem.
- Ha elhagyjuk az alaptpust, alaprtelmezs az int.
- A short - long mdostk elhagysakor nincs rjuk vonatkoz alap-
rtelmezs.
- Ha elhagyjuk a signed - unsigned mdostt, alaprtelmezs a sig-
ned.
Tpus Mret
bjtban
Minimlis rtk Maximlis rtk
char, signed char 1 -128 127
unsigned char 1 0 255
short, short int,
signed short int
2 -32768 +32767
56 TPUSOK S KONSTANSOK
unsigned short,
unsigned short
int
2 0 65535
int, signed int 2 vagy 4 short vagy long short vagy long
unsigned,
unsigned int
2 vagy 4 ugyangy, de un-
signed
ugyangy, de un-
signed
long, long int,
signed long int
4 -2147483648 +2147483647
unsigned long,
unsigned long int
4 0 4294967295
8. bra: Egsz tpusok
- A char alaptpussal kapcsolatban kiegsztsre szorul a signed char
alaprtelmezs! A programfejleszt rendszerben ugyanis unsigned
char is bellthat a char tpus alaprtelmezseknt. A lehetsges
karaktertpusok ilyenkor gy vltoznak:
Tpus Mret
bjtban
Minimlis rtk Maximlis rtk
char,
unsigned char
1 0 255
signed char 1 128 127
- A tblzatbl (8. bra) is jl ltszik, hogy az ANSI szabvny nem r
el pontos mretet az int tpusra, csupn csak annyit, hogy:
short <= int <= long.
- A belsbrzols fixpontos, binris egsz, ezrt signed tpusokra a
negatv szmokat kettes komplemensk alakjban trolja a fordt.
- A szabvnyos LIMITS.H fejfjlban tallunk szimbolikus lland-
kat (CHAR_MIN, UCHAR_MAX, SHRT_MIN, stb.) az brzo-
lsi korltokra!
e A nyelv szerint nincs sem egsz tlcsorduls, sem alulcsorduls. Az
egsz konstansnl lthatunk erre is egy rvid pldt!
egsz-konstans:
decimlis-konstans <egsz-uttag>
oktlis-konstans <egsz-uttag>
hexadecimlis-konstans <egsz-uttag>
A metanyelvben a < ... > az elhagyhatsgot jelli!
C programnyelv 57
egsz-konstans:
decimlis-konstans<egsz-uttag>
oktlis-konstans<egsz-uttag>
hexadecimlis-konstans<egsz-uttag>
decimlis-konstans:
nemzrus-szmjegy
decimlis-konstans szmjegy
oktlis-konstans:
0
oktlis-konstans oktlis-szmjegy
hexadecimlis-konstans:
0xhexadecimlis-szmjegy
0Xhexadecimlis-szmjegy
hexadecimlis-konstans hexadecimlis-szmjegy
nemzrus-szmjegy: (a kvetkezk egyike!)
1 2 3 4 5 6 7 8 9
oktlis-szmjegy: (a kvetkezk egyike!)
0 1 2 3 4 5 6 7
hexadecimlis-szmjegy: (a kvetkezk egyike!)
0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F
egsz-uttag:
unsigned-uttag<long-uttag>
long-uttag<unsigned-uttag>
unsigned-uttag: (a kvetkezk egyike!)
u U
long-uttag: (a kvetkezk egyike!)
l L
A definci szerint:
- Az egsz konstans lehet decimlis, oktlis s hexadecimlis.
- Az egsz konstansnak nincs eljele (pozitv), azaz a negatv egsz
konstans eltt egy egyoperandusos mnusz opertor ll.
- A decimlis egsz konstans int, long int, vagy unsigned long int
belsbrzols a konstans rtktl fggen alaprtelmezs sze-
rint. Az oktlis s hexadecimlis egsz konstans az rtktl fgg-
en int, unsigned int, long int, vagy unsigned long int belsbrzo-
ls.
Decimlis Oktlis Hexadecimlis Tpus
032767 0077777 0X00X7FFF int
0100000
01777777
0X80000XFFFF unsigned
32767
2147483647
02000000
017777777777
0X10000
0X7FFFFFFF
long
58 TPUSOK S KONSTANSOK
2147483648
4294967295
020000000000
037777777777
0X80000000
0XFFFFFFFF
unsigned long
9. bra: Egsz konstansok belsbrzolsa
Lssunk nhny pldt a decimlis, az oktlis s a hexadecimlis egsz
konstansokra!
int i = 10;
int j = 010; /* j kezdetben decimlisan 8. */
int k = 0; /* k decimlisan s oktlisan is 0. */
int l = 0XFF; /* k decimlisan 255. */
- Explicit egsz uttagot a konstans utna rva megvltoztathatjuk az
alaprtelmezett belsbrzolst.
Az inicializtor konstansok tpusegyeztetsvel elkerlhet a szk-
sgtelen kzbens konverzi. Pldul:
unsigned ui=2u;
long li=16l;
unsigned long uli=17lu;
e Az egsz konstans 0 s 4294967295 rtkhatrok kzt megengedett.
Ez azonban a programoz felelssge, mert a 4294967295-nl nagyobb
rtk egyszeren csonkul. Legfeljebb egy halk figyelmeztet zenet j-
het a fordttl. Pldul a
#include <stdio.h>
void main(void){
unsigned long pipipp;
pipipp = 4300000000;
printf(Pipipp = %ld\n, pipipp); }
hatsra 5032704 jelenik meg, ami egy hjn 4300000000 - 4294967295.
4.3.2 Felsorols (enum) tpus s konstans
Az enum (enumerate) adattpus mnemonikuss tesz egy sorozat egsz
rtkre val hivatkozst. Pldul az
enum napok{
vasar, hetfo, kedd, szerda, csut, pentek, szomb} nap;
deklarci ltrehoz egy egyedi enum napok egsz tpust. Helyet foglal
egy ilyen tpus, nap azonostj vltoznak, s definil ht, konstans
egsz rtket reprezentl enumertort: az enumertor kszletet.
Felsorols tpus vltozban a tpushoz definilt enumertor kszlet
egyik rtkt tarthatjuk. Az enumertort enum konstansnak is nevezik.
Felsorols tpus vltozkat hasznlhatunk index kifejezsben, minden
C programnyelv 59
aritmetikai s relcis opertor operandusaknt, stb. Tulajdonkppen az
enum a #define direktva alternatvjnak is tekinthet.
ANSI Cben az enumertor rtkt definil kifejezs csak egszr-
tk konstans kifejezs lehet, s tpusa mindig int. Az enum vltoz tro-
lshoz hasznlt memria is annyi, mint az int tpushoz hasznlt. enum
tpus konstans vagy rtk a Cben ott hasznlhat, ahol egsz kifejezs
is. Lssuk a szintaktikt!
enum-specifiktor:
enum <azonost> {enumertorlista}
enum azonost
enumertorlista:
enumertor
enumertorlista, enumertor
enumertor:
enum-konstans
enum-konstans = konstans-kifejezs
enum-konstans:
azonost
Az enum-specifiktor defincijban az enumertorlistval definilt
enum tpus opcionlis azonostjt enum cmknek (tag) nevezzk. Ha
ezt elhagyjuk a defincibl, nvtelen enum tpust kapunk. Ennek az az
diuma, hogy ksbb nincs lehetsgnk ilyen felsorols tpus vltozk
defincijra, hisz nem tudunk a nvtelen enumra hivatkozni. Nvtelen
enum tpus vltozk teht csak a nvtelen enum deklarcijban defini-
lhatk, mshol nem. Az
enum {jan, feb, marc, apr, maj, jun, jul, aug, szep, okt,
nov, dec};
gy teljesen hasznlhatatlan, hisz kptelensg ilyen tpus vltozt dekla-
rlni. A problma az azonostlista megadsval elkerlhet:
enum {jan, feb, marc, apr, maj, jun, jul, aug, szep, okt,
nov, dec} ho=jan, honap;
Foglaljuk ssze az enum deklarcival kapcsolatos tapasztalatainkat:
enum <enum cmke> <{enumertorlista}> <azonostlista>;
, ahol a < > most is az elhagyhatsgot jelli. Az enum cmke megadsa
teht azt biztostja, hogy az "enum enum cmke" utn azonostlistt rva
ksbb ilyen felsorols tpus vltozkat definilhatunk. A fejezet elejn
emltett deklarcis pldban a napok azonost az opcionlisan megad-
hat enum cmke, mely ksbb enum napok tpus vltozk defincii-
ban hasznlhat fel. Pldul:
enum napok fizetes_nap, unnepnap;
60 TPUSOK S KONSTANSOK
Trjnk egy kicsit vissza az enumertorokhoz! Lttuk, hogy az enum
konstans a felsorols tpus deklarcijban definilt azonost. Miutn az
enumertor egsz adattpus, kifejezsekben ott hasznlhat, ahol egyb-
knt egsz konstans is megadhat. Az enumertor azonostjnak egyedi-
nek kell lennie az enum deklarci hatskrben belertve a norml vl-
tozk neveit s ms enumertorlistk azonostit. Az enum konstansok az
egyszer vltozk nvterletn helyezkednek el teht. Az enum cmkk-
nek viszont az enum, a struktra s az unicmkk nvterletn kell egye-
dinek lennik.
A nvterlet olyan azonost csoport, melyen bell az azonostk-
nak egyedieknek kell lennik. A Cben tbb nvterlet van, amibl itt
kettt meg is emltettnk. Kt klnbz nvterleten ltez, ugyanazon
azonostnak semmi kze nincs egymshoz. A nvterleteket majd egy
ksbbi fejezetben trgyaljuk!
Lssunk pldkat ezen kzbevets utn!
int hetfo = 11; /* A hetfo egyszer int tpus vltoz.*/
{ enum napok{
vasar, hetfo, kedd, szerda, csut, pentek, szomb};
/* A hetfo enumertor ebben a blokkban elrejti a hetfo
int tpus vltozt. */
double csut; /* HIBS, mert ezen a nvterleten van
mr egy csut enumertor.
/* . . . */ }
hetfo+=2; /* OK, mert itt mr csak a hetfo int
vltoz ltezik. */
Az enum napok deklarciban szerepl enum konstansok implicit m-
don kaptak rtket zrustl indulva s mindig eggyel nvekedve. A vasar
gy 0, a hetfo 1, ..., s a pentek 6. Az enum konstansok azonban explici-
ten is inicializlhatk. Akr negatvak is lehetnek, ill. tbb enumertor le-
het azonos rtk is. Pldul:
enum ermek{ egyes=1, kettes, otos=5, tizes=2*otos,
huszas=kettes*tizes, szazas=otos*huszas};
Vegyk szre, hogy az enumertor definilt mr az enumertorlista
kvetkez tagjhoz rve!
Mondottuk, hogy a felsorols tpusok mindentt feltnhetnek, ahol
egybknt az egsz tpusok megengedettek. Pldul:
enum napok{
vasar, hetfo, kedd, szerda, csut, pentek, szomb};
enum napok fizetes_nap = szerda, nap;
int i = kedd; /* OK */
nap = hetfo; /* OK */
hetfo = kedd; /* HIBS, mert a hetfo konstans. */
C programnyelv 61
enum tpus vltozhoz egsz rtk hozzrendelse megengedett,
de explicit tpusmdost szerkezet hasznlata javallott. Teht a
fizetes_nap = 5;
helyett
fizetes_nap = (enum napok) 5;
rand.
e A fordtban nincs mechanizmus a konvertland egsz rtk rv-
nyessgnek ellenrzsre! Pontosabban a kvetkez lehetetlensg elke-
rlse a programoz felelssge:
n = (napok) 958;
Az enum tpus egsz (integral) tpus. Implicit mdon konvertl gy
egssz brmely enumertort a fordt, de a msik irnyban az explicit t-
pusmdosts javasolt:
int i;
enum napok n = szomb; /* OK */
i = n; /* OK */
n = 5; /* Nem javasolt! */
n = (napok) 5; /* OK */
Egsz tpusnak az egsz rtkek trolsra alkalmas, aritmetikai
adattpusokat (char, short, int, long s enum) nevezzk.
4.3.3 Vals tpusok s konstans
Az IEEE lebegpontos belsbrzols vals alaptpusok a float s a
double. Egyedl a long mdost hasznlata megengedett, s az is csak a
double eltt, azaz van mg long double szrmaztatott tpus. A float tpu-
s, egyszeres pontossg lebegpontos brzols 4 bjtot foglal, melybl
8 bit a 128 tbbletes, binris exponens, 1 bit a mantissza eljele (1 a nega-
tv!) s 23 bit a mantissza. A mantissza 1.0 s 2.0 kztti szm. Miutn a
mantissza legnagyobb helyirtk bitje mindig egy, az brzols ezt nem
trolja.
eljel eltrtett karakterisztika mantissza
31. bit 30 23 bitek 22 - 0 bitek
A double exponens 11-, s a mantissza 52 bites.
eljel eltrtett karakterisztika mantissza
63. bit 62 52 bitek 51 - 0 bitek
A lebegpontos belsbrzols mretei, megkzelt hatrai s decim-
lis jegyben mrt pontossga a kvetkez tblzatban lthat:
62 TPUSOK S KONSTANSOK
Tpus Mret
bjtban
Hatrok: Pontossg:
float 4
3.4*10
-38 -
3.4*10
+38
67 decimlis jegy
double 8
1.7*10
-308 -
1.7*10
+308
1516 decimlis jegy
long
double
10
1.2*10
-4932 -
1.2*10
+4932
19 decimlis jegy
10. bra: Lebegpontos tpusok
Ehhez mr csak annyit kell hozzfzni, hogy lebegpontos zrus az,
amikor a belsbrzols minden bitje zrus.
e A lers az IEEE szabvnyos lebegpontos brzolsrl szl, de el-
kpzelhet, hogy a konkrt fordt ms formval dolgozik. A szabvnyos
FLOAT.H fejfjlban azonban mindig megtallhatk szimbolikus llan-
dk (FLT_MIN, DBL_MAX stb.) alakjban az brzolsi hatrok s ms
konkrtumok az aktulis belsbrzolsrl.
lebegpontos-konstans:
trt-konstans <exponens-rsz> <float-uttag>
szmjegy-sor exponens-rsz <float-uttag>
trt-konstans:
<szmjegy-sor> . szmjegy-sor
szmjegy-sor .
exponens-rsz:
e <eljel> szmjegy-sor
E <eljel> szmjegy-sor
eljel: (a kvetkezk egyike!)
+ -
szmjegy-sor:
szmjegy
szmjegy-sor szmjegy
float-uttag: (a kvetkezk egyike!)
f l F L
- A mantisszbl elhagyhat a decimlis egsz rsz vagy a trt rsz,
de a kett egytt nem.
- Elhagyhat a tizedes pont vagy az exponens rsz, de mindkett
nem.
- A lebegpontos konstans eljeltelen (pozitv). A negatv lebegpon-
tos konstans eltt egy egyoperandusos mnusz opertor ll.
- Float uttag nlkl a lebegpontos konstans double belsbrzol-
s. Az uttag megadsval kiknyszerthetjk a float (f vagy F), ill.
a long double (l vagy L) belsbrzolst.
C programnyelv 63
double belsbrzols lebegpontos konstansok:
-.5e35, 5., 5E-4, 3.4
Ugyanezek float s long double belsbrzolsban:
-.5e35f, 5.L, 5E-4F, 3.4l
Az egyszeri programoz berta a forrsszvegbe a
float v=143736120;
/* . . . */
printf(%9.0f\n, v);
sorokat, s meglepdtt a 143736128as eredmnyen. Ha v rtkt eggyel
cskkentette, akkor meg 143736112t kapott. Mi lehet a problma?
A 143736120 (0X8913D38) binrisan
1000 1001 0001 0011 1101 00111000
, de csak 24 bit fr el a belsbrzols mantisszjban. A fordt a legma-
gasabb helyirtk, lecsordul bit rtkvel megnveli a mantisszt.
Most, a karakterisztikval nem foglalkozva, az j rtk:
1000 1001 0001 0011 1101 01000000
, ami ppen 143736128 (0X8913D40).
A 143736119 (0X8913D37) binrisan
1000 1001 0001 0011 1101 00110111
esetben az eredmny
1000 1001 0001 0011 1101 00110000
lesz, ami143736112 (0X8913D30).
e Komolyan kell teht venni a lebegpontos brzolsok decimlis
jegyben mrt pontossgt, s az brzolsi hatrokat. Mg kt dologra fel-
ttlenl oda kell figyelni:
- A decimlis vges tizedes trt tbbnyire nem vges binris trt,
azaz az talakts odavissza nem teljesen pontos.
- Matematikai itercit, ami addig tart, mg kt, szmolt, vals rtk
klnbsge zrus nem lesz, nem szabad egy az egyben megvalsta-
ni, mert az esetek tbbsgben vgtelen ciklushoz vezet.
4.3.4 Karakter tpus s konstans
A karakter tpusrl mr sz esett az egsz tpusok trgyalsnl. Tudjuk,
hogy hrom karakter tpus van: char, signed char s unsigned char.
64 TPUSOK S KONSTANSOK
A karakter tpus objektum helyfoglalsa 1 bjt mindenkpp. A karakter
konstans tpusra s helyfoglalsra rgtn kitrnk defincija utn!
karakter-konstans:
'c-karakter-sor'
c-karakter-sor:
c-karakter
c-karakter-sor c-karakter
c-karakter:
brmilyen karakter aposztrf ('), fordtott per jel (\) s soremels (\n) kvtelvel
escape-szekvencia
Szekvencia rtk Karakter Funkci
\0 0X00 NUL karakterlnc vge
\a 0X07 BEL ftty
\b 0X08 BS visszatrls
\t 0X09 HT vzszintes tab
\n 0X0A LF soremels
\v 0X0B VT fggleges tab
\f 0X0C FF lapdobs
\r 0X0D CR kocsi vissza
\ 0X22 macskakrm
\ 0X27 aposztrf
\? 0X3F ? krdjel
\\ 0X5C \ fordtott per jel
\ooo brmi brmi max. 3 oktlis szmjegy
\xhh brmi brmi max. 3 hexadec. jegy
\Xhh brmi brmi max. 3 hexadec. jegy
11. bra: Escape szekvencik
A defincibl kvetkezleg a karakter konstans aposztrfok kzt ll
egy vagy tbb karakter, ill. escape szekvencia. Ezen az elven beszlhetnk
egykarakteres s tbbkarakteres karakter konstansrl.
- A karakter konstans adattpusa mindenkppen int. Tudjuk, hogy az
int helyfoglalsa 2 vagy 4 bjt, gy maximum ngy karakteres ka-
rakter konstans ltezhet. Pldul:
An, \n\r, Alfi, tag, \007\007\007
e Tudjuk, hogy az int belsbrzols karakter konstans esetben is
rvnyben van a signed char alaprtelmezs. Ennek kvetkeztben az int
mretnl kevesebb karakterbl ll karakter konstansok eljel kiterjesz-
tssel alakulnak int belsbrzolsv. Konkrt pldaknt tekintsk a 2
bjtos int-et, s a 852es kdlapot! Az bet kdja 130 (0X82) s az a
C programnyelv 65
bet 97 (0X61). Az -bl gy 0XFF82 s az a-bl 0X0061 lesz a me-
mriban, s gy igaz lesz a kvetkez relci:
< a
Ha unsigned char az alaprtelmezs, akkor a fels bjt(ok)at bizonyosan
0X00-val tlti fel a fordt (az -bl 0X0082 lesz), s nem jn el az
elbb taglalt problma.
A kvetkez kis plda szemllteti a trgyalt karakter tpus s karakter
konstans mreteket!
#include <stdio.h>
#include <stdlib.h>
#define CH 'x' /* Egykarakteres karakter konstans. */
void main(void) {
char ch = CH; /* Karakter tpus vltoz. */
printf("Az int mrete:\t\t\t%d\n", sizeof(int));
printf("A char mrete:\t\t\t%d\n", sizeof(char));
printf("A karakter konstans mrete:\t %d\n",
sizeof(CH));
printf("A karakter vltoz mrete:\t%d\n",
sizeof(ch)); }
Szlnunk kell mg nhny szt a pontosts kedvrt az escape szekven-
cirl! A \ jelet kvetheti egy a tblzatban (11. bra) ismertetett karakter,
vagy egy legfeljebb hromjegy oktlis szm, vagy x utn hexadecimlis
szmjegyek. Pldul a \03 a Ctrl+C, a \x3F a ? karakter, stb. Szval az
escape szekvencia lerhat vezrl s igazi karaktereket egyarnt. Nz-
zk mg a szablyokat!
- Ha az escape szekvencia fordtott per jelt nem leglis karakter k-
veti, akkor legfeljebb figyelmeztet zenetet kapunk, s a fordt el-
hagyja a \ jelet, de megtartja az illeglis karaktert. Pldul a \zbl a
z marad meg.
- Az oktlisan vagy hexadecimlisan adott escape szekvencia vgt
az els nem oktlis, ill. hexadecimlis karakter is jelzi. Pldul a
\518-bl kt karakteres karakter konstans lesz, ahol a karakterek
rendre a \51 s a 8, azaz )8.
- Vigyzzunk a nem egyrtelm megadsra is! Pldul a \712 km-
ves. karakterlncbl ltszik a programoz trekvse, azaz hogy a
BEL karakter utn a 12 kmves szveg kvetkezne. Ez azonban
gy szintaktikai hiba. A helyes eredmnyhez pldul \7 12 km-
ves. mdon juthatunk.
66 TPUSOK S KONSTANSOK
Miutn az escape szekvencival tulajdonkppen egyetlen karaktert
adunk meg, a \ jelet kvet oktlis szmrtk nem haladhatja meg a 0377
et, a hexadecimlis a 0XFFet, vagyis a 255t!
Igazbl a karakter a vgrehajtskor rvnyes gpi karakterkszlet-
bl vett rtk. A knyvben vgig bjtos (char) kdkszletet (ASCII) tte-
leznk fel, s nem foglalkozunk a szles karaktertpussal (wchar_t) s az
Unicode kdkszlettel!
Az eddig trgyalt adattpusokat sszefoglal nvvel aritmetikai
adattpusoknak is nevezhetjk. Az aritmetikai adattpusok zavarba ejt
bsge a nyelvben azonban nem arra szolgl, hogy a programoz
- csak gy ukk-mukk-fukk kivlasszon valamilyen adattpust adatai
s (rsz)eredmnyei trolsra, hanem arra, hogy
- a szmbrzolsi korltokat tekintetbe vve alaposan vgiggondolja,
hogy rtk s pontossg veszts nlkl milyen adattpust kell hasz-
nlnia az egyes adataihoz, (rsz)eredmnyeihez. Esetleg milyen exp-
licit konverzikat kell elrnia a rszletszmtsok vgzse sorn a
pontossg veszts elkerlshez.
Ksztsen szorzat piramist! A piramis als sora 16 darab 100tl 115ig
terjed egsz szm! A kvetkez sorokat gy kapjuk, hogy az alattuk lev
sor elemeit pronknt sszeszorozzuk. A msodik sor gy nz ki teht:
100*101 = 10100, 102*103 = 10506, , 114*115 = 13110. A harmadik
sorban a kvetkezk llnak: 10100*10506 = 106110600, 10920*11342 =
126854640, , 12656*13110 = 165920160, s gy tovbb.
Figyeljnk arra, hogy az eredmnyl kapott szmokat mindig a lehet
legkisebb helyen troljuk, de az rtkeknek nem szabad csonkulniuk!
/* PELDA12.C: Szorzat piramis */
#include <stdio.h>
#define N 16
void main(void){
int i; /* Az als sor: 100-s nagysgrend. */
char n[N]={100, 101, 102, 103, 104, 105, 106, 107,
108, 109, 110, 111, 112, 113, 114, 115};
short n1[N/2]; /* 2. sor: 10000-s nagysgrend. */
long n2[N/4]; /* 3. sor: 100000000 kb. */
long double n3[N/8]; /* 4. sor: 10 a 16-n kb. */
printf("Szorzat piramis: els szint\n");
for(i=0; i<N; i=i+2){
n1[i/2]=(short)n[i]*(short)n[i+1];
printf("%3d*%3d = %5hd\n", n[i], n[i+1], n1[i/2]); }
printf("Szorzat piramis: msodik szint\n");
for(i=0; i<N/2; i=i+2){
n2[i/2]=(long)n1[i]*(long)n1[i+1];
C programnyelv 67
printf("%5hd*%5hd = %9ld\n", n1[i], n1[i+1],
n2[i/2]); }
printf("Szorzat piramis: harmadik szint\n");
for(i=0; i<N/4; i=i+2){
n3[i/2]=(long double)n2[i]*(long double)n2[i+1];
printf("%9ld*%9ld = %17.0Lf\n", n2[i], n2[i+1],
n3[i/2]); }
printf("Szorzat piramis: cscs\n");
printf("%17.0Lf*%17.0Lf ~ %33.0Lf\n", n3[0], n3[1],
n3[0]*n3[1]);}
Mr a PELDA7.C pldban tallkoztunk az egszekre vonatkoz h
s l hosszmdostkkal a formtumspecifikcikban. Most a long double
tpus paramter jelzsre val L hosszmdostt ismerhettk meg.
e Ha a szorzat piramis msodik szintjnek kiszmtst vgz
n2[i/2]=(long)n1[i]*(long)n1[i+1];
kifejezsbl elhagyjuk a kt, explicit (long) tpusmdostt, akkor a lista-
rsz a kvetkezkpp mdosul:
Szorzat piramis: msodik szint
10100*10506 = 7816
10920*11342 = -8400
. . .
Ez vitathatatlanul rossz, de mirt?
- Az n1 tmb short tpus.
- A ktoperandusos szorzsi mvelet operandusai azonos tpusak,
teht semmifle implicit konverzi nem trtnik, s az eredmny t-
pusa is short.
- A 32 bites regiszterben a 10100*10506os szorzs vgrehajtsa
utn ugyan ott van a helyes eredmny, a 106110600 (0X6531E88)
0000 0110 0101 0011 0001 1110 1000 1000
, de a 16 bites short tpus miatt csak az als kt bjt kpezi az ered-
mnyt. Az meg 0X1E88, vagyis 7816.
Megemltjk mg, hogy a cscs rtknek (n3[0]*n3[1]) pontos-
sg veszts nlkli trolshoz mg a long double tpus is kevs!
Megoldand feladatok:
Ksztsnk programot, mely megllaptja az :PP:MM alak karak-
terlncrl, hogy rvnyes ide! Az ra zrus s 23, a perc, valamint a
msodperc 0 s 59 kztti rtk lehet csak. Jelezze ki a szoftver, ha a ka-
rakterlnc formailag hibs, s krjen msikat! Ha rvnyes az id, akkor
hatrozza meg s jelezze ki rtkt msodpercben!
68 TPUSOK S KONSTANSOK
Egy msik szoftver fogadjon a szabvny bemenetrl egsz szmokat
mindaddig, mg res sort nem adnak meg! Kpezze rendre az egsz sz-
mok s kt szomszdjuk ngyzetsszegt! A szm szomszdja a nlnl
eggyel kisebb s eggyel nagyobb rtk. A kpernyn jelentse meg fejlc-
cel elltva, tblzatos formban a szmhrmasokat (a bevitt rtkek llja-
nak kzpen) s a ngyzetsszegeket! Legvgl adja meg a ngyzetssze-
gek sszegt is. A szmok legyenek jobbra igaztottak!
4.4 Karakterlnc (string literal):
A karakterlncokrl mr sz volt a BEVEZETS S ALAPISMERE-
TEK szakaszban! A definci:
karakterlnc:
"<s-karakter-sor>"
s-karakter-sor:
s-karakter
s-karakter-sor s-karakter
s-karakter:
brmilyen karakter idzjel ("), fordtott per jel (\) s a soremels (\n) kivtelvel
escape-szekvencia (11. bra)
A karakterlnc adattpusa char tmb. A tmb mrete mindig eggyel
hosszabb, mint ahny karakterbl a karakterlnc ll, mert a nyelv a lnc
vgt \0 karakterrel jelzi. A karakterlnc konstansokat mindig a statikus
adatterleten helyezi el a fordt.
Pldul a Lali karakterlnc egy-
mst kvet, nvekv cm memria
bjtokon gy helyezkedik el.
A karakterlnc karaktereiknt hasznlhat az escape szekvencia is. Pl-
dul a
\t\t\Nv\\\\tCm\n\n
karakterlncot printf fggvny paramtereknt megadva
Nv\ Cm
jelenik meg utna kt soremelssel.
A csak fehr karakterekkel elvlasztott karakterlnc konstansokat a for-
dt elemzsi fzisa alatt egyetlen karakterlncc egyesti:
Egy kett, hrom... Egy kett, hrom...
Tudjuk, hogy a karakterlnc konstans a folytatssor (\) jelet hasznlva
tbb sorba is rhat:
printf(Ez igazbl egyetlen \
L a l i \0
0 1 2 3 4
C programnyelv 69
karakterlnc lesz.\n);
rjunk meg nhny karakterlncot kezel fggvnyt!
Az unsigned strlen(char s[]) a paramter karakterlnc hosszt szolgl-
tatja.
Indtsunk egy vltozt zrustl, s indexeljnk elre vele a karakterln-
con, mg a lnczr nullt el nem rjk! Ez az index a karakterlnc hossza
is egyben.
unsigned strlen(char s[]){
unsigned i=0u;
while(s[i]!=\0) ++i;
return i; }
A void strcopy(char cl[], char forrs[]) a hozzrendelst valstja
meg a karakterlncok krben azzal, hogy a forrs karakterlncot tm-
solja a cl karaktertmbbe.
Indexeljnk most is vgig egy vltozval a forrs karakterlncon a lez-
r zrusig! Kzben minden indexre rendeljk hozz a forrs tmbelemet
a cl tmbelemhez! Vigyzzunk, hogy a lnczr nulla is tkerljn!
void strcopy(char cl[], char forrs[]){
int i=0;
while((cl[i]=forrs[i])!=0) ++i; }
Javtsunk kicsit ezen a megoldson! A whilebeli relci elhagyhat,
hisz a hozzrendels is mindig igaz (nem zrus), mg a forrs[i] nem
lnczr zrus. Belthat, hogy a \0 karakter is tkerl, mert a while
csak a hozzrendels vgrehajtsa utn veszi csak szre, hogy kifejezse
hamiss (zruss) vlt. Teht:
while(cl[i]=forrs[i]) ++i;
Lssuk be, hogy a
while(cl[i++]=forrs[i]);
is tkletesen funkcionl, hisz
- Ellltja a forrs tmb iik elemt.
- Ezt hozzrendeli cl tmb iik elemhez.
- Az uttag ++ miatt mellkhatsknt kzben i rtke is n egyet.
A legjobb megoldsunk teht:
void strcopy(char cl[], char forrs[]){
int i=0;
while(cl[i++]=forrs[i]); }
70 TPUSOK S KONSTANSOK
A void strct(char s1[], char s2[]) egyesti a kt paramter karakterln-
cot s1be.
Indexeljnk elre az s1en a lnczr nullig, s ezutn ide kell msolni
az s2 karakterlncot!
Belthat, hogy a helyes megoldshoz kt indexvltoz szksges,
mert a msolsnl az egyiknek s1 lnczr nulljnak indextl kell in-
dulnia, mg a msiknak s2n zrustl.
void strct(char s1[], char s2[]){
int i=0, j=0;
while(s1[i]) ++i;
while(s1[i++]=s2[j++]); }
A void strup(char s[]) nagybetss alaktja sajt helyn az s karakter-
lncot.
Indexeljnk vgig az s karaktertmbn a lnczr zrusig! Egyegy po-
zcin meg kell vizsglni a tmbelem rtkt. Ha nem kisbet, akkor nem
kell tenni semmit. Ha kisbet, t kell rni nagybetv. Ha csak az angol
bc betivel foglalkozunk, akkor meg kell hatrozni a kisbet tmbe-
lem eltolst ahoz kpest, s ezt az eltolst hozz kell adni Ahoz.
void strup(char s[]){
int i;
for(i=0; s[i]; ++i)
if(s[i]>=a&&s[i]<=z)s[i]=s[i]-a+A; }
Felttlenl meg kell emlteni, hogy a most megrt karakterlnc keze-
l fggvnyek kicsit ms nvvel, de azonos funkcival, s paramterezs-
sel lteznek a szabvny knyvtrban. Hasznlatukhoz azonban a
STRING.H fejfjlt be kell kapcsolni. A nvlista:
strlen strlen
strcopy strcpy
strct strcat
strup strupr
Prbljuk ki a megrt fggvnyeinket egy rvid programmal! Krjnk be
egy sort a szabvny bemenetrl! Alaktsuk t nagybetss! Tegyk el az
ELEJE:, s mg a :VGE szveget! Jelentessk meg az eredmnyt! rjuk
mg ki az eredeti s az egyestett karakterlnc hosszt!
Helyszke miatt a fggvnyek teste helyett csak /* */eket kz-
lnk. A valsgban oda kell msolni a fggvnydefinci forrsszvegt
is.
/* PELDA13.C: Karakterlnc kezelse */
#include <stdio.h>
#define SOR 80 /* Bemeneti sor max. hossza. */
C programnyelv 71
int getline(char s[],int n){ /* ... */ }
unsigned strlen(char s[]){ /* ... */ }
void strcopy(char cl[], char forrs[]){ /* ... */ }
void strct(char s1[], char s2[]){ /* ... */ }
void strup(char s[]){/* ... */ }
void main(void){
int n; /* A bemeneti sor hossza. */
char sor[SOR+1], /* A bemeneti sor. */
egy[SOR*2]; /* Az egyestett karakterlnc. */
printf("Adjon meg egy sort!\n"
"Nagybetss alaktva megjelentetjk\n"
"ELEJE: :VGE szvegekbe zrva.\n"
"Kzljk az eredeti s a vgs hosszt is.\n");
n=getline(sor,SOR);
strcopy(egy, "ELEJE:");
strct(egy, sor);
strup(egy);
strct(egy, ":VGE");
printf("%s\nEredeti hossz:%3d\nMostani hossz:%3d\n",
egy, n, strlen(egy)); }
Megoldand feladatok:
Ksztse el a kvetkez fggvnyeket, s prblja is ki ket egy rvid
programmal!
- A void strlw(char s[]) kisbetss alaktja sajt helyn az s karakter-
lncot.
- Az int toup(int c) nagybetss alaktva visszaadja c rtkt.
- Az int tolw(int c) visszatrsi rtke c kisbetss alaktva.
- A void chdel(char s[], int c) kitrli az s karakterlncbl a sajt he-
lyn a benne elfordul c karaktereket. Msoljuk t az s karakterln-
cot egy segd tmbbe gy, hogy az aktulis karakter csak akkor ke-
rljn t, ha nem c! Az eredmny karakterlnc aztn visszamsolan-
d sbe! Sokkal jobb, ha a feladatot segd tmb nlkl oldjuk meg,
s a msolst a ck kihagysval rgtn az s tmbbe vgezzk. {CH-
DEL.C}
4.5 Deklarci
A deklarci megteremti a kapcsolatot az azonost s az objektum k-
ztt, ill. rgzti pldul tbbek kztt az objektum adattpust. Ktfle
deklarcirl beszlhetnk:
72 TPUSOK S KONSTANSOK
- A defincis deklarcival (definci) helyet foglaltatunk az objek-
tumnak a memriban, s esetleg kezdrtkkel is inicializljuk.
Ilyen deklarci egy azonostra csak egyetlen egy ltezhet az egsz
forrsprogramban.
- A referencia deklarci (deklarci) nem foglal memrit az objek-
tumnak, de tudatja a fordtval, hogy van egy ilyen azonostj,
adattpus, stb. objektum a programban. Ebbl a deklarcibl -
egymsnak ellent nem mondan - tbb is ltezhet ugyanarra az ob-
jektumra.
- Szlnunk kell mg deklarcis pontrl! Ez az azonost deklarci-
jnak helye a forrsprogramban. Az azonost deklarcis pontja
eltt leglisan nem rhet el a forrskdban.
Tudjuk azt is, hogy a deklarci elhelyezse s maga a deklarci meg-
hatrozza az objektum attribtumait:
- tpus,
- trolsi osztly,
- hatskr,
- lettartam stb.
A ksrleti definci fogalmt az ANSI szabvny vezette be. Brmely
kls adatdeklarci, melynek nincs trolsi osztly specifiktora s nincs
explicit inicializtora, ksrleti defincinak tekintend. Ha a deklarlt
azonost aztn feltnik egy ksbbi definciban, akkor a ksrleti defin-
cit extern trolsi osztlynak kell venni. Ms szval, a ksrleti defin-
ci egyszer referencia deklarci.
Ha a fordtsi egysg vgig sem tallkozunk defincival a ksrleti de-
fincis azonostra, akkor a ksrleti definci teljes definciv vlik
tiszta zrus kezdrtk objektummal.
int x;
int x; /* OK leglis, hisz nem mondtunk jat. */
int y;
int y = 4; /* OK. Most specifikltuk, hogy y-t 4-re kell
inicializlni. */
int z = 4;
int z = 6; /* HIBS, mert mindkett inicializlna. */
A deklarlhat objektumok a kvetkezk:
- vltozk,
C programnyelv 73
- fggvnyek,
- tpusok,
- tpusok tmbjei,
- enum konstansok s cmkk.
Deklarlhatk mg a kvetkez ksbbi fejezetekben trgyalt objek-
tumok is: struktra, uni s utasts cmkk, struktra s unitagok, vala-
mint elfeldolgoz makrk.
A deklartor szintaktika rekurzivitsa miatt egszen komplex deklarto-
rok is megengedettek. Ezt el szoks kerlni tpusdefincival (typedef). A
deklarci metanyelvi lersa a kvetkez:
deklarci:
deklarci-specifiktorok<init-deklartorlista>
deklarci-specifiktorok:
trolsi-osztly-specifiktor<deklarci-specifiktorok>
tpusspecifiktor<deklarci-specifiktorok>
init-deklartorlista:
init-deklartor
init-deklartorlista, init-deklartor
init-deklartor:
deklartor
deklartor=inicializtor
inicializtor:
hozzrendels-kifejezs
{inicializtorlista}
{inicializtorlista ,}
inicializtorlista:
inicializtor
inicializtorlista, inicializtor
trolsi-osztly-specifiktor:
auto
register
extern
static
typedef
tpusspecifiktor:
void
char
short
int
long
float
double
signed
74 TPUSOK S KONSTANSOK
unsigned
const
volatile
struktra-vagy-uni-specifiktor
enum-specifiktor
typedef-nv
typedef-nv:
azonost
deklartor:
<mutat>direkt-deklartor
direkt-deklartor:
azonost
(deklartor)
direkt-deklartor [<konstans-kifejezs>]
direkt-deklartor (paramter-tpus-lista)
direkt-deklartor (<azonostlista>)
konstans-kifejezs:
feltteles-kifejezs
azonostlista:
azonost
azonostlista, azonost
A mutatkkal, a struktrval, az unival, a fggvnyekkel, az utas-
ts cmkkkel s a makrkkal ksbbi szakaszokban s fejezetekben fog-
lalkozunk, gy a vonatkoz metanyelvi lersok is ott tallhatk.
A trolsi-osztly-specifiktorokat teljes rszletessggel majd egy k-
sbbi fejezetben taglaljuk, de kzlk kettrl (auto s extern) mr sz
volt a BEVEZETS S ALAPISMERETEK szakaszban. A kvetkez
fejezet nmi elzetes kpet ad a typedefrl.
A tpusspecifiktorokat alaptpusokra s tpusmdostkra bontottuk ko-
rbban. A tpusmdostk s alaptpusok megengedett, egyttes hasznla-
tt e szakasz elz fejezeteiben tisztztuk. A const s a volatile viszont
brmely alaptpussal s tpusmdostval egytt szinte korltozs nlkl
hasznlhat.
A deklartor egyedi azonostt hatroz meg. Mikor az azonost megje-
lenik egy vele egyeztpus kifejezsben, akkor a vele elnevezett objek-
tum rtkt eredmnyezi.
A konstans-kifejezs mindig fordtsi idben is meghatrozhat kons-
tans rtkk rtkelhet ki, azaz rtke bele kell hogy frjen a tpus br-
zolsi hatraiba. A konstans kifejezs brhol alkalmazhat, ahol konstans
egybknt hasznlhat. A konstans kifejezs operandusai lehetnek egsz
konstansok, karakter konstansok, lebegpontos konstansok, enumerto-
rok, tpusmdost szerkezetek, sizeof kifejezsek, stb. A konstans kifeje-
C programnyelv 75
zs azonban a sizeof opertor operandustl eltekintve nem tartalmazhatja
a kvetkez opertorok egyikt sem:
- hozzrendels,
- vessz,
- dekrementls,
- inkrementls s
- fggvnyhvs.
4.5.1 Elemi tpusdefinci (typedef)
Nem tartozik igazn ide a tpusdefinci trgyalsa, de miutn a typedef
kulcsszt a trolsi osztly specifiktor helyre kell rni, itt adunk rla egy
rvid ismertetst.
A typedef kulcsszval nem j adattpust, hanem j adattpus specifik-
tort definilunk. Legyen sz pldul az
auto long int brigi;
defincirl, mely szerint a brigi egy 32 bites, signed long int tpus, lo-
klis lettartam objektum azonostja. Hasznljuk most az auto kulcssz
helyett a typedef-et, s az azonostt rjuk t nagybetsre!
typedef long int BRIGI;
, ahol a BRIGI azonost nem kpez futsidej objektumot, hanem egy j
tpusspecifiktor csak. A programban ezutn a BRIGI tpusspecifiktor-
knt alkalmazhat deklarcikban. Pldul az
extern BRIGI fizetni;
ugyanolyan hats, mint az
extern long int fizetni;
Ez az egyszer plda megoldhat lenne a
#define BRIGI long
mdon is, a typedef-fel azonban az egyszer szveghelyettestsnl
komplexebb alkalmazsok is thidalhatk.
A typedef nem hoz ltre j tpust tulajdonkppen, csak ltez tpusokra
krelhat vele j kulcssz. Komplexebb deklarcik egyszerstsre va-
l.
76 TPUSOK S KONSTANSOK
e A tpusdefinci megbonyoltsra a ksbbiekben mg visszat-
rnk! Meg kell jegyeznnk azonban annyit, hogy a typedef-fel ltrehozott
tpusspecifiktor nem hasznlhat a deklarciban ms tpusspecifikto-
rokkal egytt! Legfeljebb a const s a volatile mdostk alkalmazhatk
r! Pldul
unsigned BRIGI keresni; /* HIBS. */
const BRIGI kaba = 2; /* OK */
C programnyelv 77
5 MVELETEK S KIFEJEZSEK
A mveleteket a nyelv opertorokkal (mveleti jelekkel) valstja meg.
A mveletek lehetnek:
- Egyoperandusos ak. Alakjuk opertor operandus, ahol az operan-
dus az a kifejezs, melyen az egyoperandusos mveletet el kell v-
gezni. Pldul: 6, vagy a sizeof(int) stb.
- Ktoperandusos ak, azaz operandus1 opertor operandus2 form-
jak. Pldul: a + b.
- Hromoperandusos ak: A C-ben egyetlen ilyen mvelet van, az n.
feltteles kifejezs. Pldul: (a > b) ? a : b rtke a, ha a > b s b
msklnben.
opertor: (a kvetkezk egyike!)
[ ] ( ) . -> ++ -- & * + - ~ ! sizeof / % << >> < > <= >= == != = ^ | && || ?: *= /= +=
-= %= <<= >>= &= ^= |= ,
A kifejezs opertorok, operandusok (s elvlaszt-jelek) sorozata, mely
az albbi tevkenysgek valamilyen kombincijt valstja meg:
- rtket szmt ki.
- Objektumot vagy fggvnyt r el.
- Mellkhatst generl.
A kifejezsbeli operandusokat elsdleges kifejezsnek nevezik.
elsdleges-kifejezs:
azonost
konstans
karakterlnc
(kifejezs)
kifejezs:
hozzrendels-kifejezs
kifejezs, hozzrendels-kifejezs
A konstansokat, a karakterlncot trgyaltuk a TPUSOK S KONS-
TANSOK szakaszban, a hozzrendels-kifejezst definilni fogjuk a hoz-
zrendels opertoroknl. Az azonost lehet brmilyen egsz vagy lebe-
gpontos tpus. Lehet enum, tmb, mutat, struktra, uni, vagy fgg-
vny tpus. Lehet teht:
- vltoz azonost belertve az indexel opertort is, azaz az azono-
st[kifejezs]-t is, s az uni, ill. a struktratagokat, vagy
78 MVELETEK S KIFEJEZSEK
- fggvnyhvs, azaz azonost a fggvnyhvs opertorral ( azono-
st() ), melynek tpusa mindig a fggvny ltal visszaadott rtk t-
pusa lesz.
sszestve: az azonostnak balrtknek vagy fggvnyhvsnak
kell lennie.
A kifejezs kirtkelse bizonyos
- konverzis,
- csoportost,
- asszociatv s
- prioritsi (precedencia)
szablyokat kvet, mely fgg
- a hasznlt opertoroktl,
- a ( ) prok jelenlttl s
- az operandusok adattpustl.
A kifejezsek klnflk lehetnek:
- elsdleges kifejezs (primary),
- uttag kifejezs (postfix),
- egyoperandusos kifejezs (unary),
- eltag kifejezs (cast),
- hozzrendels kifejezs stb.
Figyeljk meg, hogy a kifejezsek elnevezse - az elsdleges kifeje-
zstl eltekintve - a vele hasznlatos opertorok szerint trtnik!
uttag-kifejezs:
elsdleges-kifejezs
uttag-kifejezs[kifejezs]
uttag-kifejezs(<kifejezslista>)
uttag-kifejezs.azonost
uttag-kifejezs->azonost
uttag-kifejezs++
uttag-kifejezs
kifejezslista:
hozzrendels-kifejezs
kifejezslista , hozzrendels-kifejezs
C programnyelv 79
egyoperandusos-kifejezs:
uttag-kifejezs
++ egyoperandusos-kifejezs
-- egyoperandusos-kifejezs
egyoperandusos-opertor eltag-kifejezs
sizeof(egyoperandusos-kifejezs)
sizeof(tpusnv)
egyoperandusos-opertor: ( a kvetkezk egyike!)
& * + - ~ !
eltag-kifejezs:
egyoperandusos-kifejezs
(tpusnv) eltag-kifejezs
tpusnv:
tpusspecifiktor-lista<absztrakt-deklartor>
absztrakt-deklartor:
mutat
<mutat><direkt-absztrakt-deklartor>
direkt-absztrakt-deklartor:
(absztrakt-deklartor)
<direkt-absztrakt-deklartor>[<konstans-kifejezs>]
<direkt-absztrakt-deklartor>(<paramter-tpus-lista>)
A tpusnv az adattpus tpusneve. Szintaktikailag az adott tpus objek-
tum olyan deklarcija, melybl hinyzik az objektum neve.
A hozzrendels-kifejezst, melyrl most csak annyit jegyznk meg,
hogy nem balrtk, majd a hozzrendelsi mveleteknl ismertetjk!
5.1 Aritmetikai mveletek (+, -, *, / s %)
Kzlk a legmagasabb prioritsi szinten az egyoperandusos, jobbrl
balra kt eljel opertorok vannak. Ltezik a
- eltag-kifejezs
s a szimmetria kedvrt a
+ eltag-kifejezs.
Az eljel opertort kvet eltag kifejezsnek aritmetikai tpusnak kell
lennie, s az eredmny az operandus rtke (+), ill. annak -1-szerese (-). A
+ mvelet egsz operandust egszellptetsnek (integral promotion)
veti al a fordt, s gy az eredmny tpusa az egszellptets vgrehaj-
tsa utn kpzett tpus. A mveletet megelzheti implicit tpuskonver-
zi, s egsz operandus esetn az eredmny az operandus rtknek kettes
komplemense.
Az egszellptetssel az implicit tpuskonverzi kapcsn rgtn
foglalkozunk!
80 MVELETEK S KIFEJEZSEK
A tbbi aritmetikai opertor mind ktoperandusos, melyek kzl a szor-
zs (*), az oszts (/) s a modulus (%) magasabb prioritsi szinten van,
mint az sszeads (+) s a kivons (-). A szorzst, az osztst s a modu-
lust multiplikatv opertoroknak, az sszeadst s a kivonst additv ope-
rtoroknak is szoks nevezni.
5.1.1 Multiplikatv opertorok (*, / s %)
multiplikatv-kifejezs:
eltag-kifejezs
multiplikatv-kifejezs * eltag-kifejezs
multiplikatv-kifejezs / eltag-kifejezs
multiplikatv-kifejezs % eltag-kifejezs
Nzzk a mveletek pontos szablyait!
- A multiplikatv opertorok mind balrl jobbra csoportostanak.
- Mindhrom opertor operandusainak aritmetikai tpusaknak kell
lennik. A % opertor operandusai radsul csak egsz tpusak le-
hetnek.
- Ha az operandusok klnbz aritmetikai tpusak, akkor a mvelet
elvgzse eltt implicit konverzit hajt vgre a fordt. Az ered-
mny tpusa ilyenkor a konvertlt tpus. Miutn a konverzinak nin-
csenek tl vagy alulcsordulsi felttelei, rtkveszts kvetkezhet
be, ha az eredmny nem fr el a konverzi utni tpusban.
- A / s a % msodik operandusa nem lehet zrusrtk, mert ez for-
dtsi vagy futsidej hibhoz vezet.
- Ha a / s a % mindkt operandusa egsz, de a hnyados nem lenne
az, akkor:
- Ha a kt operandus - mondjuk op1 s op2 - rtke azonos eljel
vagy unsigned, akkor az op1/op2 hnyados az a legnagyobb
egsz, ami kisebb, mint az igazi hnyados s az op1%op2 osztsi
maradk op1 eljelt rkli meg:
3 / 2 1 3 % 2 1
(-3) / (-2) 1 (-3) % (-2) -1
- Ha op1 s op2 ellenkez eljel, akkor az op1/op2 hnyados az a
legkisebb egsz, ami nagyobb az igazi hnyadosnl. Az op1%op2
osztsi maradk most is op1 eljelt rkli meg:
(-3) / 2 -1 (-3) % 2 -1
3 / (-2) -1 3 % (-2) 1
C programnyelv 81
Ksztsnk programot, ami beolvas egy ngyjegy vszmot, s eldnti
rla, hogy szkve, vagy sem!
A Gergelynaptr szerint szkv minden, nggyel maradk nlkl
oszthat v. Nem szkv a kerek vszzad, de a 400zal maradk nlkl
oszthatk mgis azok.
1. Olvassunk be a szabvny bemenetrl egy maximlisan ngy karak-
teres sort!
2. Ha a bejtt karakterlnc hossza nem pontosan ngy, akkor krjk be
jra!
3. Ellenrizzk le, hogy a karakterlnc minden pozcija numerikuse!
Ha nem, jra bekrend.
rjunk int nume(char s[]) fggvnyt, mely 1et (igazat) ad vissza, ha a
paramter karakterlnc tiszta numerikus, s zrust (hamisat), ha nem!
int nume(char s[]){
int i;
for(i=0; s[i]; ++i) if(s[i]<0||s[i]>9) return 0;
return 1; }
4. t kne konvertlni a numerikus karakterlncot fixpontos belsb-
rzols egssz (int nn)! A mdszer a kvetkez:
n=(s[0]-0)*1000+(s[1]-0)*100+(s[2]-0)*10+
(s[3]-0);
Ezt ugye ciklusban, ahol i s n zrustl indul, s i egyesvel haladva
vgigjrja a numerikus karakterlncot, gy kne csinlni:
n=n*10+(s[i]-0);
rjunk int atoi(char s[]) fggvnyt, mely megvalstja ezt a konverzit,
s n lesz a visszaadott rtke! Az talaktst vgezze az els nem konver-
tlhat karakterig! Engedjk meg, hogy a numerikus karakterlnc elejn
fehr karakterek s eljel is lehessen! Ha az eljelet elhagyjk, akkor le-
gyen a szm pozitv!
int atoi(char s[]){
int i=0, n=0;
int elojel=1; /* Alaprtelmezs: pozitv. */
/* A karakterlnc eleji fehr karakterek tlpse: */
while(s[i]== ||s[i]==\n||s[i]==\t) ++i;
/* Eljel: */
if(s[i]=='+'||s[i]=='-') if(s[i++]=='-') elojel=-1;
/* Konverzi: */
for(;s[i]>='0'&&s[i]<='9';++i) n=10*n+s[i]-'0';
return(elojel*n); }
82 MVELETEK S KIFEJEZSEK
Megemltend, hogy pontosan ilyen prototpus, nev s funkcij
fggvny ltezik a szabvny knyvtrban is, de bekapcsoland hozz a
szabvnyos STDLIB.H fejfjl. A knyvtrban van atol rutin, mely long
g, s van atof, mely doublel alaktja numerikus karakterlnc param-
tert.
Jhet a program, de helyszke miatt a fggvnyek definciit nem
ismteljk meg!
/* PELDA14.C: A ngyjegy vszm szkv-e? */
#include <stdio.h>
#define MAX 80
int getline(char s[], int n);
int nume(char s[]);
int atoi(char s[]);
void main(void){
int ev = 0; /* Elfogadhatatlan rtkrl indul. */
char s[MAX+1]; /* Az input puffer. */
printf("A ngyjegy vszm szkv-e?\n");
while(ev<1000 || ev>9999){
printf("Adjon meg egy vszmot!\n");
if(getline(s,4)==4&&nume(s)) ev=atoi(s);
else printf(Formailag hibs bemenet!\n); }
if(ev%4==0&&ev%100!=0||ev%400==0)
printf("%4d szkv.\n", ev);
else printf("%4d nem szkv.\n", ev); }
Megoldand feladatok:
Ksztsen szmot ler karakterlncok formai ellenrzst vgz fgg-
vnyeket az atoi alapjn, melyek helyes esetben 1et (igaz) adnak vissza,
s a hibt zrussal (hamis) jelzik! A lnc eleji fehr karaktereket t kell
lpni. A szm vgt a karakterlnc vge, vagy jabb fehr karakter kvet-
kezse mutatja.
- Az int egesze(char s[]) a decimlis egsz konstans rsszablyt el-
lenrzi a paramter karaktertmbn.
- Az int hexae(char s[]) megvizsglja, hogy paramtere hexadecim-
lis szme. {HEXA.C}
- Az int ell210e(char s[]) teszteli, hogy s 2 s 10 kztti alap szm
e. A szmrendszer alapjt fordtsi idben vltoztatni (#define) le-
het!
- Az int ellae(char s[], int alap) ugyanazt teszi, mint az ell210e, de a
2 s 10 kztti alapot futsi idben paramterknt kapja meg.
- Az int ella36e(char s[], int alap) egyezik ellaevel, de az alap 2 s
36 kztti lehet.
C programnyelv 83
A tznl nagyobb alap szmrendszerek esetben a szmjegyeket az
angol bc betivel jelljk rendre, vagyis 10=A, 11=B stb. A 36os
korltozs ebbl fakad.
Ksztsen konverzis fggvnyeket is a leellenrztt karakterlncokra
az atoi mintjra, s a konvertlt rtk legyen a rutinok visszatrsi rt-
ke!
- A double atofix(char s[]) az eljeles, legfeljebb egsz s trt rsz-
bl ll vals rtket alaktja doublel.
- A long atoh(char s[]) hexadecimlis karakterlncot alakt egssz.
{HEXA.C}
- A long ato36(char s[], int alap) a legfeljebb 36 alap szmrend-
szerbeli lncot konvertlja egssz.
5.1.2 Additv opertorok (+ s -)
additv-kifejezs:
multiplikatv-kifejezs
additv-kifejezs + multiplikatv-kifejezs
additv-kifejezs - multiplikatv-kifejezs
Az additv opertorok csoportostsa is balrl jobbra trtnik. Operan-
dusaik az aritmetikai rtkeken tl mutatk is lehetnek.
A mutataritmetikt majd a mutatk kapcsn ismertetjk!
Aritmetikai operandusok esetn az eredmny a kt operandus rtknek
sszege (+), ill. klnbsge (). Egsz vagy lebegpontos operanduson a
mvelet implicit tpuskonverzit is vgezhet, ha szksges. Ilyenkor az
eredmny tpusa a konvertlt tpus. Miutn a konverzinak nincsenek tl
vagy alulcsordulsi felttelei, rtkveszts kvetkezhet be, ha az ered-
mny nem fr el a konverzi utni tpusban.
5.1.3 Matematikai fggvnyek
A matematikai fggvnyek nem rszei a C nyelvnek. Nyilvnval vi-
szont, hogy kifejezsek kpzsekor szksg lehet rjuk. A C filozfija
szerint a matematikai fggvnyek csaldjt is a szabvny knyvtrban kell
elhelyezni, mint ahogyan a szabvny bemenet s kimenet kezelst vgz
rutinokat.
Az ANSI szabvny pontosan rgzti ezeket a knyvtri funkcikat, gy
brmilyen szabvnyos C fordt s opercis rendszer szmra kompatibi-
lis formban lteznik kell. Magyarn: azok a programok, melyek az ope-
rcis rendszerrel val kapcsolatukat a szabvny knyvtron t valstjk
84 MVELETEK S KIFEJEZSEK
meg, minden vltoztats nlkl tvihetk az egyik szmtgprl a msik-
ra, az egyik opercis rendszerbl a msikba. Ezek az gy nevezett port-
bilis programok.
A szabvny knyvtr fggvnyeit, tpusait s makrit szabvnyos fejfj-
lokban deklarltk. Ezek kzl nhnnyal mr tallkoztunk, msokkal
meg mg nem:
ASSERT.H CTYPE.H ERRNO.H FLOAT.H ISO646.H
LIMITS.H LOCALE.H MATH.H SETJMP.H SIGNAL.H
STDARG.H STDDEF.H STDIO.H STDLIB.H STRING.H
TIME.H WCHAR.H WCTYPE.H
A matematikai fggvnyek prototpusai a MATH.H fejfjlban helyez-
kednek el, gy hasznlatuk eltt ez a fejfjl bekapcsoland!
#include <math.h>
Nem kvnjuk felsorolni s rszletezni az sszes fejfjlt, az sszes
fggvnyt, csak nhny fontosabbat emltnk meg kzlk. Az olvastl
azonban elvrjuk, hogy a programfejleszt rendszere segtsgbl a tovb-
bi fejfjlokrl s rutinokrl is tjkozdjk.
A matematikai fggvnyek double rtket szolgltatnak, s nhny kiv-
teltl eltekintve, paramtereik is double tpusak. A matematikbl isme-
retes korltozsok termszetesen rvnyben maradnak rjuk. A trigono-
metrikus fggvnyek paramtere, ill. inverzeik visszaadott rtke radin-
ban rtend.
Nhnyat felsorolunk a teljessg ignye nlkl!
sin(x) x szinusza.
cos(x) x koszinusza.
tan(x) x tangense.
asin(x) 1<=x<=1 rkusz szinusza. Az rtkkszlet: [/2, /2].
acos(x) 1<=x<=1 rkusz koszinusza. Az rtkkszlet: [0, ].
atan(x) x rkusz tangense. Az rtkkszlet: [/2, /2].
exp(x) Az e
x
exponencilis fggvny.
log(x) x>0 termszetes alap logaritmusa. (ln(x)).
log10(x) x>0 tzes alap logaritmusa. (lg(x)).
pow(x, y) Az x
y
hatvnyfggvny. Hiba, ha x=0 s y<=0, ill. ha x<0
s y rtke nem egsz.
sqrt(x) x>=0 ngyzetgyke.
floor(x) Az xnl nem nagyobb, legnagyobb egsz szm.
fabs(x) Az x abszolt rtke.
C programnyelv 85
fmod(x, y) y!=0 estn x/y oszts lebegpontos maradka, mely xszel
egyez eljel.
A szabvny knyvtri fggvnyek, gy a matematikaiak is, a hibt gy
jelzik, hogy valamilyen specilis rtket (HUGE_VAL, zrus stb.) adnak
vissza, s belltjk a UNIXtl rklt, globlis
extern int errno;
(hibaszm) vltozt a hiba kdjra. A hibakdok az ERRNO.H fejfjlban
definilt, egsz, nem zrusrtk szimbolikus llandk. A HUGE_VAL a
legnagyobb, pozitv, mg brzolhat double rtk.
A matematikai rutinok az rtelmezsi tartomny hibt EDOM rtk
errnoval, s a fordttl is fgg fggvny visszatrsi rtkkel jelzik.
rtkkszlet problma esetn az errno ERANGE. A fggvny visszatr-
si rtk tlcsordulskor eljel helyes HUGE_VAL, ill. alulcsordulskor
zrus.
Az rtelmezsi tartomny hiba akkor fordul el, ha a fggvny aktu-
lis paramternek rtke nincs benn az rtelmezsi tartomnyban. rtk-
kszlet hiba egyrtelmen az, ha az eredmny nem brzolhat double r-
tkknt.
Pldul az sqrt(1.) hatsra az errno EDOM, s a visszakapott rtk
negatv HUGE_VAL.
Megoldand feladatok:
Ksztend a kzpiskols fggvnytblzatok mintjra lapozhatan:
- egy logaritmustbla s
- egy szinusztbla.
5.2 Relci opertorok ( >, >=, <, <=, == s !=)
A relci opertorok prioritsa - eltekintve az egyoperandusos mvele-
tektl - az aritmetikai s a logikai opertorok kztt helyezkedik el. A re-
lci opertorok kt prioritsi szintet kpeznek, ahol az igazi relcik
(>, >=, < s <=) prioritsa magasabb az egyenlsgi relciknl (== s !
=). Az sszes relci az els operandus rtkt hasonltja a msodikhoz,
s a relci rvnyessgt vizsglja. Az eredmny logikai rtk (int tpu-
s), mely 1, ha a relci igaz s 0, ha nem. A defincik:
relcis-kifejezs:
eltols-kifejezs
relcis-kifejezs < eltols-kifejezs
relcis-kifejezs > eltols-kifejezs
86 MVELETEK S KIFEJEZSEK
relcis-kifejezs <= eltols-kifejezs
relcis-kifejezs >= eltols-kifejezs
egyenlsgi-kifejezs:
relcis-kifejezs
egyenlsgi-kifejezs == relcis-kifejezs
egyenlsgi-kifejezs != relcis-kifejezs
Az eltols-kifejezst a bitenknti eltols opertoroknl definiljuk!
A relcik operandusai egsz, lebegpontos, vagy mutat tpusak. Az
operandusok tpusa klnbzhet. Az opertorok implicit tpuskonverzit
is vgrehajthatnak aritmetikai operandusaikon a mvelet elvgzse eltt.
Ne feledjk, hogy a
kifejezs != 0
relci mindig rvidthet
kifejezs
mdon, mert a nyelvben a nem zrus rtk logikai igaznak minsl.
Pldaknt tekintsk meg jra a korbbi szakaszokban ismertetett
atoi s getline fggvnyeket!
5.3 Logikai mveletek ( !, && s ||)
Kzlk a legmagasabb prioritsi szinten az egyoperandusos, jobbrl
balra kt, logikai nem opertor van, melynek alakja:
! eltag-kifejezs
, ahol az eltag-kifejezs operandusnak egsz, lebegpontos, vagy mutat
tpusnak kell lennie. Az eredmny mindenkppen int tpus, s az operan-
dus logikai negcija. Az eredmny 0, ha az operandus rtke nem zrus,
ill. 1, ha az operandus rtke zrus. Ez utbbi mondatrsz biztostja, hogy
a
kifejezs == 0
mindenkor rvidthet
! kifejezs
mdon. Pldul a multiplikatv opertoroknl ismertetett program rszlet
if( ev%4 == 0 && ev%100 != 0 || ev%400 == 0)
utastsa gy rvidthet:
if( !(ev%4) && ev%100 || !(ev%400))
Kt ktoperandusos logikai mvelet van a nyelvben a logikai s (&&) s
a logikai vagy (||), melyek prioritsa alacsonyabb a relciknl s a bit
C programnyelv 87
szint mveleteknl. A logikai s prioritsa radsul magasabb, mint a lo-
gikai vagy. Mindkt mvelet balrl jobbra csoportost. Egyik opertor
sem hajt vgre implicit tpuskonverzit operandusain, ehelyett zrushoz
viszonytva rtkeli ki ket. Az eredmny int tpus (1 - igaz s 0 -
hamis).
logikai-s-kifejezs:
vagy-kifejezs
logikai-s-kifejezs && vagy-kifejezs
logikai-vagy-kifejezs:
logikai-s-kifejezs
logikai-vagy-kifejezs || logikai-s-kifejezs
A vagy-kifejezs defincijt a bit szint mveleteknl talljuk meg!
A K1&&K2 kifejezs eredmnye igaz (1), ha K1 s K2 egyike sem z-
rus. A K1||K2 kifejezs igaz (1), ha K1 s K2 valamelyike is nem zrus.
Msklnben K1&&K2 s K1||K2 eredmnye hamis (0).
e Mindkt opertor esetben garantlt a balrl jobbra trtn vgre-
hajts. Elszr K1et rtkeli ki a fordt az esetleges sszes mellkhat-
sval egytt, de:
- K1&&K2 esetn, ha K1 zrus, az eredmny hamis (0), s K2 kirt-
kelse nem trtnik meg.
- K1||K2 kifejezsnl, ha K1 nem zrus, az eredmny igaz (1) lesz, s
K2 kirtkelse itt sem zajlik le.
Ha valami elbbre val, vagy mindenkpp szeretnnk, hogy megtr-
tnjen, akkor azt a bal oldali operandusba kell bepteni. Pldul a PEL-
DA10.Cben megrt getline for ciklusnak felttele nem vletlenl
i<n && (c=getchar())!=EOF && c!=\n
sorrend, hisz elszr azt kell biztostani, hogy a paramter karaktertm-
bt ne rhassa tl a fggvny. Ez nem kerlhet htrbb a kifejezsben. Az-
tn a kvetkez karaktert elbb be kell olvasni a bemenetrl, de minden-
nek vge van fjlvg esetn. Itt sincs rtelme a felcserlsnek, mert feles-
leges vizsglgatni a fjlvget, hogy soremelse. A relcik kzti s m-
veletek miatt ltszik, hogy balrl jobbra trtnik az operandusok kirtke-
lse, s ha ekzben az egyik hamis lesz, teljesen felesleges lenne tovbb-
folytatni a kirtkelst.
5.4 Implicit tpuskonverzi s egszellptets
Ha ktoperandusos (pldul aritmetikai) mveleteknl klnbzik a kt
operandus tpusa, akkor a mvelet elvgzse eltt a fordt bels konver-
zit (talaktst) hajt vgre. ltalban a pontosabb operandus tpusra
88 MVELETEK S KIFEJEZSEK
konvertlja a msikat. A ktoperandusos mvelet eredmnynek tpusa a
konvertlt tpus lesz. Ezt a fajta konverzit szabvnyosnak, szoksosnak
is nevezik. A szablyok nem prioritsi sorrendben a kvetkezk:
1. Ha az egyik operandus tpusa long double, akkor a msikat is long
double tpusv konvertlja a fordt.
2. Ha az elz pont nem teljesedik, s az egyik operandus double, ak-
kor a msik is az lesz.
3. Ha az elz kt felttel egyike sem valsul meg, s az egyik operan-
dus float, akkor a msikat is azz konvertlja a fordt.
4. Ha az elz hrom felttel egyike sem teljesl (egyik operandus sem
lebegpontos!), akkor egszellptetst hajt vgre a fordt az ope-
randusok rtkn, ha szksges, s aztn:
- Ha az egyik operandus unsigned long, akkor a msik is azz alakul.
- Ha az elz pont nem teljesl, s az egyik operandus long, a msik
pedig unsigned int, akkor mindkt operandus rtkt long, vagy
unsigned long tpusv konvertlja a fordt. Ha az unsigned int
teljes rtktartomnya brzolhat longknt, akkor a vlaszts
long, msklnben pedig unsigned long.
Ha az int 16, s a long 32 bites, akkor 1L<1U. Hisz az elmondot-
tak szerint az unsigned int longg alakul, s 1L<1L. Ha az int 32 bites,
akkor 1L>1UL, mert a 1L 11111111111111111111111111111111
2
bi-
nrisan, unsigned longg alaktva ugyanez marad, s ez sokkal nagyobb
00000000000000000000000000000001
2
nl.
- Ha az elz pontok nem teljeslnek, s az egyik operandus long,
akkor a msik is az lesz.
- Ha nem teljeslnek az elz pontok, s az egyik operandus unsig-
ned int, akkor a msik is azz alakul.
- Ha az elz pontok nem teljeslnek, akkor minkt operandus int az
rvnybe lpett az egszellptets (integral promotion) miatt. A
signed vagy unsigned char, short int, vagy bitmez objektumok,
ill. az enum tpusak hasznlhatk kifejezsben ott, ahol bennk
egsz llhat. Ha az eredeti tpus minden lehetsges rtkt int kpes
reprezentlni, akkor az rtket int tpusv konvertlja a fordt,
msklnben unsigned int-t. Az egszellptetsi folyamat ga-
rantlja, hogy a konverzi eltti s utni rtk ugyanaz marad. A
C programnyelv 89
konvertlt rtk unsigned eredeti tpusbl 0X00 feltltssel, signed
eredeti tpusbl viszont eljel kiterjesztssel kszl a fels bjtokba.
Tpus Konvertlva Mdszer
char int Az alaprtelmezett char tpustl fgg-
en eljel kiterjeszts van (signed) vagy
0X00 kerl a magasabb helyirtk bjt
(ok)ba (unsigned).
unsigned char int A fels bjt(ok) 0X00 feltltsek.
signed char int Eljel kiterjeszts van a fels bjt(ok)-
ba.
short int int Ugyanaz az rtk eljel kiterjesztssel.
unsigned short unsigned int Ugyanaz az rtk 0X00 feltltssel.
enum int Ugyanaz az rtk.
12. bra: Egszellptets
e Ne feledjk azonban el, hogy a konverzi mindig fggvnyhvst
jelent (gpid!), azaz szksgtelenl ne alkalmazzuk! Csak rtelmes t-
puskonverzikat valst meg a fordt. Pldul az f + i sszeads vgre-
hajtsa eltt - feltve, hogy f float s i int tpus - i rtke (s nem i
maga!) float-t alakul.
Az rtelmetlen lebegpontos kifejezs indexben mg csak megvalsul
gy, hogy a kifejezs rtke trt rszt levgja a fordt
#include <stdio.h>
void main(void){
int t[] = {2,3,4,5,6,7};
float f=1.75;
printf("%d\n",t[f]); }
, azaz 3 lesz az eredmny.
e Numerikus karakterlnc azonban sohasem alakul automatikusan a-
ritmetikai rtkk. Ehhez valamilyen konverzis fggvnyt kell hasznlni.
Az STDLIB.Hbeli atoirl, atolrl s atofrl volt mr sz!
5.5 Tpusmdost szerkezet
Az implicit (szoksos, szabvnyos stb.) konverzikon tl magunk is ki-
knyszerthetnk (explicit) tpuskonverzit a
(tpusnv) eltag-kifejezs
alak, a BEVEZETS S ALAPISMERETEK szakaszban megismert
tpusmdost szerkezet alkalmazsval. Ltjuk, hogy a tpusmdost
szerkezet egyoperandusos, s ez ltal magas priorits mvelet. A definci-
ban a tpusnv a cltpus, s az eltag-kifejezs rtkt erre a tpusra kell
90 MVELETEK S KIFEJEZSEK
konvertlni. Az eltag-kifejezst gy konvertlja a fordt, mintha az rt-
ket egy tpusnv tpus vltoz venn fel. Az explicit tpuskonverzi teht
a hozzrendelsi konverzi szablyait kveti. A leglis tpusmdostsok:
Cltpus Potencilis forrsok
egsz brmilyen egsz vagy lebegpontos tpus, vagy mutat
lebegpontos brmilyen aritmetikai tpus
void brmilyen tpus
Pldaknt vegyk a matematikai fggvnyek kzl a ngyzetgykt,
azaz:
#include <math.h>
double sqrt(double x);
Programunkban van egy int tpus n vltoz, akkor az n+26 pozitv gy-
kt az
sqrt(double(n+26))
fggvnyhvssal kaphatjuk meg.
e Brmilyen azonost, vagy kifejezs tpusa mdosthat voidd.
A tpusmdostsnak alvetett azonost, vagy kifejezs nem lehet azon-
ban void. A void fggvny hvst pldul hiba tpusmdostjuk int-re, a
semmibl nem lehet egszet csinlni.
e A voidd mdostott kifejezs rtke nem kpezheti hozzrende-
ls trgyt. Hasonlan az explicit tpusmdosts eredmnye nem fogad-
hat el balrtkknt hozzrendelsben.
Kifejezst csak olyan helyen mdosthatunk void-d, ahol az rtkre
nincs szksg. Pldul nincs szksg a bejv gombnyomsra:
printf(A folytatshoz ssn Entert-t! ); (void)getchar();
5.6 sizeof opertor
A BEVEZETS S ALAPISMERETEK szakaszbl ismert sizeof
egyoperandusos, jobbrl balra kt, magas priorits mvelet, mely min-
dig az operandusa trolshoz szksges memria mennyisgt szolgltat-
ja bjtban. Az eredmny size_t tpus egsz rtk. Az STDDEF.H fejfjl-
ban megtekintve a tpust tbbnyire azt ltjuk, hogy unsigned int.
A size_t tpus rtelmezse fordttl fgg tulajdonkppen!
Kt klnbz alakja van az opertornak:
sizeof(egyoperandusos-kifejezs)
sizeof(tpusnv)
C programnyelv 91
sizeof(egyoperandusos-kifejezs) esetn az egyoperandusos kifejezs tpu-
st a fordt a kifejezs kirtkelse nlkl hatrozza meg, azaz ha az ope-
randus tmbazonost, az egsz tmb bjtokban mrt helyfoglalshoz ju-
tunk. Pldul a tomb tmb elemszma a kvetkez konstrukcival llapt-
hat meg:
sizeof(tomb) / sizeof(tomb[0])
e A sizeof nem hasznlhat fggvnyre, vagy nem teljes tpus kife-
jezsre, ilyen tpusok zrjelbe tett nevre, vagy olyan balrtkre, mely
bitmez objektumot jell ki.
A sizeof azonban btran alkalmazhat elfeldolgoz direktvkban
is!
#define MERET sizeof(int)*3
5.7 Inkrementls (++), dekrementls (--) s mellkhats
Ezek az opertorok mind egyoperandusosak, s ezrt magas prioritsak.
Mindkt opertor ltezik uttag
uttag-kifejezs++
uttag-kifejezs--
s eltag mveletknt:
++ egyoperandusos-kifejezs
-- egyoperandusos-kifejezs
Az inkrementl s dekrementl kifejezsben az uttag- vagy az egy-
operandusos-kifejezsnek skalr (aritmetikai vagy mutat) tpusnak s
mdosthat balrtknek kell lennik, de az eredmny nem balrtk.
Az inkrementlsnl (++) a balrtk eggyel nagyobb, dekrementlsnl
(--) viszont eggyel kisebb lesz. Eltag opertornl a konstrukci rtke
egyezik az j balrtkkel, mg uttag opertornl a konstrukci rtke
az inkrementls vagy dekrementls vgrehajtsa eltti rtk. Az ered-
mny tpust az operandus tpusa hatrozza meg. Pldul:
int x, i = 3, j = 4, n = 5;
x = n++; /* x == 5 s n ==
6 */
x = ++n; /* x == 7 s n ==
7 */
x = --( n - j + i +6); /* x == 11 */
A kifejezs produklhat
- balrtket,
- jobbrtket vagy
92 MVELETEK S KIFEJEZSEK
- nem szolgltat rtket.
A kifejezsnek ezen kvl lehet mellkhatsa is. Pldul a TPUSOK
S KONSTANSOK szakaszban megrt strcopy zr sorban
while(cl[i++]=forrs[i])
a hozzrendels mellkhatsaknt az i vgrehajts utni rtke is eggyel
nagyobb lesz. A mellkhatst a kifejezs kirtkelse okozza, s akkor k-
vetkezik be, ha megvltozik egy vltoz rtke. Minden hozzrendels o-
pertornak van mellkhatsa. Lttuk, hogy a balrtkre alkalmazott inkre-
mentlsi s dekrementlsi mveletnek is van. Fggvnyhvsnak is le-
het azonban mellkhatsa, ha globlis hatskr objektum rtkt vltoz-
tatja meg.
rjuk meg a void chdel(char s[], int c)t, mely sajt helyen trli a benne
elfordul c karaktereket az s karakterlncbl!
Itt is msolni kell a forrsbl a clba bjtrlbjtra haladva, de a c rt-
k karaktereket ki kell ebbl hagyni. Kt indexre van szksg. Az egyik
az i, mely vgigjrja a forrst. A msik a j, mely a clban mindig a kvet-
kez szabad helyet ri el. A nem c rtk karaktert a kvetkez szabad
helyre kell msolni, s a clbeli indexnek az ezutn kvetkez szabad hely-
re kell mutatnia.
void chdel(char s[], int c){
int i, j;
for(i=j=0; s[i]; ++i) if(s[i] != c) s[j++] = s[i];
s[j] = 0; }
5.8 Bit szint opertorok ( ~, <<, >>, &, ^ s |)
e A bit szint opertorok csak signed s unsigned egsz tpus ada-
tokra: char, short, int s long hasznlhatk.
Legmagasabb prioritsi szinten az egyoperandusos, jobbrl balra kt
egyes komplemens opertor (~) van, melynek defincija:
~ eltag-kifejezs
Az opertor elbb vgrehajtja az egszellptetst, ha szksges. Az
eredmny tpusa az operandus konverzi utni tpusa. Az eredmny maga
a bit szint egyes komplemens, azaz ahol az operandus bit 1 volt, ott az
eredmny bit 0 lesz, s ahol az operandus bit 0 volt, ott az eredmny bit 1
lesz. Feltve, hogy az egszellptets 16 bites, s hogy:
unsigned short x = 0XF872, /* 1111100001110010 */
maszk = 0XF0F0;/* 1111000011110000 */
, akkor a ~x 0000011110001101
2
, s a ~maszk 0000111100001111
2
.
C programnyelv 93
A balrl jobbra csoportost eltols opertorok (<< s >>) prioritsa ala-
csonyabb az aritmetikai mveleteknl, de magasabb, mint a relci ope-
rtorok. Az eltols opertorok els operandusuk rtkt balra (<<) vagy
jobbra (>>) toljk annyi bitpozcival, mint amennyit a msodik operan-
dus meghatroz. A definci a kvetkez:
eltols-kifejezs:
additv-kifejezs
eltols-kifejezs << additv-kifejezs
eltols-kifejezs >> additv-kifejezs
A K1<<K2 s a K1>>K2 kifejezsek esetben minkt operandus egsz
tpus kell, legyen. Az opertorok egszellptetst is megvalsthatnak.
Az eredmny tpust K1 konvertlt tpusa hatrozza meg. Ha K2 negatv
vagy rtke nem kisebb K1 bitszlessgnl, akkor az eltolsi mvelet
eredmnye hatrozatlan.
e Miutn a Cben nincs egsz alul vagy tlcsorduls, a mveletek
rtkvesztst is okozhatnak, ha az eltolt eredmny nem fr el az els ope-
randus konvertlt tpusban.
A K1<<K2 balra tolja K1 rtkt K2 bitpozcival gy, hogy jobbrl 0
bitek jnnek be. K1 tlcsorduls nlkli balra tolsa ekvivalens K1*2
K2