kernighanritchie c

179
1 Előszó a magyar kiadáshoz A C programnyelvet eredetileg a Bell Laboratóriumban az UNIX operációs rendszerhez, az alatt fejlesztették ki PDP-11_ számítógépen. A kifejlesztése óta eltelt évek során bebizonyosodott, hogy a C nem egyszerűen egy a napjainkban gombamód szaporodó programnyelvek közül. Korszerű vezérlési és adatszerkezetei, rugalmassága, könnyű elsajátíthatósága széles alkalmazási területet biztosított számára, különösen a 16 bit-es mikroprocesszorok megjelenése óta rendkívül sok gépen dolgoznak C nyelven. C fordító készült olyan gépekre, mint az IBM System/370, a Honeywell 6000 és az Interdata 8/32. A nyelv a kutatás-fejlesztési, tudományos célú programozás népszerű eszközévé vált. Magyarországon szintén egyre több olyan számítógép működik, amely alkalmas a C megvalósítására. Ilyenek a hazai gyártmányok közül a TPA-11 sorozatú, az R-11 , a szocialista gyártmányok közül az SZM-4 számítógépek, de meg kell említenünk a hazánkban ugyancsak elterjedt PDP-11 sorozat tagjait is. Igy érthetően a magyar számítástechnikai szakemberek körében mind nagyobb az érdeklődés a C nyelv iránt, egyre többen szeretnének megtanulni programozni ezen a nyelven. Ebben szeretnénk segíteni e könyv megjelentetésével, amely didaktikusan, bő példa- és gyakorlatanyaggal kiegészítve szól a C összetevőiről, jellemzőiről, de tartalmazza a nyelv referencia- kézikönyvét is. Az Olvasó a legavatottabb forrásból meríthet : a világhírű szerzőpáros egyik tagja, Dennis Ritchie a C nyelv tervezője, a másik, Brian W. Kernighan több, magyarul is megjelent nagy sikerű szakkönyv szerzője. Reméljük, mind a kezdő, mind a gyakorlott C-programozók haszonnal forgatják majd a művet. A Kiadó Előszó A C általános célú programnyelv. Tömörség, a korszerű vezérlési és adatstruktúrák használata, bőséges operátorkészlet jellemzi. Nem nevezhető sem nagyon magas szintű, sem nagy nyelvnek, és nem kötődik egyetlen speciális alkalmazási területhez sem. Ugyanakkor a megkötések hiánya, az általános jelleg sok magas szintű nyelvnél kényelmesebbé és hatékonyabbá teszi. A C nyelvet tervezője, Dennis Ritchie eredetileg az UNIX operációs rendszer programnyelvének szánta. Az operációs rendszer, a C fordító és lényegében az összes UNIX alkalmazási program (a könyv eredetijének a nyomdai előkészítéséhez használt szoftver is) C nyelven íródott. Dennis Ritchie az első C fordítót PDP- 11-en írta meg, de azóta néhány más gépre, így az IBM System/370-re, a Honeywell 6000-re és az Interdata 8/32-re is készült C fordító: A C nyelv nem kötődik szorosan egyetlen hardverhez vagy rendszerhez sem, könnyen írhatunk olyan programokat, amelyek változtatás nélkül futnak bármely más, a C nyelvet támogató gépen. Könyvünkkel a C nyelvű programozás elsajátításához szeretnénk segítséget adni. Az olvasó már az Alapismeretek c. fejezet megértése után elkezdhet programozni. A könyv ezután külön-külön fejezetben ismerteti a C nyelv fő összetevőit, majd referencia-kézikönyv formájában is összefoglalja a nyelvet. Az anyag túlnyomórészt példaprogramok írásából, olvasásából és módosításából áll, nem száraz szabálygyűjteményt adunk az olvasó kezébe. A legtöbb példa teljes, ellenőrzött, működőképes program, és nem csupán elszigetelt programrész. Könyvünkben nemcsak a nyelv hatékony használatát kívántuk ismertetni. Törekedtünk arra is, hogy jó stílusú, áttekinthető, hasznos algoritmusokat és programozási elveket mutassunk be. A könyv nem bevezető jellegű programozási segédkönyv; feltételezi, hogy az olvasó ismeri a programozás olyan alapfogalmait, mint: változók, értékadó utasítások, ciklusok, függvények. [A C nyelvben használatos terminológia szerint a szubrutinokat függvényeknek (functions) nevezik. A ford.] Ugyanakkor a könyv alapján egy kezdő programozó is megtanulhatja a nyelvet, bár szüksége lehet jártasabb kolléga segítségére. Tapasztalataink szerint a C sokféle feladat megfogalmazására alkalmas, kellemes, kifejező és rugalmas nyelv. Könnyen elsajátítható, és aki megismerte, szívesen használja. Reméljük, hogy könyvünk segítséget nyújt a nyelv hatékony használatában. A könyv megszületéséhez és a megírásakor érzett örömünkhöz nagyban hozzájárultak barátaink, kollégáink gondolatgazdag bírálatai és javaslatai. Különösen hálásak vagyunk Mike Bianchinak, Jim Blue-nak, Stu Feldmannek, Doug Mcllroynak, Bill Roome-nak, Bob Rosinnek és Larry Roslernek, akik figyelmesen elolvasták a könyv több változatát is. Al Aho, Steve Bourne, Dan Dvorak, Chuck Haley, Debbie Haley, Marion Harris, Rick Holt, Steve Johnson, John Mashey, Bob Mitze, Ralph Muha, Peter Nelson, Elliot Pinson, Bill Plauger, Jerry Forrás: http://www.doksi.hu

Upload: toeroek-zoltan

Post on 14-Nov-2015

217 views

Category:

Documents


2 download

DESCRIPTION

Programozas

TRANSCRIPT

  • 1

    Elsz a magyar kiadshoz A C programnyelvet eredetileg a Bell Laboratriumban az UNIX opercis rendszerhez, az alatt fejlesztettk ki PDP-11_ szmtgpen. A kifejlesztse ta eltelt vek sorn bebizonyosodott, hogy a C nem egyszeren egy a napjainkban gombamd szaporod programnyelvek kzl. Korszer vezrlsi s adatszerkezetei, rugalmassga, knny elsajtthatsga szles alkalmazsi terletet biztostott szmra, klnsen a 16 bit-es mikroprocesszorok megjelense ta rendkvl sok gpen dolgoznak C nyelven. C fordt kszlt olyan gpekre, mint az IBM System/370, a Honeywell 6000 s az Interdata 8/32. A nyelv a kutats-fejlesztsi, tudomnyos cl programozs npszer eszkzv vlt.

    Magyarorszgon szintn egyre tbb olyan szmtgp mkdik, amely alkalmas a C megvalstsra. Ilyenek a hazai gyrtmnyok kzl a TPA-11 sorozat, az R-11 , a szocialista gyrtmnyok kzl az SZM-4 szmtgpek, de meg kell emltennk a haznkban ugyancsak elterjedt PDP-11 sorozat tagjait is. Igy rtheten a magyar szmtstechnikai szakemberek krben mind nagyobb az rdeklds a C nyelv irnt, egyre tbben szeretnnek megtanulni programozni ezen a nyelven.

    Ebben szeretnnk segteni e knyv megjelentetsvel, amely didaktikusan, b plda- s gyakorlatanyaggal kiegsztve szl a C sszetevirl, jellemzirl, de tartalmazza a nyelv referencia-kziknyvt is. Az Olvas a legavatottabb forrsbl merthet : a vilghr szerzpros egyik tagja, Dennis Ritchie a C nyelv tervezje, a msik, Brian W. Kernighan tbb, magyarul is megjelent nagy siker szakknyv szerzje. Remljk, mind a kezd, mind a gyakorlott C-programozk haszonnal forgatjk majd a mvet.

    A Kiad

    Elsz A C ltalnos cl programnyelv. Tmrsg, a korszer vezrlsi s adatstruktrk hasznlata, bsges opertorkszlet jellemzi. Nem nevezhet sem nagyon magas szint, sem nagy nyelvnek, s nem ktdik egyetlen specilis alkalmazsi terlethez sem. Ugyanakkor a megktsek hinya, az ltalnos jelleg sok magas szint nyelvnl knyelmesebb s hatkonyabb teszi.

    A C nyelvet tervezje, Dennis Ritchie eredetileg az UNIX opercis rendszer programnyelvnek sznta. Az opercis rendszer, a C fordt s lnyegben az sszes UNIX alkalmazsi program (a knyv eredetijnek a nyomdai elksztshez hasznlt szoftver is) C nyelven rdott. Dennis Ritchie az els C fordtt PDP- 11-en rta meg, de azta nhny ms gpre, gy az IBM System/370-re, a Honeywell 6000-re s az Interdata 8/32-re is kszlt C fordt: A C nyelv nem ktdik szorosan egyetlen hardverhez vagy rendszerhez sem, knnyen rhatunk olyan programokat, amelyek vltoztats nlkl futnak brmely ms, a C nyelvet tmogat gpen.

    Knyvnkkel a C nyelv programozs elsajttshoz szeretnnk segtsget adni. Az olvas mr az Alapismeretek c. fejezet megrtse utn elkezdhet programozni. A knyv ezutn kln-kln fejezetben ismerteti a C nyelv f sszetevit, majd referencia-kziknyv formjban is sszefoglalja a nyelvet. Az anyag tlnyomrszt pldaprogramok rsbl, olvassbl s mdostsbl ll, nem szraz szablygyjtemnyt adunk az olvas kezbe. A legtbb plda teljes, ellenrztt, mkdkpes program, s nem csupn elszigetelt programrsz. Knyvnkben nemcsak a nyelv hatkony hasznlatt kvntuk ismertetni. Trekedtnk arra is, hogy j stlus, ttekinthet, hasznos algoritmusokat s programozsi elveket mutassunk be. A knyv nem bevezet jelleg programozsi segdknyv; felttelezi, hogy az olvas ismeri a programozs olyan alapfogalmait, mint: vltozk, rtkad utastsok, ciklusok, fggvnyek. [A C nyelvben hasznlatos terminolgia szerint a szubrutinokat fggvnyeknek (functions) nevezik. A ford.] Ugyanakkor a knyv alapjn egy kezd programoz is megtanulhatja a nyelvet, br szksge lehet jrtasabb kollga segtsgre. Tapasztalataink szerint a C sokfle feladat megfogalmazsra alkalmas, kellemes, kifejez s rugalmas nyelv. Knnyen elsajtthat, s aki megismerte, szvesen hasznlja. Remljk, hogy knyvnk segtsget nyjt a nyelv hatkony hasznlatban. A knyv megszletshez s a megrsakor rzett rmnkhz nagyban hozzjrultak bartaink, kollgink gondolatgazdag brlatai s javaslatai.

    Klnsen hlsak vagyunk Mike Bianchinak, Jim Blue-nak, Stu Feldmannek, Doug Mcllroynak, Bill Roome-nak, Bob Rosinnek s Larry Roslernek, akik figyelmesen elolvastk a knyv tbb vltozatt is. Al Aho, Steve Bourne, Dan Dvorak, Chuck Haley, Debbie Haley, Marion Harris, Rick Holt, Steve Johnson, John Mashey, Bob Mitze, Ralph Muha, Peter Nelson, Elliot Pinson, Bill Plauger, Jerry

    Forrs: http://www.doksi.hu

  • 2

    Spivack, Ken Thompson s Peter Weinberger megjegyzseikkel sokat segtettk munknkat klnbz fzisaiban. Ksznet illeti tovbb Mike Lesket s Jim Ossant a knyv szedsben val rtkes kzremkdskrt.

    Brian W. Kernighan Dennis M. Ritchie

    Bevezets A C ltalnos cl programnyelv. Trtnetileg szorosan kapcsoldik az UNIX opercis rendszerhez, mivel ezen rendszer alatt fejlesztettk ki s mivel az UNIX s szoftvere C nyelven kszlt. A nyelv azonban nem ktdik semmilyen opercis rendszerhez vagy gphez. Noha _ rendszer-programnyelvnek szoks nevezni, mivel opercis rendszerek rsban jl hasznlhat, ugyanolyan clszeren alkalmazhat nagyobb numerikus, szvegfeldolgoz s adatbzis-kezel programok esetben is. A C viszonylag alacsony szint nyelv. Ez nem lebecslst jelent, csupn azt, hogy a C nyelv - mint a legtbb szmtgp - karakterekkel, szmokkal s cmekkel dolgozik. Ezek kombinlhatk, s az adott gpen rendelkezsre ll aritmetikai s logikai opertorokkal mozgathatk.

    A C nyelvben nincsenek olyan mveletek, amelyekkel sszetett objektumokat, pl. karakterlncokat, halmazokat, listkat vagy tmbket egy egsznek tekinthetnnk. Hinyzik pldul azoknak a PL/1 mveleteknek a megfelelje, amelyek egy egsz tmbt vagy karakterlncot kezelnek. A nyelvben nincs ms trfoglalsi lehetsg, mint a statikus definci s a fggvnyek loklis vltozinl alkalmazott verem elv. Nincs tovbb olyan, hulladk trterletek sszegyjtsre alkalmas mechanizmus (garbage collection), mint amilyet az ALGOL 68 nyjt. Vgl pedig maga a C nyelv nem biztost be- s kiviteli szolgltatsokat: nincsenek read s write utastsok, sem rgztett llomnyelrsi (file-elrsi) mdszerek. Az sszes ilyen magasabb szint tevkenysget explicit mdon hvott fggvnyekkel kell megvalstani.

    Hasonlkppen a C nyelv csak egyszer, egy szlon fut vezrlstadsi struktrkat tartalmaz: ellenrzseket, ciklusokat s alprogramokat, de nem teszi lehetv a multiprogramozst, a prhuzamos mveleteket, a szinkronizlst vagy prhuzamos rutinok (korutinok) hasznlatt.

    Br e szolgltatsok nmelyiknek hinya slyos hinyossgnak tnhet, a nyelv szerny mretek kz szortsa valjban elnykkel jrt. A C nyelv viszonylag kicsi, ezrt kis helyen lerhat s gyorsan elsajtthat. A C fordt egyszer s tmr lehet, ugyanakkor knnyen megrhat: a jelenlegi technolgival egy j gpen fut fordt nhny hnap alatt elkszthet, s kdjnak 80%-a vrhatlag kzs lesz a mr ltez fordtk kdjval. Ez nagyban segti a nyelv terjedst, a programok cserjt. Mivel a C nyelvben definilt adattpusokat s vezrlsi szerkezeteket a legtbb mai szmtgp kzvetlenl tmogatja, kicsi lesz az nll programok megvalstshoz futsi idben szksges rutinknyvtr, amely a PDP-11 -en pldul csak a 32 bit-es szorzst s ; osztst vgrehajt rutinokat, illetve a szubrutinba val belpst s az onnan val kilpst szolgl szekvencikat tartalmazzk. Termszetesen a nyelv valamennyi megvalstst kiterjedt, az adott gphez illeszked fggvnyknyvtr teszi teljess. A fggvnyek biztostjk a be- s kiviteli mveletek elvgzst, a karakterlncok kezelst s a trfoglalsi mveletek vgrehajtst. Mivel azonban csak explicit mdon hvhatk, szksg esetn elhagyhatk, ezenkvl C programknt gpfggetlen mdon is megrhatk. Minthogy a C a mai szmtgpek kpessgeit tkrzi, a C nyelv programok ltalban elg hatkonyak ahhoz, hogy ne kelljen helyettk assembly programokat rni. Ennek legjellemzbb pldja maga az UNIX opercis rendszer, amely majdnem teljes egszben C nyelven rdott.

    13000 sornyi rendszerkdbl csak a legalacsonyabb szinten elhelyezked 800 sor kszlt assemblyben. Ezenkvl majdnem minden UNIX alkalmazsi szoftver forrsnyelve is a C; az UNIX felhasznlk tlnyom tbbsge (belertve e knyv szerzinek egyikt is) nem is ismeri a PDP-11 assembly nyelvet. A C nyelv sok szmtgp kpessgeihez illeszkedik, minden konkrt szmtgp-architektrtl fggetlen, gy knnyen rhatunk gpfggetlen, teht olyan programokat, amelyek klnfle hardvereken vltoztats nlkl futtathatk. A szerzk krnyezetben ma mr szokss vlt, hogy az UNIX alatt kifejlesztett szoftvert tviszik a helyi Honeywell, IBM s Interdata rendszerekre. Valjban az ezen a ngy gpen mkd C fordtk s futtatsi szolgltatsok egymssal sokkal inkbb kompatibilisek, mint az ANSI-szabvnyos FORTRAN megfelel vltozatai. Maga az UNIX opercis rendszer jelenleg mind a PDP-11-en, mind pedig az Interdata 8/32-n fut. Azokon a programokon kvl, amelyek szksgszeren tbb-kevsb gpfggek, mint a C fordt, az assembler vagy a

    Forrs: http://www.doksi.hu

  • 3

    debugger, a C nyelven rt szoftver mindkt gpen azonos. Magn az opercis rendszeren bell az assembly nyelv rszeken s a perifriahandlereken kvli 7000 sornyi kd mintegy 95%-a azonos.

    Ms nyelveket mr ismer programozk szmra az sszehasonlts kedvrt rdemes megemlteni a C nyelv nhny trtneti, technikai s filozfiai vonatkozst.

    A C nyelv sok alaptlete a nla jval rgebbi, de mg ma is l BCPL nyelvbl szrmazik, amelyet Martin Richards fejlesztett ki. A BCPL a C nyelvre kzvetett mdon, a B nyelven keresztl hatott, amelyet Ken Thompson 1970-ben a PDP-7-esen fut els UNIX rendszer szmra rt.

    Br a C nyelvnek van nhny kzs vonsa a BCPL-lel, mgsem nevezhet semmilyen rtelemben a BCPL egyik vltozatnak. A BCPL s a B tpus nlkli nyelvek: az egyetlen adattpus a gpi sz s msfle objektumokhoz val hozzfrs specilis opertorokkal s fggvnyhvsokkal trtnik.

    A C nyelvben az alapvet adatobjektumok a karakterek, a klnfle mret egsz (integer) tpusok s a lebegpontos szmok. Ehhez jrul mg a szrmaztatott adattpusok hierarchija, amelyek mutatk (pointerek), tmbk, struktrk, unionok s fggvnyek formjban hozhatk ltre. A C nyelv tartalmazza a jl struktrlt programok ksztshez szksges alapvet vezrlsi szerkezeteket: az sszetartoz utastssorozatot, a dntshozatalt (if), a programhurok tetejn (while for) vagy aljn (do) vizsglatot tartalmaz ciklust s a tbb eset valamelyiknek kivlasztst (switch). (Ezek mindegyike rendelkezsre llt a BCPL-ben is, szintaxisuk azonban nmileg klnbztt a C-belitl; a BCPL nhny vvel megelzte a struktrlt programozs elterjedst.)

    A C nyelv lehetv teszi a mutatk hasznlatt s a cmaritmetikt.

    A fggvnyek argumentumainak tadsa az argumentum rtknek lemsolsval trtnik, s a hvott fggvny nem kpes megvltoztatni az aktulis argumentumot a hvban. Ha nv szerinti hvst akarunk megvalstani, egy mutatt adhatunk t explicit mdon s a fggvny megvltoztathatja azt az objektumot, amire a mutat mutat. A tmbnv gy addik t, mint a tmb kezdcme, teht tmbargumentumok tadsa nv szerinti hvssal trtnik.

    Brmely fggvny rekurzv mdon hvhat s loklis vltozi rendszerint automatikusak, azaz a fggvny minden egyes meghvsakor jra ltrejnnek. A fggvnydefincik nem skatulyzhatk egymsba, a vltozk azonban blokkstruktrban is deklarlhatk. A C programokban szerepl fggvnyek kln is fordthatk. Megklnbztethetnk egy fggvnyre nzve bels, kls (csak egyetlen forrsllomnyban ismert) s teljesen globlis vltozkat. A bels vltozk automatikusak s statikusak lehetnek. Az automatikus vltozk a hatkonysg nvelse rdekben regiszterekbe helyezhetk, de a register deklarci csak ajnls a fordtnak s nem vonatkozik adott gpi regiszterekre.

    A PASCAL-lal vagy az ALGOL 68-cal sszehasonltva a C nem szoros tpusmegkts nyelv, viszonylag engedkeny az adatkonverzikat illeten, de az adattpusok konverzija nem a PL/1-re jellemz szabadossggal trtnik. A jelenlegi fordtk nem ellenrzik futs kzben a tmbindexeket, argumentumtpusokat stb.

    Ha szigor tpusellenrzs szksges, a C fordt egy specilis vltozatt, a lint-et kell hasznlni. A lint nem generl kdot, hanem a fordts s tlts sorn lehetsges legtbb szempontbl igen szigoran ellenriz egy adott programot. Jelzi a nem illeszked tpusokat, a kvetkezetlen argumentumhasznlatot, nem hasznlt vagy nyilvnvalan inicializlatlan vltozkat, az esetleges gpfggetlensgi problmkat stb. Azok a programok, amelyekben a lint nem tall hibt, ritka kivtelektl eltekintve krlbell ugyanolyan mrtkben mentesek a tpushibktl, mint pldul az ALGOL 68 programok. A megfelel helyen a lint tovbbi szolgltatsait is ismertetjk.

    Vgezetl a C-nek, mint minden ms nyelvnek, megvannak a maga gyengesgei. Nmelyik opertornak rossz a precedencija; a szintaxis bizonyos rszei jobbak is lehetnnek; a nyelvnek tbb, kismrtkben eltr vltozata l. Mindezzel egytt a C nyelv szles krben alkalmazhat, rendkvl hatkony s kifejezkpes nyelvnek bizonyult.

    A knyv felptse a kvetkez: Az 1. fejezet a nyelv megtanulst segt bevezets a C nyelv kzponti rszbe. Ennek az a clja, hogy az olvas minl hamarabb elkezdhessen programozni, mivel a szerzk hite szerint egy j nyelv megtanulsnak egyetlen mdja, ha programokat runk az illet nyelven. A fejezet felttelezi, hogy az olvas rendelkezik a programozs alapjainak aktv ismeretvel; az anyag nem magyarzza meg, hogy mi a szmtgp, mi a fordts, sem pedig az olyan kifejezsek jelentst, mint n = n + 1 . Br lehetleg mindentt hasznos programozsi mdszereket prbltunk bemutatni, nem

    Forrs: http://www.doksi.hu

  • 4

    szntuk mvnket az adatstruktrk s algoritmusok kziknyvnek: knyszer vlaszts esetn elssorban a nyelvre koncentrltunk.

    A 2. ... 6. fejezet rszletesen, az 1. fejezetnl preczebben trgyalja a C nyelv klnbz elemeit, a hangsly azonban itt sem a rszleteken, hanem a teljes, a gyakorlatban alkalmazhat pldaprogramokon van. A 2. fejezet az alapvet adattpusokat, opertorokat s kifejezseket ismerteti. A 3. fejezet a programvezrlssel: if-else, while, for stb. foglalkozik. A 4. fejezet tmi : a fggvnyek s a program felptse, kls vltozk, az rvnyessgi tartomny szablyai stb. Az 5. fejezet a mutatkkal s a cmaritmetikval, a 6. fejezet a struktrkkal s unionokkal kapcsolatos tudnivalkat tartalmazza. A 7. fejezet a szabvnyos be- s kiviteli (I/o) knyvtrat ismerteti, amely kzs csatlakozfelletet kpez az opercis rendszer fel. Ezt a be- s kiviteli knyvtrat minden olyan gp tmogatja, amely a C-t tmogatja, teht azok a programok, amelyek ezt hasznljk bevitel, kivitel s ms rendszerfunkcik cljbl, lnyegben vltoztats nlkl vihetk t egyik rendszerrl a msikra.

    A 8. fejezet a C programok s az UNIX opercis rendszer kztti csatlakozsokat rja le, elssorban a be- s kivitelre, az llomnyrendszerre s a gpfggetlensgre koncentrlva. Br e fejezet egy rsze UNIX-specifikus, a nem UNIX-ot hasznl programozk is hasznos tudnivalkat tallhatnak benne - megtudhatjk pl., hogyan valstottk meg a szabvnyos knyvtr adott verzijt, s hogyan nyerhetnk gpfggetlen programkdot. Az A. fggelk a C nyelv referencia-kziknyvt, a C szintaxisnak s szemantikjnak hivatalos lerst tartalmazza. Ha az elz fejezetekben esetleg ktrtelmsgekre vagy hinyossgokra bukkanunk, mindig ezt kell vgs dntbrnak tekinteni.

    Mivel a C olyan, mg fejldsben lev nyelv, amely szmos rendszeren fut, elfordulhat, hogy a knyv egy-egy rsze nem felel meg valamely adott rendszer fejldse pillanatnyi llapotnak. Igyekeztnk elkerlni az ilyen problmkat, s megprbltuk felhvni a figyelmet a lehetsges nehzsgekre. Ktes esetekben azonban ltalban a PDP-11 UNIX rendszer esetben rvnyes helyzet lerst vlasztottuk, mivel a C programozk tbbsgnek ez a munkakrnyezete. Az A. fggelkben ismertetjk a fontosabb C rendszerek megvalstsaiban mutatkoz klnbsgeket is.

    _

    A. fggelk : C referencia-kziknyv

    1. Bevezets A kziknyv a DEC PDP 11 , a Honeywell 6000, az IBM System/370 s az Interdata 8/32 gpeken hasznlhat C nyelvet ismerteti. Eltrsek esetn a PDP 11 -es vltozatot helyezi eltrbe, de igyekszik rmutatni a megvalstsfgg rszletekre. Nhny kivteltl eltekintve ezek a gpfgg rszletek kzvetlenl a hardver alaptulajdonsgaibl kvetkeznek; a klnfle fordtk ltalban elgg kompatibilisek.

    2. Szintaktikai egysgek A szintaktikai egysgek hat osztlyba sorolhatk: azonostk, kulcsszavak, llandk, karakterlncok, opertorok s egyb szepartorok. A szkzket, tabultorokat, jsorokat, megjegyzseket (kzs nevkn res helyeket), mint az albbiakban is ltni fogjuk, a C fordt nem veszi figyelembe, eltekintve attl, hogy feladatuk a szintaktikai egysgek elvlasztsa. res helyre van szksg az egybknt szomszdos azonostk, kulcsszavak s llandk elvlasztsra.

    Ha a beolvasott szveg szintaktikai egysgekre bontsa adott karakterig megtrtnt, a fordt azt a lehet leghosszabb karakterlncot tekinti a kvetkez egysgnek, amelyrl felttelezhet, hogy mg egyetlen szintaktikai egysget kpez.

    2.1. Megjegyzsek A /*karakterek megjegyzst (comment) vezetnek be, amely a */ karakterekkel zrul. A megjegyzsek nem skatulyzhatk egymsba.

    2.2. Azonostk (nevek) Az azonost betk s szmjegyek sorozata; az els karakter bet kell, hogy legyen. A alhzsjel betnek szmt. A nagy-s kisbetk klnbzk. Csupn az els nyolc karakter rtkes, br tbb is hasznlhat. A klnfle , assemblerek s betltprogramok ltal hasznlt kls azonostk ennl ktttebbek:

    Forrs: http://www.doksi.hu

  • 5

    DEC PDP 11 7 karakter, ktfle bettpus (kis-s nagybet).

    Honeywell 6000 6 karakter, egyfle bettpus. IBM 360/370 7 karakter, egyfle bettpus. Interdata 8/32 8 karakter, ktfle bettpus. 2.3. Kulcsszavak

    Az albbi azonostk a nyelv kulcsszavai, gy egyb clra nem hasznlhatk:

    int extern else char register for float typedef do double static while struct goto switch union return case long sizeof default short break entry auto unsigned continue if Az entry kulcsszt egyetlen jelenleg mkd fordtban sem valstottk meg, ksbbi fejlesztsekhez tartottuk fenn. Bizonyos megvalstsokban a fortran s az asm szavak is kulcsszknt szerepelnek.

    2.4. llandk Tbbfajta lland van; ezeket a kvetkezkben soroljuk fel. A mreteket rint hardverjellemzket a 2.6. pontban foglaljuk ssze.

    2.4.1. Egsz llandk A szmjegyek sorozatt tartalmaz egsz tpus (integer) llandt a fordt oktlisnak tekinti, ha 0-val (a nulla szmjeggyel) kezddik, egybknt decimlisnak veszi. A 8 s 9 szmjegyek oktlis rtke 10, ill. 11 . Az olyan szmjegysorozatot, amelyet 0X vagy 0x (a 0 a nulla szmjegy) elz meg, a fordtprogram hexadecimlis egsznek tekinti. Hexadecimlis szmjegyek az a-tl, ill. A-tl f-ig, ill. F-ig elhelyezked karakterek, amelyeknek rtke 10, . . ., 15. Azt a decimlis llandt, amelynek rtke meghaladja a gpenbr zolhat legnagyobb eljeles egszt, a fordtprogram long-nak veszi; hasonlkppen long lesz az az oktlis vagy hexadecimlis lland, amelynek rtke meghaladja a legnagyobb, eljel nlkli gpi egszt.

    2.4.2. Explicit long llandk Az a decimlis, oktlis vagy hexadecimlis egsz, amelyet kzvetlenl l (el bet) vagy L kvet, long (hossz) lland. Amint arrl az albbiakban sz lesz, bizonyos gpeken az int s long rtkek azonosak.

    2.4.3. Karakterllandk A karakterlland aposztrfok (szimpla idzjelek) kz zrt karakter, pl. x. A karakterlland rtke a karakternek a gp karakterkszletben szerepl numerikus rtke.

    Bizonyos nem grafikus karaktereket, pl. az aposztrfot () vagy a fordtott trtvonalat (\) az albbi escape-szekvencikkal brzolhatunk:

    jsor NL (LF) \n vzszintes tab HT \t vissza-szkz BS \b kocsi-vissza CR \r lapdobs FF \f fordtott trtvonal \ \\ aposztrf \ bitminta ddd \ddd A \ddd escape-szekvencia egy fordtott trtvonalat s 1 , 2 vagy 3 rkvetkez oktlis szmjegyet tartalmaz, amelyek a kvnt karakter rtkt hatrozzk meg. E konstrukci specilis esete a \0 (amit nem kvet szmjegy), amely a NULL karaktert jelli. Ha a fordtott trtvonalat kvet karakter nem az elbbiek egyike, a fordt a fordtott trtvonalat nem veszi figyelembe.

    2.4.4. Lebegpontos llandk A lebegpontos lland egsz rszbl, tizedespontbl, trtrszbl, e-bl vagyE-bl s (esetleg eljeles) kitevbl ll. Mind az egsz, mind a trt rsz szmjegyek sorozata. Akr az egsz, akr a trt rsz hinyozhat (de mind a kett nem!); ill. a tizedespont vagy az e s a kitev kzl az egyik szintn elmaradhat. Minden lebegpontos lland duplapontossg.

    Forrs: http://www.doksi.hu

  • 6

    2.5. Karakterlncok A karakterlnc idzjelek kz zrt karaktersorozat: . . .. A karakterlnc tpusa szerint karaktertmb, trolsi osztlya static (l. a kvetkezkben a 4. szakaszt), s a megadott karakterek inicializljk. Az egyes karakterlncok, mg az azonos mdon lertak is, kln egysget kpeznek. A fordt minden karakterlnc vgre elhelyezi a \0 nullabyte-ot abbl a clbl, hogy a karakterlncot vizsgl programok megtalljk a karakterlnc vgt. A karakterlncon bell elhelyezett idzjelet \ kell, hogy megelzze; a karakterllandknl ismertetett sszes escape-szekvencia hasznlhat. Vgl megjegyezzk, hogy az \-t s az azt kzvetlenl kvet jsort a fordt nem veszi figyelembe.

    2.6. Hardverjellemzk Az albbi tblzatban nhny olyan hardvertulajdonsgot foglaltunk ssze, amely gprl gpre vltozik. Noha ezek a programok gpfggetlensgt rintik, mgis jval kisebb problmt okoznak, mint azt valaki eleve gondoln. (A szmokbitekben rtendk.)

    DEC PDP-11 Honeywell 6000 IBM 370 Interdata 8/32 ASCII ASCII EBCDIC ASCII char 8 9 8 8 int 16 36 32 32 short 16 36 16 16 long 32 36 32 32 float 32 36 32 32 double 64 72 64 64 rtktar-

    tomny +-10+-38 +-10+-38 +-10+-76 +-10+-76

    E ngy gp esetben a lebegpontos szmoknak 8 bites kitevjk van.

    3. A szintaxis jellse A kziknyvben hasznlt szintaktikai jellsmdban a

    kulcsszavakat s karaktereket - ahol az egyrtelmsg megkvnja

    kvr szedssel jelljk. A vlaszthat (alternatv) kategrik kln sorban szerepelnek. Az elhagyhat (opcionlis)

    szimblumokat az opc index jelli, gy

    { kifejezsopc } kapcsos zrjelek kz zrt elhagyhat kifejezst jell. A szintaxist ksbb a 18. pontban foglaljuk ssze.

    4. Az azonostk rtelmezse A C nyelv az azonostk rtelmezst az azonostk kt tulajdonsgra alapozza: a trolsi osztlyra s a tpusra. A trolsi osztly az azonosthoz rendelt trhely elhelyezkedst s lettartamt, a tpus az azonosthoz rendelt trterleten tallt rtkek jelentst hatrozza meg.

    Ngy deklarlhat trolsi osztly van: automatikus, statikus, kls s regiszterosztly. Az automatikus vltozk egy blokk minden hvsra nzve loklisak (l. a 9.2. pontot) rtkket a blokkbl val kilpskor elvesztik; a statikus vltozk egy blokkra nzve loklisak, de mg akkor is megtartjk rtkket, ha a vezrls idkzben kilpett a blokkbl; a kls vltozk megmaradnak s megtartjk rtkket az egsz program vgrehajtsa sorn s fggvnyek kztti kommunikcira hasznlhatk, mg kln-kln lefordtott fggvnyek esetben is. A regisztervltozk (ha lehetsges) a gp gyors regisztereiben troldnak; az automatikus vltozkhoz hasonlan az egyes blokkokra nzve loklisak s a blokkbl val kilpskor eltnnek.

    A C nyelv tbb alapvet objektumtpus hasznlatt engedi meg:

    A karakterknt (char) deklarlt objektumok elegenden nagyok ahhoz, hogy az adott implementci karakterkszletnek tetszleges elemt trolni tudjk, s ha valban egy, az illet karakterkszletbl vett karaktert akarunk karakter tpus vltozban trolni, annak rtke meg fog egyezni a karakter egsz rtk kdjval. Ms mennyisgek is trolhatk karakter tpus vltozkban, de ennek megvalstsa gpfgg. Maximum hromfle egsz tpus mret ll rendelkezsre, amelyeket short int (rvid egsz),

    Forrs: http://www.doksi.hu

  • 7

    int (egsz) s long int (hossz egsz) alakban deklarlunk. A hosszabb egszek bizonyosan nem ignyelnek kevesebb trhelyet, mint a rvidebbek, de az adott nyelvi megvalsts a short int-eket a long int-ekkel vagy akr mind a kettt kznsges egszekkel (int) egyenl mretv teheti. A kznsges egszeknek a befogad gp architektrjbl kvetkez termszetes mretk van; a tbbi mret specilis ignyek kielgtsre szolgl.

    Az unsigned-knt deklarlt, eljel nlkli egszekre a modulo Zn aritmetika szablyai vonatkoznak, ahol n a bitek szma az adott megvalstsban. (A PDP-11 az eljel nlkli long mennyisgeket nem tmogatja.)

    Az egyszeres pontossg lebegpontos (float) s a duplapontossg lebegpontos (double) brzols egyes gpeken azonos lehet.

    Mivel az emltett tpus objektumok clszeren rtelmezhetk szmokknt, ezekre mint aritmetikai tpusokra fogunk hivatkozni. Az sszes char s int tpust (mrettl fggetlenl) egyttesen integrlis tipusnak, a float-ot s a double-t egyttesen lebegpontos tipusnak fogjuk nevezni.

    Az alapvet aritmetikai tpusokon kivl elvileg vgtelen szm leszrmaztatott tpus kpezhet az alaptpusokbl, az albbi mdokon:

    tmbk, amelyek a legtbb tpus objektumbl kpezhetk;

    fggvnyek, amelyek adott tpus objektumot adnak vissza;

    mutatk, amelyek adott tpus objektumra mutatnak;

    struktrk, amelyek klnfle tpus objektumok

    sorozatt tartalmazzk;

    unionok, amelyek klnfle tpus objektumok brmelyikt tartalmazhatjk.

    Az objektumok ltrehozsnak ezek a mdszerei ltalban rekurzv mdon alkalmazhatk.

    5. Objektumok s balrtkek Az objektum a tr valamely mveletekkel kezelhet rsze; a balrtk (lvalue) objektumra hivatkoz kifejezs. A balrtk kifejezsre kzenfekv plda az azonost. Bizonyos opertorok balrtkeket eredmnyeznek: ha E mutat tpus kifejezs, akkor *E olyan balrtk kifejezs, amely arra az objektumra hivatkozik, amire az E mutat. A balrtk elnevezs az E1 =E2 rtkad kifejezsbl szrmazik, amelyben az E1 bal oldali operandusnak balrtk kifejezsnek kell lennie. Az egyes opertorok albb kvetkez ismertetse sorn kzljk hogy az adott opertor balrtk operandusokat vr-e s hogy balrtket ad-e eredmnyl.

    6. Konverzik Operandusuktl fggen szmos opertor vlthatja ki valamelyik operandusa rtknek egyik tpusbl valamilyen msik tpusba trtn talaktst. Ebben a szakaszban az ilyen konverzik vrhat eredmnyt ismertetjk. A kznsges opertorok tbbsge ltal megkvetelt konverzikat a 6.6. pontban foglaltuk ssze; ezt szksg szerint az egyes opertorok trgyalsnl tovbbi informcikkal egsztettk ki.

    6.1. Karakterek s egszek Karaktert s rvid _egszt mindentt hasznlhatunk, ahol kznsges egsz hasznlhat. Az rtk minden esetben int-t alakul. Rvidebb egsz hosszabb egssz trtn konvertlsa mindig eljel-kiterjesztssel jr: az egszek eljeles mennyisgek. Az adott gptl fgg, hogy karakterek esetben is trtnik-e eljel-kiterjeszts, de annyi bizonyos, hogy a szabvnyos karakterkszlet valamennyi eleme nemnegatv. Azok kzl a szmtgpek kzl, amelyeket ez a kziknyv figyelembe vesz, csak a PDP- 11 vgez eljel-kiterjesztst. A PDP-11 -en a karakter tpus vltozk rtktartomnya -128 s 127 kztt van; az sszes ASCII karakter pozitv. Az oktlis escape-szekvencia segtsgvel megadott karakterllandkra eljel-kiterjeszts trtnik, s negatvknt is megjelenhetnek, pl. \077 rtke -1.

    Ha egy hosszabb egszt rvidebb egssz vagy char-r alaktunk, a levgs bal oldalon trtnik : a felesleges bitek egyszeren elmaradnak.

    Forrs: http://www.doksi.hu

  • 8

    6.2. Float s double A C-ben mindenfle lebegpontos mvelet duplapontossg; amikor egy kifejezsben float fordul el, az a trt rsz nullkkal val kitltse rvn double-l hosszabbodik. Ha double-t kell float-t alaktani, pl. rtkads sorn, a double elszr kerektdik s csak ezutn rvidl float hosszsgv.

    6.3. Lebegpontos s integrlis mennyisgek A lebegpontos rtkek integrlis tpusv alaktsa ltalban elgg gpfgg mvelet; klnskppen a negatv szmok csonktsnak irnya vltozik gprl gpre. Ha a rendelkezsre ll helyen az eredmny nem fr el, hatrozatlan lesz. Integrlis rtkek lebegpontoss alaktsa problmamentes. A pontossg nmileg cskken, ha a clhelyen nincs elegend bit.

    6.4. Mutatk s egszek Az int vagy long int mennyisgek a mutatkhoz hozzadhatk vagy azokbl levonhatk; ebben az esetben az elbbiek az sszead opertornl lertak szerint alakulnak t.

    Kt, ugyanolyan tpust megcmz mutat egymsbl kivonhat: ez esetben az eredmny egssz alakul t, amint azt a kivon opertornl trgyaljuk.

    6.5. Eljel nlkli egszek Ha eljel nlkli (unsigned) s kznsges egszeket kombinlunk, a kznsges egsz eljel nlkliv alakul t, s az eredmny is eljel nlkli. Az rtk az a legkisebb eljel nlkli egsz, amely kongruens az eljeles egsszel (modulo 2szmret). 2-es komplemens brzolsban a konverzi csupn elvi, a bitminta valjban nem vltozik.

    Ha az eljel nlkli egsz long-g alakul, az eredmny rtke szmszerleg ugyanaz, mint az eljel nlkli egsz. Igy a konverzi csupn a bal oldali kitlt nullk elhelyezsbl ll.

    6.6. Aritmetikai konverzik Szmos opertor hasonl konverzit vlt ki, s az eredmnyt ugyanabban a tpusban szolgltatja. Ezt az eljrst szoksos aritmetikai konverzinak nevezni.

    Elszr is minden char vagy short tpus operandus int-t s minden float operandus double-l alakul.

    Ezutn, ha valamelyik operandus double, akkor a msik is double-l alakul, s az eredmny szintn double lesz.

    Egybknt, ha valamelyik operandus long, a msik operandus s az eredmny tpusa is long lesz.

    Egybknt, ha valamelyik operandus unsigned, a msik is unsigned-d alakul, s ez lesz az eredmny tpusa is.

    Minden ms esetben mindkt operandusnak int-nek kell lennie s ez lesz az eredmny tpusa is.

    7. Kifejezsek A kifejezsekben elfordul opertorok precedencija ugyanaz, mint ebben a fejezetben az alfejezetek (pontok) sorrendje; a legmagasabb precedencia az els. gy pl. azokat a kifejezseket, amelyekre mint a + operandusaira hivatkozunk (7.4. pont) a 7. 1 . .. 7.3. pontokban definiljuk. Az egyes pontokon bell minden opertor azonos precedencij. Minden pontban megadjuk, hogy az ott trgyalt opertorokra bal-, ill. jobbirny asszociativits vonatkozik-e. A kifejezsekben alkalmazott opertorok precedencijt s asszociativitst a 18. pontban kzlt nyelvtan foglalja ssze.

    Egyb esetekben a kifejezsek kirtkelsnek sorrendje hatrozatlan. A fordtprogram a rszkifejezseket sajt megtlse szerint abban a sorrendben szmtja ki, amit leghatkonyabbnak vl, mg abban az esetben is, ha a rszkifejezseknek mellkhatsaik vannak. A mellkhatsok elfordulsnak sorrendje meghatrozott. Kommutatv s asszociatv opertorokat (*, +, &, |, n~) tartalmaz kifejezsek tetszs szerint rendezhetk mg zrjelek jelenltben is; ha adott sorrendben vgzend kirtkelst kvnunk elrni, explicit ideiglenes vltozt kell hasznlnunk.

    A kifejezsek kirtkelse sorn a tlcsorduls s az oszts ellenrzsnek kezelse gpfgg. A C nyelv minden ltez megvalstsa figyelmen kvl hagyja az egszek tlcsordulst; a 0-val val oszts kezelse, ill. a lebegpontos kivtelek gprl gpre vltoznak, s ltalban valamilyen knyvtri fggvnnyel mdosthatk.

    Forrs: http://www.doksi.hu

  • 9

    7.1. Elsdleges kifejezsek A . s -> szimblumokat, indexelst s fggvnyhvsokat tartalmaz elsdleges kifejezsek csoportostsa balrl jobbra trtnik.

    elsdleges_kifejezs:

    azonost lland karakterlnc (kifejezs) elsdleges_kifejezs [kifejezs] elsdleges_kifejezs [kifejezslistaopc] elsdleges_balrtk.azonost elsdleges_kifejezs->azonost Kifejezslista:

    kifejezs kifejezslista, kifejezs

    Az azonost elsdleges kifejezs, feltve, hogy az albbi ismertetett mdon helyesen deklarltk. Tpust a deklarcija hatrozza meg. Ha azonban az azonost tpusa valamilyen tmb, akkor az azonost kifejezs rtke a tmb els objektumt megcmz mutat, s a kifejezs tpusa a tmb alaptpusra hivatkoz mutat. A tmbazonost tovbb nem balrtk kifejezs. Hasonlkppen a fggvnyknt deklarlt azonost is a fggvny mutatjv alakul t, kivve, ha valamely fggvnyhvs fggvnynv-pozcijn fordul el.

    Az lland elsdleges kifejezs. Tpusa az alakjtl fggen lehet int, long vagy double. A karakterllandk tpusa int, a lebegpontos llandk double.

    A karakterlnc elsdleges kifejezs. Tpusa eredetileg char-ok tmbje, de az azonostkra vonatkoz fenti szably rtelmben az a char-mutatv mdosul, s az eredmny a karakterlnc els karaktert megcmz mutat. (Kivtelt kpeznek egyes kezdetirtk-belltk (l. a 8.6. pontot.))

    A zrjelezett kifejezs olyan elsdleges kifejezs, amelynek tpusa s rtke azonos a zrjel nlkli kifejezsvel. A zrjelek jelenlte nem befolysolja azt a tnyt, hogy a kifejezs balrtk-e vagy sem.

    Az elsdleges kifejezs s az azt kvet szgletes zrjelek kztti kifejezs szintn elsdleges kifejezst kpez [kifejezs]. Az elsdleges kifejezs ltalban valamilyen mutat tpus, az index kifejezs int, s az eredmny tpusa az a tpus, amelyre a mutat mutat. Az E1[E2] kifejezs definci szerint azonos a *((E1)+(E2))-vel. Ez a pont, valamint az azonostkkal, a +-szal, ill. *-gal foglalkoz 7.1., 7.2., ill. 7.4. pont az sszes tudnivalt tartalmazza, ami ennek a jellsmdnak a megrtshez szksges. Az indexelsrl a 14.3. pontban szlunk.

    A fggvnyhvs olyan elsdleges kifejezs, amelyet zrjelek kztt a fggvny aktulis argumentumait alkot kifejezsek esetleg res, vesszkkel elvlasztott listja kvet. Az elsdleges kifejezsnek fggvny, amely visszaadja . . .-t tpusnak kell lennie, s a fggvnyhvs eredmnye . . . tpus. Mint a kvetkezkben ltni fogjuk, minden korbban el nem fordult azonost, amelyet kzvetlenl nyit zrjel kvet, a szvegkrnyezet alapjn egszt visszaad fggvnyknt deklarldik, gy a legkznsgesebb esetben az egsz rtk fggvnyeket nem kell deklarlni.

    A float tpus argumentumok hvs eltt double-l alakulnak t; minden char s short int-t konvertldik, s a tmbnevek, mint mindig, mutatkk alakulnak. Automatikusan semmilyen ms konverzi nem trtnik; lnyeges tudnunk, hogy a fordt az aktulis argumentumok tpust nem hasonltja ssze a formlis argumentumokval. Ha konverzira van szksg, hasznljunk tpusmdost szerkezetet (l. a 7.2. s 8.7. pontot).

    A fggvnyhvs elksztsekppen msolat kszl minden aktulis paramterrl, gy a C nyelvben minden argumentumtads szigoran rtk szerint trtnik. A fggvny megvltoztathatja formlis paramtereinek rtkt, de ezek a vltoztatsok nem befolysolhatjk az aktulis paramterek rtkt. Lehetsg van viszont mutat tadsra, tudva azt, hogy a fggvny megvltoztathatja annak az objektumnak az rtkt, amelyre a mutat mutat. A tmbnv mutatkifejezs. Az argumentumok kirtkelsnek sorrendjt a nyelv nem definilja; ne feledjk, hogy a klnbz fordtk eltrek!

    Brmilyen fggvny rekurzv mdon hvhat.

    Forrs: http://www.doksi.hu

  • 10

    Egy elsdleges kifejezs, az azt kvet pont s az azutn kvetkez azonost egyttesen kifejezst alkot. Az els kifejezsnek olyan balrtknek kell lennie, amely struktrt vagy uniont nevez meg, az azonost pedig meg kell, hogy nevezze a struktra vagy union egy tagjt. Az eredmny a struktra vagy union megnevezett tagjra vonatkoz balrtk.

    Egy elsdleges kifejezs, az azt kvet nyl (amelyet egy - s egy > alkot) s az azutn kvetkez azonost egyttesen kifejezst alkot. Az els kifejezsnek struktrt vagy uniont megcmz mutatnak kell lennie, s az azonostnak a struktra vagy union egy tagjt kell megneveznie. Az eredmny olyan balrtk, amely a mutatkifejezs ltal megcmzett struktra vagy union megnevezett tagjra vonatkozik. gy az E1->MOS kifejezs azonos a (*E1).MOS kifejezssel. A struktrkkal s unionokkal a 8.5. pont foglalkozik. A hasznlatukra vonatkozan itt megadott szablyokat a fordt rugalmasan alkalmazza, hogy ki lehessen lpni a tpusmechanizmusbl (l. a 14.1. pontot).

    7.2. Egyoperandus opertorok Az egyoperandus opertorokkal alkotott kifejezsek csoportostsa jobbrl balra trtnik.

    egyoper_kifejezs:

    *kifejezs &balrtk

    kifejezs !kifejezs ~kifejezs ++balrtk

    balrtk balrtk++ balrtk (tpusnv) kifejezs sizeof kifejezs sizeof (tpusnv)

    Az egyoperandus * opertor indirekcit fejez ki: a kifejezs mutat kellhogy legyen, s az eredmny olyan balrtk, amely a kifejezs ltal megcmzett objektumra vonatkozik. Ha a kifejezs mutat tpus, akkor az eredmny tpusa a mutatval megcmzett objektum tpusa.

    Az egyoperandus & opertor hatsra a balrtk ltal hivatkozott objektumot megcmz mutat keletkezik. Ha a balrtk tpusa . . ., akkor az eredmny tpusa mutat . . .-ra Az egyoperandus - opertor az operandus negatv rtkt eredmnyezi. A szoksos aritmetikai konverzik mennek vgbe. Eljel nlkli (unsigned) mennyisg esetben a negatv rtket gy kell kiszmtani, hogy 2n-bl levonjuk az operandus rtkt, (n az int-beli bitek szma). Egyoperandus + opertor nincs. A ! logikai neglopertor hatsra az eredmny 1 lesz, ha az operandus nulla, 0 lesz, ha az operandus nemnulla. Az eredmny tpusa int. Brmilyen aritmetikai tpusra s mutatkra alkalmazhat.

    A ~ opertor hatsra az operandus 1-es komplemense jn ltre. Megtrtnnek a szoksos aritmetikai konverzik. Az operandus integrlis tpus kell, hogy legyen.

    A ++ opertor balrtk operandusa eltt alkalmazva inkrementlja az operandus ltal hivatkozott objektumot. Az rtk az operandus j rtke, amely azonban nem balrtk. A ++x kifejezs x+=1-gyel egyenrtk. A konverzikra vonatkozan l. az sszeadsra (7.4. pont) s rtkad opertorokra (7.14. pont) vonatkoz ismertetst.

    Aopertor, ha balrtk operandusa eltt ll, az elbbiekhez hasonlan dekrementlja az operandust. Ha a ++ opertort valamely balrtk utn alkalmazzuk, az eredmny a balrtk ltal hivatkozott objektum rtke lesz. Az eredmny feljegyzse utn az objektum ugyangy inkrementldik, mint az ellrl alkalmazott ++ opertor esetben. Az eredmny tpusa ugyanaz, mint a balrtk kifejezs.

    Ha aopertort valamely balrtk utn alkalmazzuk, az eredmny a balrtk ltal hivatkozott objektum rtke lesz. Az eredmny feljegyzse utn az objektum ugyangy dekrementldik, mint az eltagopertor esetben. Az eredmny tpusa ugyanaz, mint a balrtk kifejezs.

    Ha egy kifejezst valamelyik adattpus zrjelek kz rt neve elz meg, a kifejezs rtke a megadott tpusv alakul t. Ezt a konstrukcit tpusmdost szerkezetnek (cast) nevezzk. A tpusneveket a 8.7. pontban rjuk le.

    Forrs: http://www.doksi.hu

  • 11

    A sizeof opertor az operandusnak a byte-okban kifejezett mrett lltja el. (A byte-ot a nyelv csupn sizeof rtknek segtsgvel definilja. Azonban minden ltez megvalstsban a byte az a terlet, amely alkalmas egy char trolsra.) Tmbre alkalmazva az eredmny az sszes tmbbeli byte-ok szma lesz. A mretet a kifejezsben elfordul objektumok deklarcii hatrozzk meg. Ez a kifejezs szemantikailag egsz tpus lland, brhol hasznlhat, ahol llandra van szksg. Leginkbb olyan rutinokkal trtn kommunikci cljaira hasznlatos, mint pl. a trterlet-foglal fggvnyek s a be-s kivitel rendszerek.

    A sizeof opertor zrjelben ll tpusnvre is alkalmazhat. Ekkor egy, a megjellt tpus objektum mrett szolgltatja byte-okban.

    A sizeof(tpus) szerkezet sszefgg egysg, gy a sizeof(tpus)-2 kifejezs ugyanaz, mint (sizeof(tpus))-2.

    7.3. Multiplikatv opertorok A * , / s % multiplikatv opertorok balrl jobbra csoportostanak. Megtrtnnek a szoksos aritmetikai konverzik.

    multiplikatv_kifejezs:

    kifejezs * kifejezs kifejezs / kifejezs kifejezs % kifejezs

    A ktoperandus * opertor a szorzst jelli. A * opertor asszociatv, s az ugyanazon a szinten tbb szorzst tartalmaz kifejezseket a fordt trendezheti.

    A ktoperandus / opertor az osztst jelli. Pozitv egszek

    osztsakor a csonkts nulla fel trtnik, de ha brmelyik

    operandus negatv, akkor a csonkts formja gpfgg. Az ebben

    a kziknyvben figyelembe vett gpek esetben az osztand s a

    maradk eljele megegyezik. Mindig igaz, hogy

    (a / b) * b + a % b megegyezik a-val (ha b nemnulla).

    A ktoperandus % opertor az els kifejezsnek a msodikkal trtn osztsbl szrmaz maradkot lltja el. A mvelet szoksos aritmetikai konverzikkal jr. Az operandusok nem lehetnek float tpusak.

    7.4. Additv opertorok A + s - additv opertorok balrl jobbra csoportostanak. A szoksos aritmetikai konverzikat eredmnyezik. Mindkt opertor esetben vannak tovbbi tpuslehetsgek.

    additv_kifejezs:

    kifejezs + kifejezs kifejezs - kifejezs

    A + opertor alkalmazsnak eredmnye az operandusok sszege. Egy tmbbeli objektumot megcmz mutat s brmelyik integrlis tpus rtke sszeadhat. Az utbbi minden esetben relatv cmm alakul oly mdon, hogy megszorzdik annak az objektumnak a hosszsgval, amelyre a mutat mutat. Az eredmny az eredetivel megegyez tpus mutat, amely ugyanannak a tmbnek egy msik elemre mutat, megfelel eltolssal az eredeti objektumhoz kpest. Ha teht P tmbelemet megcmz mutat, akkor a P+1 kifejezs a tmb kvetkez elemt megcmz mutat lesz. Mutatkra semmilyen ms tpus kombinci sem megengedett!

    A + opertor asszociatv, s az ugyanazon a szinten tbb sszeadst tartalmaz kifejezseket a fordt trendezheti. A - opertor alkalmazsnak hatsra a kt operandus klnbsge keletkezik, a szoksos aritmetikai konverzik alkalmazsval. Ezenkvl mutatkbl le szabad vonni brmely integrlis tpus rtket, ekkor megtrtnnek ugyanazok a konverzik, mint az sszeadsnl.

    Ha kt ugyanolyan tpus objektumot megcmz mutatt vonunk ki egymsbl, az eredmny (az objektum hosszval trtn oszts rvn) int-t alakul, s a megcmzett objektumok kztt

    Forrs: http://www.doksi.hu

  • 12

    elhelyezked objektumok darabszmt adja meg. ltalnos esetben ez a konverzi vratlan eredmnyre vezet, kivve, ha a mutatk ugyanannak a tmbnek az elemeire mutatnak. Ennek az az oka, hogy mg az ugyanolyan tpus objektumok tvolsga sem felttlenl az objektumhosszsg tbbszrse.

    7.5. Lptet opertorok A > lptet (shift) opertorok balrl jobbra csoportostanak. Mindkett elvgzi az operandusokon a szoksos aritmetikai konverzikat; az operandusok mindegyike integrlis kell, hogy legyen. A mvelet sorn a jobb oldali operandus int-t alakul t; az eredmny tpusa megegyezik a bal oldali operandusval. Az eredmny hatrozatlan, ha a jobb oldali operandus negatv vagy nagyobb, mint az objektum bitekben mrt hosszsga, vagy pedig azzal megegyezik.

    lptet_kifejezs:

    kifejezs > kifejezs

    Az E1E2 rtke gy ll el, hogy E1 rtke E2 bittel balra lptetdik. A jobbra garantltan logikai jelleg (0-val trtn feltlts), ha az E1 unsigned; ms esetben aritmetikai lehet (s a PDP 11 -en az is lesz) ilyenkor a feltltds az eljelbittel trtnik.

    7.6. Relcis opertorok A relcis opertorok balrl jobbra csoportostanak, de ez a tny nem klnsebben hasznos: a < b < cjelentse nem az, amit gondolnnk.

    relcis_kifejezs:

    kifejezs < kifejezs kifejezs > kifejezs kifejezs = kifejezs

    A < (kisebb, mint), > (nagyobb, mint), = (nagyobb vagy egyenl) opertorok mindegyike 0-t eredmnyez, ha a megadott relci rtke hamis, s 1 -et, ha igaz. Az eredmny tpusa int. A mveletek a szoksos aritmetikai konverzikkal jrnak. Kt mutat sszehasonlthat: az eredmny a megcmzett objektumok cmnek a cmtartomnyban val egymshoz kpesti elhelyezkedstl fgg. A mutat sszehasonlts csak akkor gpfggetlen, ha a mutatk ugyanabban a tmbben elhelyezked objektumokra mutatnak.

    7.7. Egyenlsgi opertorok egyenlsg_kifejezs:

    kifejezs == kifejezs kifejezs != kifejezs

    A == (egyenl) s != (nem egyenl) opertorok pontosan

    ugyanolyanok, mint a relcis opertorok - csak a precedencijuk

    alacsonyabb. (Igy

    a < b == c < d rtke 1 , ha a < b s c < d igazsgrtke megegyezik.) Mutat s egsz sszehasonlthat, de az eredmny gpfgg, kivve ha az egsz a 0 lland. Az a mutat, amelyhez a 0-t rendeltnk hozz, garantltan nem mutat semmilyen objektumra, s 0-val egyenlknt fog megjelenni; a hagyomnyos hasznlatban az ilyen mutatt nullnak tekintjk.

    7.8. Bitenknti S opertor s_kifejezs:

    kifejezs & kifejezs

    Az & opertor asszociatv, s az &-et tartalmaz kifejezsek trendezhetk. A szoksos aritmetikai konverzik mennek vgbe; az eredmny az operandusok bitenknti S fggvnye. Az opertor csak integrlis operandusokra alkalmazhat!

    Forrs: http://www.doksi.hu

  • 13

    7.9. Bitenknti kizr VAGY opertor kizr_vagy_kifejezs:

    kifejezs ^ kifejezs

    A ^ opertor asszociatv, s a ^-t tartalmaz kifejezsek trendezhetk. A mvelet a szoksos aritmetikai konverzikkal jr; az eredmny az operandusok bitenknti kizr VAGY fggvnye. Az opertor csak integrlis operandusokra alkalmazhat!

    7.10. Bitenknti inkluzv VAGY opertor inkluzv vagy_kifejezs:

    kifejezs | kifejezs

    A | opertor asszociatv, s a |-ot tartalmaz kifejezsek trendezhetk. A mvelet a szoksos aritmetikai konverzikkal jr; az eredmny az operandusok bitenknti inkluzv VAGY fggvnye. Az opertor csak integrlis operandusokra alkalmazhat!

    7.11. Logikai S opertor logikai s_kifejezs:

    kifejezs && kifejezs

    Az && opertor balrl jobbra csoportost. 1-et ad vissza; ha egyik operandusa sem nulla, egybknt 0-t. Az &-tl eltren az && biztostja a balrl jobbra trtn kirtkelst; ezen fell a msodik operandus nem rtkeldik ki, ha az els 0. Az operandusoknak nem kell azonos tpusaknak lennik, de mindegyikk tpusa vagy valamelyik alaptpus, vagy pedig mutat kell, hogy legyen. Az eredmny mindig int.

    7.12. logikai VAGY opertor logikai vagy_kifejezs: kifejezs || kifejezs A || opertor balrl jobbra csoportost. 1_t ad vissza, ha valamelyik operandusa nemnulla, 0-t egybknt. A |-tl eltren a || biztostja a balrl jobbra trtn kirtkelst; ezen fell a msodik operandus nem rtkeldik ki, ha az els nemnulla. Az operandusoknak nem kell azonos tpusaknak lennik, de mindegyikk tpusa vagy valamelyik alaptpus, vagy pedig mutat kell, hogy legyen. Az eredmny mindig int.

    7.13. A feltteles opertor feltteles_kifejezs:

    kifejezs ? kifejezs : kifejezs

    A feltteles kifejezsek balrl jobbra csoportostanak. Az els kifejezs kirtkeldik, s ha az rtke nemnulla, az eredmny a msodik kifejezs rtke lesz, egybknt pedig a harmadik kifejezs. Lehetsg szerint megtrtnnek a szoksos aritmetikai konverzik, amelyek rvn a msodik s a harmadik kifejezs azonos tpusv vlik; egybknt, ha mindkett ugyanolyan tpus mutat, az eredmny tpusa ez a kzs tpus lesz; vagy pedig az egyiknek mutatnak, a msiknak a 0 llandnak kell lennie, s az eredmny tpusa a mutat tpusa lesz. A msodik s a harmadik kifejezs kzl csak az egyik rtkeldik ki.

    7.14. rtkad opertorok Tbb rtkad opertor van, amelyek mindegyike jobbrl balra csoportost. Bal oldali operandusknt mindegyikk egy-egy balrtket ignyel, az rtkad kifejezs tpusa a bal oldali operandus tpusval fog megegyezni. Az rtkad_ kifejezs rtke az az rtk lesz, amely az rtkads utn a bal oldali operandusban tallhat. Az sszetett rtkad opertor kt rsze klnll szintaktikai egysget kpez.

    rtkad_kifejezs:

    balrtk = kifejezs

    Forrs: http://www.doksi.hu

  • 14

    balrtk += kifejezs balrtk -= kifejezs balrtk *= kifejezs balrtk /= kifejezs balrtk %= kifejezs balrtk >>= kifejezs balrtk

  • 15

    8.1. Trolsiosztly-specifiktorok A trolsiosztly-specifiktorok az albbiak: t.o._specifiktor:

    auto static extern register typedef

    A typedef specifiktor nem foglal trhelyet, s csak a szintaktikai knyelem kedvrt nevezzk trolsiosztly-specifiktornak (l. a 8.8. pontot). A klnfle trolsi osztlyok jelentst a 4. pontban ismertettk. Az auto, static s register deklarcik definciknt is szolglnak, amennyiben megfelel nagysg trterlet lefoglalst is elidzik. Az extern esetben a megadott azonostk kls defincijnak (10. pont) is szerepelnie kell valahol azon a fggvnyen kvl, amelyben deklarltuk ket. A register deklarcit legclszerbb olyan auto deklarcinak tekinteni, amely mg azt is jelzi a fordtnak, hogy a deklarlt vltozkat srn fogjuk hasznlni. Csupn az els nhny ilyen deklarcinak lesz hatsa. Ezenkvl csupn nhny tpus troldik tnylegesen regiszterekben; a PDP- 11 -en ezek a tpusok az int, a char s a mutat. Mg egy megszorts vonatkozik a regiszter tpus vltozkra: nem alkalmazhat rjuk az & (cme valaminek) opertor. A regiszterdeklarcik megfelel hasznlatval kisebb mret, gyorsabb programokhoz juthatunk, a kdgenerls tovbbfejlesztsvel azonban lehet, hogy alkalmazsuk feleslegess vlik.

    Egy deklarciban legfeljebb egy t. o. -specifiktort lehet megadni. Ha a t.o._specifiktor hinyzik a deklarcibl, akkor azt a fordt fggvnyen bell auto-nak, fggvnyen kvl extern-nek tekinti. Kivtel: a fggvnyek sohasem automatikusak!

    8.2. Tpus-specifiktorok A tpus-specifiktorok az albbiak : tpus-specifiktor:

    char short int long unsigned float double strukt._vagy_union_specifiktor typedef_nv

    A long (hossz), short (rvid) s unsigned (eljel nlkli) szavakat jelzknek tekinthetjk; az albbi kombincik fogadhatk el:

    short int long int unsigned int long float

    Az utbbi ugyanazt jelenti, mint a double. Egybknt egy deklarcin bell legfeljebb egy tpus-specifiktor adhat meg. Ha a deklarcibl hinyzik a tpus-specifiktor, akkor a deklarlt vltozt a fordt int-nek tekinti.

    Struktrk s unionok specifiktoraival a 8.5. pont foglalkozik; a typedef nevekkel trtn deklarcikat a 8.8. pont trgyalja.

    8.3. Deklartorok A deklarciban megjelen deklartorlista deklartorok vesszkkel elvlasztott sorozata, amelyek mindegyike kezdeti rtkkel (k..) rendelkezhet.

    deklartorlista:

    k.._deklartor k.._deklartor , deklartorlista k.._deklartor:

    Forrs: http://www.doksi.hu

  • 16

    deklartor inicializlopc A kezdeti rtkekkel a 6.6. pont foglalkozik. A deklarcibeli specifiktorok megadjk azoknak az objektumoknak a tpust s trolsi osztlyt, amelyekre a deklartorok vonatkoznak. A deklartorok szintaxisa:

    deklartor:

    azonost (deklartor) *deklartor deklartor () deklartor [lland_kifejezsopc]

    A csoportosts ugyanolyan, mint a kifejezsekben.

    8.4. A deklartorokjelentse Minden deklartort arra vonatkoz lltsnak tekinthetnk, hogy ha valamely kifejezsben a deklartorral megegyez alak szerkezet jelenik meg, akkor az a megjellt tpus s trolsi osztly objektumot fogja eredmnyezni. Minden deklartor pontosan egy azonostt tartalmaz, ez az azonost az, amelyet deklarlunk.

    Ha deklartorknt bvtmny nlkli azonost szerepel, akkor annak tpusa az lesz, amit a deklarcit bevezet specifiktor megjell.

    A zrjelek kztti deklartor azonos a zrjel nlklivel, de az sszetett deklartorok ktsi sorrendje zrjelekkel megvltoztathat (l. a kvetkez pldkat).

    Most kpzeljk el a

    T D1 deklarcit, ahol T a tpus-specifiktor (mint az int stb.) s

    D1 a deklartor. Tegyk fel, hogy e deklarci hatsra az

    azonost tpusa . . .T lesz, ahol . . res, ha D1 csupn

    sima azonost (teht x tpusa int x-ben egyszeren int). Ha

    viszont D1 alakja

    *D akkor az ltala tartalmazott azonost tpusa . . .mutat T-re.

    Ha D1 alakja

    D () akkor az ltala tartalmazott azonost tpusa . . . fggvny, amely T-t ad vissza.

    Ha D1

    D [lland_kifejezs]

    vagy

    D [] alak, akkor az ltala tartalmazott azonost tpusa T . . . tmbje. Az els esetben az lland kifejezs olyan kifejezs, amelynek rtke fordtsi idben meghatrozhat s amelynek tpusa int Az lland kifejezsek pontos defincija a 15. pontban tallhat.) Ha tbb . . .tmbje specifikci egymssal szomszdos, akkor tbbdimenzis tmb keletkezik; a tmbhatrokat rgzt lland kifejezsek csupn a sorozat els tagjnl hinyozhatnak. Ez az elhagys akkor hasznos, ha kls tmbrl _ van sz, s a trfoglalst elidz definci mshol szerepel. Az els lland kifejezs akkor is elhagyhat, ha a deklartort kezdeti rtk kveti. Ilyenkor a fordt a mretet a megadott kezdeti rtkek szmbl szmtja ki.

    Forrs: http://www.doksi.hu

  • 17

    Tmbt az alaptpusok valamelyikbl, mutatkbl, struktrkbl, unionokbl vagy ms tmbkbl (tbbdimenzis tmbt generlva) alkothatunk.

    A fenti szintaxissal definilt lehetsgek kzl nem mindegyik megengedett. A megszortsok a kvetkezk : fggvnyek nem adhatnak vissza tmbket, struktrkat, unionokat vagy fggvnyeket, de visszaadhatnak ilyeneket megcmz mutatkat; fggvnyekbl nem kpezhet tmb, de ltezik fggvnyeket megcmz mutatkbl kpzett tmb. Hasonlkppen, a struktrk s unionok sem tartalmazhatnak fggvnyt, legfeljebb fggvnyt megcmz mutatt.

    Pldul

    int i, *ip, f (), *fip (), (*pfi) () deklarlja az i egszt, az ip egszt megcmz mutatt, az egszt visszaad f fggvnyt, az egszt megcmz mutatt visszaad fip fggvnyt s a pfi mutatt, amely egy egszt visszaad fggvnyre mutat. Klnsen hasznos ha a kt utolst hasonltjuk ssze. A *fip() ktsi sorrendje *(fip()), gy a deklarci azt rja el, ill. egy kifejezsben elfordul ilyen szerkezet azt vltja ki, hogy a fip fggvny meghvsa utn a (mutatjelleg) eredmnyen keresztli indirekcival egy egsz lljon el. A (*pfi)() deklartorban (vagy a szerkezetet felhasznl kifejezsekben) a plusz zrjelek szksgesek: azt jelzik, hogy a fggvnyt megcmz mutatn keresztli indirekci fggvnyt eredmnyez, amely meghvsa utn egszt ad vissza.

    Msik pldaknt

    float fa [17], *afp [17];

    egy float szmokbl ll tmbt s egy float szmokat megcmz

    mutatkbl ll tmbt deklarl. Vgezetl

    static int x3d [3)[5][7]; egszek statikus, hromdimenzis tmbjt deklarlja, amelynek mrete 3 * 5 * 7. Rszleteiben nzve x3d hromelem tmb; minden elem t tmbt tartalmaz; az utbbiak mindegyike 7 darab egszbl ll. Az x3d, x3d[i], x3d[i][j], x3d[i][j][k] alakok brmelyike elfordulhat valamely kifejezsben. Az els hrom tmb tpus, az utols tpusa int.

    8.5. Struktra- s union deklarcik A struktra nvvel elltott tagok sorozatt tartalmaz objektum. Minden tag tetszleges tpus lehet. Az union olyan objektum, amely adott idpillanatban tbb lehetsges tag brmelyikt tartalmazhatja. A struktra- s az unionspecifiktorok azonos alakak.

    strukt._vagy_union_specifiktor:

    strukt._vagy_union { strukt._dekl._lista}

    strukt._vagy_union azonost {strukt._dekl._lista}

    strukt._vagy_union azonost

    strukt._vagy_union:

    struct union

    A struktradeklartor-lista a struktra vagy union tagjaira vonatkoz deklarcik felsorolsa:

    strukt._dekl._lista:

    strukt._deklarci

    strukt._deklarci strukt._dekl._lista

    strukt._deklarci:

    tpus_specifiktor strukt._deklartor_lista strukt._deklartor_lista:

    strukt._deklartor

    strukt._deklartor , strukt._deklartor_lista

    Kznsges esetben a strukt. deklartor egyszeren a struktra vagy union valamely tagjnak deklartora. A struktra tagjai adott szm bitet is tartalmazhatnak. Az ilyen tag neve mez (field), hosszt a nvtl kettspont vlasztja el.

    Forrs: http://www.doksi.hu

  • 18

    strukt. _deklartor:

    deklartor deklartor : lland_kifejezs : lland_kifejezs

    A struktrn bell a deklarlt objektumok cmei a deklarcikban balrl jobbra haladva nvekednek. A struktra minden nem-mez tagja a tpusnak megfelel cmhatron kezddik, gy a struktrban nv nlkli lyukak helyezkedhetnek el. A mez jelleg tagok gpi egszekben helyezkednek el, szhatrokon nem nylnak t. Az a mez, amely nem fr el egy szban mg fennmaradt helyen, a kvetkez szba kerl. A mez nem lehet szlesebb, mint a sz. Mezk hozzrendelse PDP-11-en jobbrl balra, ms gpeken balrljobbra trtnik.

    A deklartor nlkli, csupn kettspontot s a szlessget tartalmaz struktradeklartor olyan nv nlkli mezt jell ki, amelyet kvlrl elrt elrendezseknek megfelel kitltsre hasznlhatunk. Specilis esetben a 0 szlessg nv nlkli mez a kvetkez mez szhatrra trtn illesztst rja el. A kvetkez mez felteheten tnyleg mez, nem pedig kznsges struktratag, mivel az utbbi esetben ez az illeszts automatikusan megtrtnne.

    A nyelv nem r el korltozst a mezknt deklarlt objektumok tpusra vonatkozlag, a megvalstsoktl azonban nem vrjuk el, csak az egsz tpus mezk tmogatst. St, mg az int mezket is eljel nlklinek tekinthetik. A PDP-11-en a mezknek nincs eljelk, s csak egsz rtkek lehetnek. Egyetlen megvalstsban sincsenek mezkbl kpzett tmbk, tovbb a mezkre az & cmopertor sem alkalmazhat, vagyis nincsenek mezket megcmz mutatk sem.

    Az uniont olyan struktrnak kpzelhetjk, amelynek tagjai a 0 relatv cmen kezddnek, s amelynek mrete elegenden nagy ahhoz, hogy brmelyik tagjt tartalmazhassa. Az union egyszerre legfeljebb egy tagjt tartalmazhatja.

    A msodik alak struktra- vagy unionspecifiktor, vagyis a struct azonost {strukt._dekl._lista} union azonost {strukt._dekl._lista}

    egyike, az azonostt a lista ltal meghatrozott struktra

    struktracmkjeknt (vagy unioncmkjeknt) deklarlja. Az ezt

    kvet deklarcikban azutn a specifiktor harmadik alakja, a

    struct azonost union azonost

    alakok egyike hasznlhat. A struktracmkk lehetv teszik nhivatkoz struktrk definilst; megengedik, hogy a deklarci hossz rszt csupn egyszer adjuk meg s tbb alkalommal hasznljuk. Tilos olyan struktrt vagy uniont deklarlni, amelyben sajt maga elfordul, de a struktra vagy union tartalmazhat sajt magt megcmz mutatt!

    A tagok s cmkk nevei megegyezhetnek a kznsges vltozk neveivel. A cmkk s a tagok nevnek azonban egymstl el kell trnik!

    Kt struktrnak lehet kzs kezdeti tagsorozata, azaz ugyanaz a tag kt klnbz struktrban is megjelenhet, ha mindkettben azonos a tpusa s ha az sszes megelz tag is mind a kettben azonos. (A fordt tulajdonkppen csak azt ellenrzi, hogy a kt klnbz struktrban elfordul nv tpusa s relatv cme megegyezik-e, de ha a megelz tagok klnbznek, akkor a szerkezet nem gpfggetlen.)

    A struktradeklarci egyszer pldja:

    struct tnode { char tword [20]; int count; struct tnode * left; struct tnode *right; }; amely 20 karakterbl ll tmbt, egy egszt s kt, hasonl

    struktrt megcmz mutatt tartalmaz. E deklarci megadsa

    Forrs: http://www.doksi.hu

  • 19

    utn a

    struct tnode s, *sp;

    deklarci szerint s a megadott jelleg struktra lesz, s sp az

    ilyen jelleg struktrt megcmz mutat. Ezeknek a

    deklarciknak az alapjn az

    sp->count kifejezs annak a struktrnak a count nev mezjre mutat, amelyre az sp utal;

    s.left

    az s struktra bal oldali rszfjnak mutatjra vonatkozik, mg

    s.right->tword [0] az s struktra jobb oldali rszfja tword nev tagjnak els karakterre utal.

    8.6. Inicializls A deklartor megadhatja a deklarlt azonost kezdeti rtkt. Az inicializlt = elzi meg, s kapcsos zrjelek kz zrt kifejezst vagy rtklistt tartalmaz.

    inicializl:

    = kifejezs = { inicializl_lista } = { inicializl_lista ,} inicializl_lista:

    kifejezs inicializl_lista , inicializl_lista ( inicializl_lista )

    A statikus vagy kls vltozk inicializliban kizrlag lland kifejezsek (l. a 15. pontot), vagy pedig olyan kifejezsek szerepelhetnek, amelyek valamelyik korbban deklarlt vltoz cmre reduklhatk (az albbitl egy lland kifejezssel val cmeltols is lehetsges). Az automatikus s regisztervltozk esetben tetszleges inicializls lehetsges llandk, korbban deklarlt vltozk s fggvnyek bevonsval. Inicializlatlan statikus s kls vltozk kezdeti rtke garantltan nulla; az inicializlatlan automatikus s regisztervltozkban pedig indulskor biztos hulladk van. Ha az inicializlt skalr mennyisgre (mutatra vagy aritmetikai tpus objektumra) alkalmazzuk, tartalma egyetlen, esetleg kapcsos zrjelek kztti kifejezs. Az objektum kezdeti rtkt a gp a kifejezs alapjn szmtja ki; a konverzik ugyanazok, mint rtkadsnl.

    Ha a deklarlt vltoz aggregtum (struktra vagy tmb jelleg sszetett mennyisg), akkor az inicializl az aggregtum tagjainak kapcsos zrjelek kztti, vesszkkel elvlasztott listjt tartalmazza. Az inicializlkat az indexek vagy tagok nvekv sorrendjben adjuk meg. Ha az aggregtum rszaggregtumokat tartalmaz, ugyanez a szably vonatkozik rekurzv mdon az aggregtum tagjaira. Ha a listban kevesebb inicializl van, mint ahny tagja van az aggregtumnak, akkor az aggregtum nullkkal tltdik ki. Unionok s automatikus aggregtumok inicializlsa nem megengedett!

    A kapcsos zrjeleket a kvetkez mdon hagyhatjuk el. Ha az inicializl bal oldali kapcsos zrjellel kezddik, akkor a rkvetkez, vesszkkel elvlasztott inicializllista az aggregtum tagjait inicializlja; Ha, ha itt tbb inicializl van, mint tag. Ha azonban az inicializl nem bal oldali kapcsos zrjellel kezddik, akkor a fordtprogram a listbl csupn az aggregtum tagjainak megfelel szm elemet vesz figyelembe; a listban fennmarad tagok annak az aggregtumnak a kvetkez elemt fogjk inicializlni, amelynek a szban forg aggregtum a rsze.

    Vgl megemltjk, hogy a char tmbk rviden, karakterlncokkal inicializlhatk. Ez esetben a lnc egymst kvet karakterei a tmb egyes elemeit inicializljk.

    Inicializlsi pldk:

    int x [] = {1,3,5}; az x-et olyan egydimenzis tmbknt deklarlja s inicializlja, amelynek hrom eleme van, mivel mretet nem adtunk meg s hrom inicializl van.

    float y [4][3] ={

    Forrs: http://www.doksi.hu

  • 20

    {1, 3, 5}, {2, 4, 6}, {3, 5, 7},

    }; teljes zrjelezett inicializls: 1 , 3 s 5 az y[0] tmb els

    sort, mgpedig az y[0][0], y[0][1] s y[0][2] elemeket

    inicializljk. A kvetkez kt sor hasonl mdon inicializlja

    y[1]-et s y[2]-t. Az inicializl tl hamar r vget, s ezrt

    y[3] 0-val inicializldik. Pontosan ugyanezt az eredmnyt rtk

    volna el

    float y [4][3] ={

    1, 3, 5, 2, 4, 6, 3, 5, 7 }; megadsval. y inicializlja bal oldali kapcsos zrjellel kezddik, de y[0]- nem, gy a gp a listbl hrom elemet hasznl fel. Hasonlkppen a kvetkez hrom y[1 ]-, az azt kvet hrom pedig y[2]- lesz. Ugyangy, ;

    float y [4][3] ={

    {1}, {2}, {3}, {4} }; a (ktdimenzis tmbnek tekintett) y els oszlopt inicializlja s a tbbi elemet 0 rtknek hagyja meg.

    Vgezetl char msg [] = Szintaktikai hiba a %s-edik sorban \n;

    olyan karaktertmbt mutat, amelynek elemeit karakterlnccal inicializltuk.

    8.7. Tpusnevek Kt sszefggsben (tpusmdost szerkezettel vgzett explicit tpuskonverzi esetn s a sizeof argumentumaknt) kell valamilyen adattpus nevt megadnunk. Ez tpusnv hasznlatval trtnik, ami lnyegben egy adott tpus objektum olyan deklarcija, amelybl hinyzik az objektum neve.

    tpus_nv:

    tpus_specifiktor absztrakt_deklartor absztrakt_deklartor:

    res ( absztrakt_deklartor ) *absztrakt_deklartor absztrakt_deklartor () absztrakt_deklartor [lland_kifejezsopc]

    A ktrtelmsg elkerlse rdekben az

    ( absztrakt_deklartor ) szerkezetben az absztraktdeklartor nem lehet res. E megszorts figyelembevtelvel egyrtelmen azonosthat az absztrakt-deklartorban az a hely, ahol az azonost megjelenne, ha a szerkezet egy deklarcin belli deklartor lenne. A megnevezett tpus ekkor ugyanaz lesz, mint a hipotetikus azonost tpusa. Pl.

    int int * int *[3] int (*) [3]

    Forrs: http://www.doksi.hu

  • 21

    int * () int (*) ()

    sorban megnevezi az egsz, egszt megcmz mutat, 3 darab egszmutatbl ll tmb, 3 egszbl ll tmbt megcmz mutat, egszt megcmz mutatt visszaad fggvny s az egszt visszaad fggvnyt megcmz mutattpusokat.

    8.8. Typedef Az olyan deklarcik, amelyeknek a trolsi osztlya typedef, nem trterletet definilnak, hanem olyan azonostkat, amelyeket a ksbbiekben gy hasznlhatunk, mintha az alapvet vagy a leszrmaztatott tpusokat megnevez kulcsszavak lennnek:

    typedef_nv:

    azonost

    A typedef-et tartalmaz deklarci rvnyessgi tartomnyn bell minden ott elfordul deklartor rszeknt megjelen azonost szintaktikusan egyenrtk lesz azzal a tpuskulcsszval, amely a 8.4. pontban lert mdon megnevezi az azonosthoz trstott tpust. Pl.

    typedef int MILES, *KLICKSP; typedef struct { double re, im;}complex;

    utn a

    MILES distance; extern KLICKSP metricp; complex z, *zp;

    szerkezetek mindegyike megengedett deklarci; a distance tpusa int, a metricp- int-et megcmz mutat, a z- pedig a megadott struktra. zp az ilyen struktrt megcmz mutat. A typedef nem teljesen j tpusokat vezet be, csupn ms mdon is megadhat tpusok szinonimit. Igy a fenti pldban distance pontosan ugyanolyan tpus, mint minden ms int objektum.

    9. Utastsok Az utastsok egymst kveten, sorban hajtdnak vgre, az ettl val eltrst kln jelezzk.

    9.1. A kifejezs utasts A legtbb utasts kifejezs jelleg; ezek alakja: kifejezs;

    A kifejezs jelleg utastsok legtbbszr rtkadsok vagy fggvnyhvsok.

    9.2. Az sszetett utasts vagy blokk Annak rdekben, hogy ott, ahol elvileg csak egy utasts helyezhet el, tbb utasts is hasznlhat legyen, rendelkezsre ll az sszetett utasts (ms szval blokk).

    sszetett_utasts:

    { deklarcilistaopc utastslistaopc} deklarcilista:

    deklarci deklarci deklarcilista utastslista:

    utasts utasts utastslista

    Ha a deklarcilistban elfordul brmelyik azonostt mr korbban deklarltuk, a kls deklarci a blokk vgrehajtsnak idtartamra rvnyt veszti, majd annak befejeztvel visszanyeri hatlyt.

    Az auto s register vltozk brmilyen inicializlsa minden alkalommal jra megtrtnik, amikor a vezrls a blokkba fellrl belp. Jelenleg lehetsges (de helytelen gyakorlat) a blokk belsejbe val ugrats; ez esetben az inicializlsok elmaradnak. A static vltozk kezdeti rtknek belltsa csupn egyszer, a program vgrehajtsnak kezdetn trtnik meg. A blokkon bell az extern deklarcik hatsra nincs trfoglals, gy ezek inicializlsa nem megengedett.

    Forrs: http://www.doksi.hu

  • 22

    9.3. A feltteles utasts if (kifejezs) utasts if (kifejezs) utasts else utasts

    A gp mindkt esetben kirtkeli a kifejezst, s ha rtke nemnulla, az els alutastst hajtja vgre. A msodik esetben, ha a kifejezs rtke 0, a msodik alutastst hajtja vgre. Az else-vel kapcsolatos szoksos ktrtelmsget a C gy oldja fel, hogy az else az utoljra tallt else nlkli if-hez ktdik.

    9.4. A while utasts A while utasts alakja: while (kifejezs) utasts

    Az alutasts vgrehajtsa mindaddig ismtldik, amg a kifejezs rtke nemnulla marad. A vizsglat mindig az utasts egyes vgrehajtsai eltt trtnik.

    9.5. A do utasts A do utasts alakja

    do utasts while (kifejezs);

    Az alutasts vgrehajtsa mindaddig ismtldik, amg kifejezs rtke nullv nem vlik. A vizsglat mindig az utasts egyes vgrehajtsai utn trtnik.

    9.6. A for utasts A for utasts alakja: for (1._kifejezsopc; 2._kifejezsopc; 3._kifejezsopc)

    utasts

    Ez az utasts egyenrtk az

    1._kifejezs; while (2._kifejezs) { utasts 3._kifejezs;

    } alakkal. Eszerint az els kifejezs a ciklust inicializlja; a msodik azt a vizsglatot hatrozza meg, amely minden itercit megelz, s a vezrls kilp a ciklusbl, ha a kifejezs nullv vlik; a harmadik kifejezs gyakran az egyes itercik utn vgrehajtand inkrementlst hatrozza meg.

    A kifejezsek brmelyike, vagy akr mindegyik elhagyhat. Ha a 2. kifejezs hinyzik, akkor a megfelel while utastsbl while( 1 ) lesz; a tbbi hinyz kifejezs egyszeren elmarad az elbbi kifejtett formbl.

    9.7. A switch utasts A switch utasts hatsra a megadott kifejezs rtktl fggen a vezrls tbb utasts valamelyikre addik t.

    Alakja:

    switch (kifejezs) utasts

    A kifejezsben megtrtnnek a szoksos aritmetikai konverzik, de az eredmnynek int-nek kell lennie. Az utasts ltalban sszetett. A switch utastson bell elfordul brmelyik utasts megcmkzhet egy vagy tbb case eltaggal az albbi mdon :

    Forrs: http://www.doksi.hu

  • 23

    case lland_kifejezs: ahol az lland kifejezs int kell, hogy legyen. Ugyanazon a switch-en bell kt case llandnak nem lehet egyforma rtke. Az lland kifejezsek pontos defincijt a 15. pont tartalmazza.

    Legfeljebb egy darab default: alak utasts-eltag is elfordulhat a switch utastsban. A switch utasts vgrehajtsa sorn a gp kirtkeli a benne elfordul kifejezst s sszehasonltja minden egyes case llandval. Ha a case llandk valamelyike megegyezik a kifejezs rtkvel, a vezrls az illeszked case eltagot kvet utastsra addik t. Ha egyik lland sem egyezik meg a kifejezs rtkvel, s szerepel a default eltag, akkor a program vgrehajtsa az ezt kvet utastson folytatdik. Ha egyik case sem illeszkedik s nincs default, akkor a gp a switch-ben elfordul utastsok kzl egyiket sem hajtja vgre. A case s default eltagok egymagukban nem vltoztatjk meg a vezrls menett, amely zavartalanul vgighalad ezeken az eltagokon. A switchbl val kilpsre vonatkozlag l. a break utastst a 9.8. pontban.

    A switch trgyt kpez utasts legtbbszr sszetett. Deklarcik szerepelhetnek ennek az utastsnak a fejben, de az automatikus s regisztervltozk inicializlsai hatstalanok.

    9.8. A break utasts A

    break; utasts hatsra befejezdik a break-et krlvev legbels while, do, for vagy switch utasts vgrehajtsa; a vezrls a befejezett utastst kvet utastsra addik t.

    9.9. A continue utasts A

    continue;

    utasts hatsra a vezrls a continue-t krlvev legbels

    while, do vagy for utasts ciklusfolytat rszre addik t,

    vagyis a ciklus vgre. Pontosabban, a

    while (...) { do { for (...) {

    ... ... ... contin: ; contin: ; contin: ; } } while (...); } utastsok mindegyikben a continue utasts egyenrtk a goto contin-nel. A contin: utn nulla utasts szerepel, (l. a 9.13. pontot).

    9.10. A return utasts A fggvny a hvjhoz a return utasts segtsgvel tr vissza, amelynek lehetsges alakja:

    return ; return kifejezs;

    Az els esetben a visszaadott rtk hatrozatlan. A msodik esetben a kifejezs rtke kerl vissza a fggvny hvjhoz. Szksg esetn az rtkadshoz hasonlan a kifejezs olyan tpusv alakul t, mint amilyen tpus fggvnyben elfordul. A fggvny vgnek tlpse azonos a visszatrsi rtk nlkli return-nel.

    9.11. A goto utasts A vezrls felttel nlkl a

    goto azonost; utasts segtsgvel adhat t. Az azonost az ppen vgrehajtott fggvnyen bell elhelyezett cmke (l. a 9.12. pontot) kell, hogy legyen.

    Forrs: http://www.doksi.hu

  • 24

    9.12. A cmkzett utasts Brmelyik utastst megelzhetik az

    azonost: alak eltagok, amelyek az azonostt cmkeknt deklarljk. A cmke egyedl a goto clpontjaknt szolgl. A cmke rvnyessgi tartomnya az a fggvny, amelyben elfordul, kivve azokat az alblokkokat, amelyekben ugyanezt az azonostt jradeklarltk (l. a 11. pontot).

    9.13. A nulla utasts A nulla utasts alakja: ; A nulla utasts hordozhat pl. cmkt kzvetlenl valamely sszetett utasts }-e eltt, vagy pedig a while-hoz hasonl valamelyik ciklusutasts szmra res ciklustrzset kpezhet.

    10. Kls defincik A C program kls (external) defincik sorozatt tartalmazza. A kls definci a vltozt extern (ez az alaprtelmezs) vagy static trolsi osztlynak s megadott tpusnak deklarlja. A tpus-specifiktor (l. a 8.2. pontot) lehet res, ebben az esetben a tpust int-nek tekintjk. A kls defincik rvnyessgi tartomnya annak az llomnynak a vgig tart, amelyben deklarltk ket; hasonlkppen a deklarcik is az llomny vgig rvnyesek. A kls defincik szintaxisa ugyanaz, mint az sszes deklarci, azzal a klnbsggel, hogy a fggvnyeket csak ezen a szinten lehet definilni.

    10.1. Kls fggvnydefincik A fggvnydefincik alakja: fggvnydefinci:

    dekl._specifiktorokopc fggvny deklartor fggvnytrzs A deklarcispecifiktorok kzl trolsiosztly-specifiktorknt csupn az extern s a static megengedett; a kett kztti klnbsgre nzve l. a 11.2. pontot. A fggvnydeklartor hasonl a fggvny, amely . . .-t ad vissza jelleg deklartorhoz, azzal a klnbsggel, hogy megadja a definilt fggvny formlis paramtereinek listjt.

    fggvnydeklartor:

    deklartor (paramterlistaopc) paramterlista:

    azonost azonost , paramterlista

    A fggvnytrzs alakja:

    fggvnytrzs:

    deklarcilista sszetett_utasts A paramterlistabeli azonostk - s csakis ezek deklarlhatk a deklarcilistban. Az olyan azonostt, amelynek tpust nem adtuk meg, a fordts int-nek tekinti. Az egyetlen megadhat trolsi osztly a register; ha ez szerepel, akkor a neki megfelel aktulis paramter, amennyiben lehetsges, a fggvny vgrehajtsnak kezdetn valamelyik regiszterbe kerl.

    Egyszer plda a teljes fggvnydefincira:

    int max (a, b, c) int a, b, c;

    { int m; m = (a > b) ? a : b; return ((m > c) ? m : c);

    } Itt az int a tpus-specifiktor; max(a, b, c) a fggvnydeklartor; int a, b, c; a formlis paramterek deklarciinak listja; { . . } az utasts programkdjt megad blokk.

    Forrs: http://www.doksi.hu

  • 25

    A C az sszes float tpus aktulis paramtert double-l alaktja t, gy a float-nak deklarlt formlis paramterek deklarcii is double-l mdosulnak. Tovbb, mivel a tmbre trtn hivatkozs brmilyen sszefggsben klnsen aktulis paramterknt) olyan mutatt jelent, amely a tmb els elemre mutat, a . . . tmbje alakban deklarlt formlis paramterek deklarcii mutat . . .-ra alakra mdosulnak. Vgezetl, mivel a struktrk, unionok s fggvnyek nem adhatk t fggvnynek, rtelmetlen dolog formlis paramtereket struktrnak, unionnak vagy fggvnynek deklarlni (az ilyen objektumokat megcmz mutatk termszetesen megengedettek).

    10.2. Kls adatdefincik A kls adatdefincik alakja: adatdefinci:

    deklarci

    Az ilyen adatok trolsi osztlya lehet extern (ez az alaprtelmezs) vagy static, de nem lehet auto, sem pedig register.

    11. Az rvnyessgi tartomny szablyai Nem szksges az egsz C programot egyszerre fordtani: a program forrsszvege tbb llomnyban trolhat, s knyvtrakbl elre lefordtott rutinokat lehet betlteni. A program fggvnyei kztti kommunikci akr explicit hvsokkal, akr kls adatokon keresztl megvalsthat. Ennek kvetkeztben ktfle rvnyessgi tartomnyrl kell beszlnnk: elszr is arrl, amit az azonost lexiklis rvnyessgi tartomnynak neveznk, s ami lnyegben a programnak az a rsze, amelyben a definilatlan azonost (undefined identifier) hibazenet elfordulsa nlkl hasznlhatjuk, msodszor pedig a kls azonostkhoz tartoz rvnyessgi tartomnyrl, amelyre az a szably jellemz, hogy az ugyanarra a kls azonostra vonatkoz hivatkozsok ugyanarra az objektumokra val hivatkozsokat jelentenek.

    11.1. Lexiklis rvnyessgi tartomny A kls defincikban deklarlt azonostk lexiklis rvnyessgi tartomnya a definciktl az ket tartalmaz forrsllomny vgig tart. A formlis paramterknt elfordul azonostk rvnyessgi tartomnya az a fggvny, amelyhez tartoznak. A blokkok fejben deklarlt azonostk rvnyessgi tartomnya a blokk vgig terjed. A cmkk rvnyessgi tartomnya az egsz fggvny,amelyben elfordulnak. Mivel az ugyanarra a kls azonostra utal sszes hivatkozs ugyanarra az objektumra vonatkozik (l. a 11.2. pontot), a fordtprogram ellenrzi, hogy ugyanannak a kls azonostnak az sszes deklarcija kompatibilis-e; valjban ezek rvnyessgi tartomnya kiterjed az egsz llomnyra, amelyben elfordulnak.

    Minden esetben fennll azonban, hogy ha egy azonost explicit mdon egy blokk - akr fggvnyt alkot blokk - fejben deklarlunk, akkor annak vgig az illet azonost sszes, a blokkon kvl elfordul deklarcija felfggesztdik. Emlkezznk arra is (l. a 8.5. pontot), hogy egyrszt a kznsges vltozkhoz, msrszt a struktra-, ill. uniontagokhoz s - cmkkhez kapcsold vltozk kt kln osztlyt alkotnak, amelyek kztt nincs tkzs. A tagokra s cmkkre ugyanazok az rvnyessgi tartomny szablyok vonatkoznak, mint a tbbi azonostkra. A typedef nevek ugyanabba az osztlyba tartoznak, mint a kznsges azonostk, bels blokkokban jradeklarlhatk, de a bels deklarciban a tipust explicit mdon meg kell adni:

    typedef float distance;

    . . . {

    auto int distance;

    . . . Az int-nek szerepelnie kell a msodik deklarciban, klnben a fordt deklartor nlkli, distance tpus deklarcinak tekinten.

    11.2. A kls azonostk rvnyessgi tartomnya Ha egy fggvny extern-knt deklarlt azonostra hivatkozik, akkor a teljes programot alkot llomnyok, ill. knyvtrak kzl valamelyikben szerepelnie kell az azonost kls defincijnak. Egy adott programban elfordul minden olyan fggvny, amely ugyanarra a kls azonostra hivatkozik, egyben ugyanarra az objektumra is hivatkozik, ezrt gyelnnk kell arra, hogy a

    Forrs: http://www.doksi.hu

  • 26

    definciban megadott tpus s mret kompatibilis legyen minden egyes, az adatokra hivatkoz fggvnyben megadott tpussal s mrettel. Az extern kulcssz a kls definciban azt jelzi, hogy a deklarlt azonostk szmra szksges trhelyet valamely msik llomnyban foglaljuk le. gy tbb llomnybl ll programban extern specifiktor nlkli kls adatdefinci egy s csakis egy llomnyban szerepelhet. Az sszes tbbi llomnyban, ahol kls defincival kvnjuk valamelyik vltozt megadni, a definciban szerepelnie kell az extern-nek. Az azonost csak abban a deklarciban inicializlhat, ahol a trhely lefoglalsa trtnt.

    A legfels szinten kls defincikban static-knt deklarlt azonostk ms llomnyokban nem lthatk. Fggvnyek is deklarlhatk static-knt.

    12. A fordtnak szl vezrlsorok A C fordt rsze egy elfeldolgoz program, amely makrohelyettestsre, feltteles fordtsra s megadott nev llomnyok beiktatsra kpes. Az elfeldolgoz a # karakterrel kezdd sorokat rtelmezi. E sorok szintaxisa fggetlen a nyelv tbbi rsztl, brhol elfordulhatnak, s (rvnyessgi tartomnytl fggetlenl) hatsuk az adott forrsprogram-llomny vgig tart.

    12.1. Szintaktikai egysgek helyettestse A

    #define azonost szint._egysgek_karakterlnca alak fordt vezrl sor (vigyzat: nincs zr pontosvessz) hatsra az elfeldolgoz az azonost minden tovbbi elfordulst a szintaktikai egysgek megadott karakterlncval helyettesti.

    A #define azonost(azonost, . . .,azonost)

    szint._egysgek_karakterlnca alak sor, ahol az els azonost s a ( kztt nincs szkz, argumentumokkal elltott makrodefinci. Az els azonostnak azon tovbbi elfordulsait, ahol az azonostt ( , szintaktikai egysgek vesszkkel elvlasztott sorozata s egy )

    kveti, a definciban megadott szintaktikai egysg karakterlnccal helyettesti. A definci formlis paramterlistjban emltett azonost sszes elfordulsa helyre a hvs hatsra a megfelel szintaktikai egysg karakterlnc kerl. A hvs aktulis argumentumai vesszkkel elvlasztott szintaktikai egysg karakterlncok, azonban az idzjelek kztti vagy zrjelekkel vdett vesszk nem argumentumelvlasztk. A formlis s aktulis paramterek darabszma egyenl kell, hogy legyen. Karakterlncon vagy karakterllandn belli szvegre nem vonatkozhat a helyettests.

    A helyettest karakterlncot (mindkt vltozatban) jra tvizsglja az elfeldolgoz, hogy megtallja az esetleges tovbbi definilt azonostkat. A hossz defincik mindkt alakban j sorban folytathatk oly mdon, hogy a folytatand sor vgre \-t runk.

    A #define hasznlat_ leginkbb a hangslyozott funkcij llandk definilsra elnys, pl.:

    #define TABSIZE 100 int table[TABSIZE];

    Az

    #undef azonost alak vezrlsor hatsra megsznik az azonost elfeldolgoz-defincija.

    12.2. llomnyok beiktatsa Az

    #include llomnynv

    alak vezrlsort az elfeldolgoz program az llomnynv nev

    llomny teljes tartalmval helyettesti. A megnevezett llomny

    keresse az eredeti forrsllomny katalgusban kezddik, majd

    Forrs: http://www.doksi.hu

  • 27

    sorban, szabvnyos helyeken folytatdik. Megadhatjuk az

    #include alak vezrlsort is, amikor a keress csak a szabvnyos helyeken trtnik, s nem terjed ki a forrsllomny katalgusra. Az #include-ok egymsba skatulyzhatk.

    12.3. Feltteles fordts Az

    #if lland_kifejezs

    alak fordtsvezrl sor ellenrzi, hogy az lland kifejezs

    (l. a 15. pontban) rtke nemnulla-e. Az

    #ifdef azonost

    alak vezrlsor megvizsglja, hogy az azonost pillanatnyilag

    definilva van-e az elfeldolgozban, azaz szerepelt-e mr

    valamelyik #define vezrlsorban. Az

    #ifndef azonost alak vezrlsor azt ellenrzi, hogy az azonost pillanatnyilag definilatlan-e az elfeldolgozban.

    Mindhrom alakot tetszleges szm, esetleg az

    #else

    vezrlsort is tartalmaz sor, majd az

    #endif vezrlsor kveti. Ha a vizsglt felttel igaz, akkor az #else s az #endif kztti sorok hatstalanok. Ha a vizsglt felttel hamis, akkor az ellenrzs s az #else vagy annak hinyban a #endif kztti sorok lesznek hatstalanok.

    E szerkezetek egymsba skatulyzhatk.

    12.4. Sorvezrls Egyb, C programokat ltrehoz elfeldolgozk szempontjbl

    hasznos a

    #line lland_azonost alak sor. Hatsra - diagnosztikai clokbl a fordt azt hiszi, hogy a kvetkez forrssor sorszma az lland ltal megadott rtk, s a pillanatnyi bemeneti llomny az, amelyet az azonost megnevez. Azonost hinyban a megnevezett llomnynv nem vltozik.

    13. Implicit deklarcik A deklarciban nem mindig kell a trolsi osztlyt s az azonostk tipust is megadnunk. A trolsi osztlyt kls defincikban s formlis paramterek ill. a struktratagok deklarciiban a szvegkrnyezet hatrozza meg. Fggvnyen belli deklarciban, ha a trolsi osztlyt megadtuk, de a tpust nem, az azonost felttelezs szerint int; ha tpus szerepel, de trolsi osztly nem, akkor az azonostt auto-nak tekinti a fordt. Az utbbi szably all kivtelek a fggvnyek, mivel az auto fggvnyeknek nincs rtelmk (a C nem kpes kdot generlni a verembe); ha valamely azonost tpusa fggvny, amely ...-t ad vissza, akkor az implicite extern-nek deklarldik.

    Kifejezsekben az olyan, mg nem deklarlt azonostt, amelyet ( kvet, a szvegkrnyezet alapjn a fordt int-et visszaad fggvnynek tekinti.

    14. Mg egyszer a tpusokrl Ez a szakasz azokat a mveleteket foglalja ssze, amelyeket csak bizonyos tpus objektumokon lehet elvgezni.

    14.1. Struktrk s unionok Struktrkkal s unionokkal kt dolgot tehetnk: megnevezhetjk valamelyik tagjukat (a . opertorral), vagy elllthatjuk a cmket (az egyoperandus &-tel). Az egyb mveletek, mint a struktrk vagy unionok valamihez trtn

    Forrs: http://www.doksi.hu

  • 28

    hozzrendelse, paramterknt val tadsa, vagy nekik val rtkads hibazenetet von maga utn. Remljk, hogy a jvben a C, ha egyebekkel nem is, de ezekkel a mveletekkel kiegszl. A 7.1. pontban mondottak szerint a ( . vagy -> segtsgvel trtn) direkt vagy indirekt struktrahivatkozsban a jobb oldalon ll nvnek a bal oldali kifejezs ltal megnevezett vagy megcmzett struktra tagjnak kell lennie. A rugalmas tpuskezels rdekben ezt a megktst a fordt kveteli meg szigoran. Valjban a . eltt brmilyen balrtk megengedett, s a fordt felttelezi, hogy ez a balrtk olyan alak struktra, mint amilyen a jobb oldali nv tagja. A -> eltti kifejezsnek ugyancsak mutatnak vagy egsznek kell lennie. Ha a kife_ezs mutat, akkor felttelezs szerint arra a struktrra mutat, amelyiknek a jobb oldalon ll nv tagja. Ha a kifejezs egsz tpus, akkor a fordt a megfelel struktra (gpi trolsi egysgekben kifejezett) abszolt cmnek tekinti. Az ilyen konstrukcik nem gpfggek.

    14.2. Fggvnyek Fggvnnyel csupn kt mveletet vgezhetnk: meghvhatjuk vagy elllthatjuk a cmt. Ha a fggvny neve kifejezsen bell nem valamely hvs fggvnynv-pozcijn jelenik meg, akkor a fggvnyt megcmz mutat jn ltre. Ha teht egy fggvnyt egy msiknak akarunk tadni, azt mondhatjuk, hogy:

    int f ();

    . . . g (f);

    Ekkor a g defincija

    g (funcp) int (*funcp) ();

    { . . .

    (*funcp) ();

    . . . } lehet. Jegyezzk meg, hogy f-et a hv rutinban explicit mdon deklarlni kell, mivel g (f)-beli elfordulst nem kvette (.

    14.3. Tmbk, mutatk s indexels Minden alkalommal, amikor tmb tpus azonost jelenik meg egy kifejezsben, az azonost a tmb els elemt megcmz mutatv alakul t. E konverzi miatt a tmbk nem balrtkek.

    Definci szerint a [ ] indexopertor rtelmezse olyan, hogy

    E1 [E2] azonos

    *((E1)+(E2))

    vel. A +-ra vonatkoz konverzis szablyok kvetkeztben, ha E1 tmb s E2 egsz, akkor

    E1 [E2] az E1 tmb E2-dik elemre hivatkozik. Emiatt - _aszimmetrikus megjelense ellenre - az indexels kommutatv mvelet.

    A tbbdimenzis tmbkre kvetkezetes szably vonatkozik. Ha E n-dimenzis, i * j * . . . * k-rang tmb , akkor kifejezsekben (n-1 )-dimenzis, j*...*k-rang tmbt megcmz mutatv alakul t. Ha a * opertor akr explicit, akr indexels kvetkeztben implicit mdon erre a mutatra alkalmazzuk, az eredmny a megcmzett (n-1 )-dimenzis tmb, amely maga is azonnal mutatv alakul t. Tekintsk pl. az int x [3][5]; deklarcit. Itt x 3*5-s egsz tmb. Ha x kifejezsben jelenik meg, akkor x a hrom darab 5-tag egsz tmb kzl az elst megcmz mutatv alakul t. Az x[i) kifejezsben, amely *(x+i)-vel egyenrtk, x elszr az ismertetett mdon mutatv, majd i az x tpusval azonos tpusv alakul,

    Forrs: http://www.doksi.hu

  • 29

    ami magban foglalja azt, hogy i megszorzdik annak az objektumnak a hosszval, amelyre a mutat mutat: ez jelen esetben 5 egsz objektum. Az eredmnyek sszeaddnak, s indirekci alkalmazsval (5 egszbl ll) tmb keletkezik, amely viszont ezen egszek kzl az elst megcmz mutatv alakul t. Ha mg tovbbi index is van, ismt ugyanezt a megfontolst kell alkalmazni; esetnkben az eredmny egsz.

    A fentiekbl kvetkezik, hogy a C-ben a tmbk sorfolytonosan troldnak (az utols index vltozik a leggyorsabban), tovbb, hogy a deklarciban elfordul els index segtsgvel hatrozhat meg a tmb ltal elfoglalt trterlet nagysga, egyb szerepe azonban az indexszmtsokban nincs.

    14.4. Explicit mutatkonverzik A mutatkra bizonyos konverzik megengedettek ugyan, de

    gpfgg vonatkozsaik vannak. Valamennyi ilyen konverzit

    explicit tpuskonverzis opertorral rhatjuk el (l. a 7.2. s

    8.7. pontot). Mutatk brmely olyan integrlis tpuss talakthatk, amelyben elfrnek. Az, hogy ez a tpus int vagy long-e, gpfgg. A lekpzs maga is gpfgg, de azok szmra, akik ismerik a gp cmzsi struktrjt, nem okozhat meglepetst. A ksbbiekben nhny gpre vonatkozan a rszleteket is ismertetjk.

    Az integrlis tpus objektumok explicit mdon mutatkk alakthatk t. A lekpzs hatsra a mutatkbl ltrejtt egszek ugyanazokk a mutatkk alakulnak vissza, egybknt a folyamat gpfgg.

    Adott tpust megcmz mutat ms tpust megcmz mutatv alakthat. Az eredmnyl kapott mutat cmzsi zavarokat okozhat, ha a szban forg mutat ltal megcmzett objektum illeszkedse a trban nem megfelel. Bizonyos azonban, hogy adott mret objektumot megcmz mutat vltozatlan marad, ha elszr kisebb mret objektumot, majd ismt az eredeti mret objektumot megcmz mutatv alaktjuk.

    A trterlet-foglal rutin pl. elfogadhatja valamely kiutaland objektum (byte-okban megadott) mrett s char mutatt adhat vissza:

    extern char *alloc (); double *dp; dp = (double *) alloc (sizeof (double));

    *dp = 22.0 / 7.0;

    Az alloc-nak (gpfgg mdon) biztostani kell, hogy a visszaadott rtket t lehessen alaktani double mutatv; ebben az esetben a fggvny hasznlata gpfggetlen.

    A PDP- 11 mutatbrzolsa 16 bites egsznek felel meg, egysge a byte. A char-okkal szemben nincsenek illeszkedsi kvetelmnyek; minden msnak pros cmnek kell lennie. A Honeywell 6000 gpen a mutat 36 bites egsznek felel meg: a szrsz a bal oldali 18 biten van, s az a kt bit, amely a szn bell a karaktert vlasztja ki, ettl kzvetlenl jobbra tallhat. Igy a karaktermutatkat a 216 byte-os egysgekben mrjk, minden ms 218 gpi sz egysgekben mrhet. A double mennyisgeknek s az azokat tartalmaz aggregtumoknak pros szcmen kell elhelyezkednik (0 mod 219).

    Az IBM 370 s az Interdata 8/32-es gpek hasonlak. A cmeket mindkettn byte-okban mrjk; az elemi objektumoknak a hosszuknak megfelel hatrra kell illeszkednik, gy a short-ot megcmz mutatknak (0 mod 2)-nek, az int-re s float-ra mutatknak (0 mod 4)-nek s a double-ra mutatknak (0 mod 8)-nak kell lennik. Aggregtum illesztse az alkotelemeire vonatkoz illeszkedsi felttelek kzl a legszigorbb szerint trtnik.

    15. lland kifejezsek A C nyelvben tbb helyen kell alkalmaznunk olyan

    kifejezseket, amelyeket kirtkelve lland eredmnyt kapunk:

    case utn, tmbhatrknt, kezdeti rtkekknt. Az els kt

    esetben a kifejezsben csupn egsz llandk, karakterllandk

    Forrs: http://www.doksi.hu

  • 30

    s sizeof kifejezsek szerepelhetnek, amelyeket a

    + - * / % & | ^ > == != < > = kt-, ill a

    - ~ egyoperandus opertorok valamelyike vagy a hromoperandus

    ? : opertor kthet ssze egymssal. A zrjelek csoportostsra hasznlhatk, fggvnyhvsra azonban nem.

    Kevesebb megkts vonatkozik a kezdeti rtkekre; az elbb trgyalt lland kifejezseken kvl kls s statikus objektumokra, valamint lland kifejezssel indexelt kls s statikus tmbkre is alkalmazhat az egyoperandus & opertor. Implicit mdon az egyoperandus &-et indexeletlen tmbk s fggvnyek megjelensekor ugyancsak alkalmazhatjuk. Az alapszably az, hogy a kezdeti rtkek kirtkelsvel vagy llandt, vagy pedig valamely mr korbban deklarlt kls vagy statikus objektum (esetleg llandval nvelt vagy cskkentett) cmt kell megkapnunk.

    16. Gpfggetlensg A C nyelv bizonyos rszei lnyegknl fogva gpfggk. Az albbiakban nem trhettnk ki minden problmra, csak a legfontosabbakat akartuk kiemelni.

    Az olyan tisztn hardverkrdsek, mint a szavak mrete, a lebegpontos aritmetika tulajdonsgai s az egszek osztsa a gyakorlatban nem okoztak klnsebb gondot. A hardver egyb jellegzetessgei az eltr megvalstsokban mutatkoznak meg. Ezek nmelyike, klnsen az eljel-kiterjeszts (negatv karakter negatv egssz trtn talaktsa), valamint a byte-ok szavakon belli elhelyezkedsi sorrendje olyan kellemetlen tnyezk, amelyekre klns figyelmet kell fordtanunk. Az egyb gpfgg tulajdonsgok mr nem jelentenek nagyobb problmt.

    A regiszterekben tnylegesen elhelyezked register tpus vltozk szma - a megengedett tpuskszlethez hasonlan - gprl gpre vltozik. Minden fordt helyesen vgzi azonban a dolgt a sajt gpe szempontjbl: a fls szm vagy rvnytelen register deklarcikat nem veszi figyelembe. Nehzsgek csak akkor tmadnak, amikor valaki rossz programozsi mdszereket alkalmaz. Ne rjunk olyan programokat, amelyek az adott architektra brmilyen specifikus tulajdonsgtl fggetlenek!

    A fggvnyargumentumok kirtkelsi sorrendjt a nyelv nem hatrozza meg. PDP- 11-en jobbrl balra, a tbbi gpen balrl jobbra trtnik. A mellkhatsok rvnyeslsnek sorrendje ugyancsak nem meghatrozott.

    Mivel a karakterllandk valjban int tpus objektumok, tbb karakterbl ll karakterllandk hasznlata is megengedett. Ennek megvalstsa azonban rendkvl gpfgg, mivel a karakterek szhoz trtn hozzrendelsnek sorrendje gprl gpre vltozik.

    Mezk hozzrendelse szavakhoz, karakterek egszekhez a PDP 11-en jobbrl balra, a tbbi gpen balrl jobbra trtnik. Elszigetelt programok szmra e klnbsgek lthatatlanok maradnak, hacsak nem viszik tlzsba a tpusokkal folytatott jtkot (pl. azltal, hogy valamely int mutatt char mutatv alaktanak t, majd megvizsgljk a megcmzett trterletet). Szmolnunk kell azonban e klnbsgekkel akkor, ha a programunkat kvlrl megszabott trterlet-elrendezsekkel akarjuk sszhangba hozni.

    A klnfle fordtk ltal elfogadott nyelvek csupn egszen kis rszletekben trnek el egymstl. A leglnyegesebb, hogy a pillanatnyilag hasznlatos PDP-11-es fordt nem inicializlja a bitmezket tartalmaz struktrkat, s egyes rtkad opertorokat nem fogad el olyan krnyezetben, ahol ki akarjuk hasznlni a hozzrendels rtkt.

    17. Anakronizmusok Mivel a C fejldsben lev nyelv, egyes rgebbi programokban bizonyos elavult szerkezetek tallhatk. Br a fordt legtbb vltozata az ilyen anakronizmusokat is tmogatja, elbb-utbb ezek el fognak tnni, csupn gpfggsgi problmt hagyva maguk utn.

    A C nyelv korbbi vltozatai rtkad opertorknt az =op

    Forrs: http://www.doksi.hu

  • 31

    alakot hasznltk az op= alak helyett. Ez ktrtelmsgekhez

    vezet, amelynek tipikus esete

    x = -1