kategória | ||||||||||
|
||||||||||
|
||
A C nyelv kifejezései, utasításai
A C programok végrehajtandó része a program során elvégzendõ tevékenységek leírását, a szükséges utasításkat tartalmazza. A struktúrált programozási nyelvek sajátossága, hogy viszonylag kevés utasítást és sok beépített eljárást, függvényt tartalmaznak. Ezek a tulajdonságok C nyelv esetén is megfigyelhetõk, az utasítások mindössze a struktúrált programozás eszözeit biztosítják a programozó számára.
A C nyelv utasításainak csoportosítása:
Üres utasítás: ;
Összetett utasítás:
Szelekciós utasítások: if, switch
Vezérlésátadó utasítások: break, return
Iterációs (ciklus) uta 838i87i sítások: for, while
Kifejezés utasítások
Üres utasítás:
Olyan helyen alkalmazzuk, ahol szintaktikailag mindenképpen szerepelnie kell
egy utasításnak, de semmilyen tevékenységet nem szeretnénk végezni. Nem
tévesztendõ össze az utasításokat lezáró pontosvesszõvel.
Összetett utasítás:
A program blokkszerkezetének kialakítását teszi lehetõvé
elsõsorban. Az összetett utasítás szintaktikailag egy utasításnak
számít, de az utasítászárójelek között több utasítás is szerepelhet. Tehát
célszerûen alkalmazhatjuk az összetett utasítást a program olyan
részeinél, ahol egy utasítás állhat, de több utasítást szeretnénk egyszerre
elvégezni. Például: ciklusmagok, szelekciós utasítások.
Szelekciós utasítások:
Ezek az utasítások lehetõvé teszik a program feltételtõl
függõ végrehajtását, két vagy több irányban.
if utasítás:
Az if utasítás feltételes végrehajtást, illetve kétirányú elágazást tesz
lehetõvé. A két lehetõségnek megfelelõen két formában
használhatjuk ezt az utasítást.
Feltételes végrehajtás:
if (feltétel) utasítás;
Az utasítás csak akkor kerül végrehajtásra, ha a feltétel teljesül, egyébként a program az utasítást figyelmen kívül hagyja. A feltétel lehet egy változó vagy egy kifejezés. A kifejezés típusa lehet logikai (értelemszerûen), és numerikus. A numerikus kifejezés esetén a 0-nál nagyobb érték jelenti a feltétel teljesülését, míg a 0 és a negatív érték hamis eredményt szolgáltat.
Kétirányú elágazás:
if (feltétel)
utasítás1;
else
utasítás2;
Amennyiben a feltétel igaz, az utasítás1, egébként az utasítás2 kerül végrehajtásra. Az utasítás1 után mindig ki kell tenni a pontosvesszõt (Pascal-tól eltérõen). A feltétel ebben az esetben is egyaránt lehet változó vagy kifejezés.
Az if utasítás mindkét formájára igaz, hogy a feltételt minden esetben zárójelek között kell megadni.
switch utasítás:
A switch utasítás segítségével tudjuk megoldani a program során az
esetszétválasztást, azaz a kettõnél több irányú elágazást. Az
esetszétválasztás során egy változó vagy egy kifejezés értékétõl
függõen folytatódhat a program végrehajtása több (max 257) irányban. A
változó, illetve kifejezés típusa mindenképpen egész típus kell legyen. A
felvehetõ értékeket a switch utasításon belül konstansként kell
meghatároznunk.
switch (kifejezés)
A konstansok elõtt szerepelnie kell a
case utasításnak, a konstans értéktõl kettõsponttal elválasztva
írhatjuk le az utasításokat. Az esetkonstansok után több utasítást is
megadhatunk utasítászárójel ( ) alkalmazása nélkül. A default utasítás után
szereplõ utasítások akkor kerülnek végrehajtásra, ha a kifejezés
(változó) értéke nem volt egyenlõ egyik konstanssal sem. A default
utasítás elhagyható.
Fontos figyelnünk arra, hogy miután egy konstanshoz tartozó utasítások
végrehajtásra kerülnek, ki kell ugranunk a swith utasításból, ez ugyanis nem
történi meg automatikusan (Pascal-lal ellentétben). A kiugrást célszerû a
break utasítással végrehajtani.
Egy példa a swith utasítás alkalmazására:
#include <stdio.h
main()
return 0;
}
A program beolvas egy betût a
billentyûzetrõl, majd kiértékeli, melyik betût ütöttük le. A
case utasítás után csak egy konstans értéket adhatunk meg. Ha több érték esetén
szeretnénk ugyanazt a tevékenységet végrehajtani, célszerû a fenti
módszert alkalmazni. Minden esetkonstanshoz tartozó utasítássorozat végén
célszerû a switch utasításból kiugrani, a break utasítás segítségével. Ha
ezt nem tesszük akkor szemantikai hibát fogunk tapasztalni (a program nem úgy
fog mûködni, ahogy szeretnénk. Hagyjuk el a break utasításokat, futtassuk
a programot és meglátjuk mi fog történni, itt leírni hosszú lenne).
Vezérlésátadó utasítások:
Mint a nevükbõl is lehet következtetni, a program futása során a végrehajtás menetét befolyásoló utasítások. Hatásukra a program futásának folytonossága megszakad, a végrehajtás egy távolabbi utasításnál folytatódik. Azt, hogy hol fog folytatódni a végrehajtás az utasítás határozza meg.
break utasítás:
Hatására a program kilép az éppen végrehajtás alatt álló szelekciós vagy
ciklusutasításból, és a szelekciós vagy ciklusutasítás után álló utasítással
folytatja a program végrehajtását. Tehát egy szelekció vagy egy ciklus
megszakítható a break utasítás segítségével. Ciklusok közül elsõsorban a
while ciklusoknál alkalmazható, a for ciklus mûködésébe "nem
illik" beavatkozni (de lehetséges!).
return utasítás:
Hatására a program kilép az éppen végrehajtás alatt álló függvény
törzsébõl, és a függvényhívás után álló utasítással folytatódik a
program végrehajtása. A return utasítás után meg kell adnunk a függvény
visszatérési értékét. A return utasításnak speciális szerepe van a main()
függény használata során. A main() függvényben szereplõ return utasítás
hatására a program mûködése befejezõdik.
Iterációs (ciklusszervező) utasítások:
Minden magasszintû programozási nyelv biztosítja a lehetõséget az ismétlõdõ tevékenységek ciklusban történõ végrehajtásához. (Bõvebben lásd 8. tétel). A C nyelv háromféle ciklusszervezési lehetõséget biztosít a programozó számára.
for ciklus:
Elöltesztelõ ciklus, az ismétlések szám elõre meg van határozva.
Mûködés szempontjából hasonló a Pascal For ciklusához.
for (ciklusváltozó=kezdõérék; feltétel;
léptetés)
utasítás;
A for ciklus fejrészében együtt határozzuk meg a ciklus futásának összes feltételét. Az elsõ a ciklusváltozó kezdõértékének meghatározása, amely egy egyszerû értékadással történik. A feltétel határozza meg, hogy a ciklusváltozónak milyen értéket kell elérni a ciklus befejezéséhez. A léptetés során növeljük vagy csökkentjük a ciklusváltozó értékét. A ciklusváltozó int típusú változó.
Példa:
...
for (i=1; i<=10; i++)
printf("%d\n", i);
...
A példaprogram kiírja a ciklusváltozó értékét a ciklus minden egyes iterációja (végrehajtása) során. A for ciklus esetében a ciklusmag egyetlen utasítást tartalmazhat, ezért gyakran alkalmazzuk az összetett utasítást ciklusmagként.
while ciklus:
Elöltesztelõ ciklus, az ismétlések száma nincs elõre
meghatározva, határozatlan ismétlésszámú ciklus.
while (feltétel)
utasítás;
A feltételt itt is mindig zárójelek között
kell megadni. A feltétel int vagy logikai típusú kifejezés, kiértékelése az if
utasításánál leírtak szerint történik. A ciklusmag addig ismétlõdik,
amíg a feltétel igaz. A ciklusmag itt is egy utasításból épül fel, gyakran
használjuk az összetett utasítást. Példa:
Határozzuk meg az elsõ N természetes szám összegét.
#include <stdio.h
main()
printf("Az elso %d termeszetes szam
osszege: %d\n", n, sum);
return 0;
}
A ciklusmag végrehajtása addig ismétlõdik, amíg i értéke el nem éri n értékét. A ciklusmagon belül magunknak kell változtatni az i változó értékét, a while ciklusnál a ciklusváltozó léptetése a ciklusmagon belül történik.
do ... while ciklus:
Hátultesztelõ, határozatlan ismétlésszámú ciklus.
do
utasítás;
while (feltétel);
A ciklusmag végrehajtása addig ismétlõdik, amíg a feltétel igaz. Tulajdonképpen a while ciklus hátultesztelõ változatának tekinthetõ. Sokkal ritkábban alkalmazzuk, mint az elõzõ két ciklust. A feltétel int vagy logikai típusú lehet. A ciklusmag egyetlen utasítást tartalmazhat, tehát ha több utasítást szeretnénk itt elhelyezni, akkor összetett utasítást kell alkalmaznunk. A ciklusváltozó értékének változtatását a ciklusmagon belül a programnak kell elvégezni, a léptetés nem automatikus. Az elõbbi feladat megoldása do ... while ciklus alkalmazásával:
#include <stdio.h
main()
while (i<=n);
printf("Az elso %d termeszetes szam
osszege: %d\n", n, sum);
return 0;
}
Kifejezések:
A kifejezések operátorokból (mûveleti
jelekbõl) és oprandusokból (változókból, konstansokból) felépülõ
mûveletek. Az operátorok határozzák meg az elvégzésre kerülõ
mûveletet, az operandusok adják az értéket, amivel mûveletet kell
végezni.
Egy kifejezésen belül elõírhatjuk több mûvelet elvégzését is: ezek
az összetett kifejezések. Az összetett kifejezések kiértékelése során a
mûveletek sorrendjét az operátorok határozzák meg, ezt nevezzük
precedencia szabálynak. A precedencia szabály határozza meg, hogy az összetett
kifejezések kiértékelése során milyen sorrendben kell elvégezni a
mûveleteket. Egy másik fontos szabály az asszociativitás, amely
meghatározza, hogy az összetett kifejezésen belül az azonos
precedenciaszintû operátorok milyen sorrendben kerülnek kiértékelésre.
A C operátorok precendenciája és assziciativitása
|
balról jobbra |
! ~ - ++ -- & * (típus) sizeof |
jobbról balra |
|
balról jobbra |
|
balról jobbra |
<< |
balról jobbra |
< <= = |
balról jobbra |
|
balról jobbra |
& |
balról jobbra |
|
balról jobbra |
|
balról jobbra |
&& |
balról jobbra |
|
balról jobbra |
|
jobbról balra |
= += -= *= /= %= <<= = &= |= ^= |
jobbról balra |
|
balról jobbra |
A precedencia alapján csak akkor lehet
meghatározni az összetett kifejezés kiértékelésének sorrendjét, ha a
kifejezésben szereplõ mûveletek különbözõ precedenciájúak.
Pld:
e=a+3*b;
A fenti kifejezés kiértékelése során elõször nyilván a szorzást végzi el
a program, majd a szorzathoz adja hozzá a változó értékét. A precedencia
szabályait felülbírálhatjuk zárójelek segítségével (hogy pontosan fogalmazzak a
kifejezés precedenciáját változtatjuk meg, hiszen a táblázatban látható, hogy a
zárójel a legmagasabb precedenciával rendelkezõ operátor).
e=(a+3)*b;
A kifejezés kiértékelése során mostmár elõször az összeadás történik
meg, aztán kerül sorra a szorzás.
Ha egy kifejezésen belül azonos
precedenciaszintû operátorok szerepelnek, azok kiértékelésének sorrendjét
az asszociativitás határozza meg.
Pld:
...
e=3;
b=2;
c=5;
e+=b+7-2+c;
...
A példában az e változó értéke 15 lesz, mivel elõször az elsõ összeadás kerül kirtékelésre, majd a kapott eredménybõl kivonjuk a 2-t, hozzáadjuk a c változó értékét, és végül a kapott értékkel (12) megnöveljük az e változó értékét. A kifejezés kiértékelése során a precedencia mellett figyelembe kell venni az asszociativitás szabályait is, mivel az összeadás és a kivonás azonos precedenciájú mûveletek.
Egy érdekes lehetõség a C nyelvben a
többszörös értékadás. Az értékadás is a kifejezések közé sorolható. Nézzünk egy
példát:
a=b=2;
Ez a sor a C programban egy utasításként kerül értelmezésre, mivel bármely
kifejezésbõl utasítást lehet elõállítani, ha a kifejezés után
pontosvesszõt írunk. A kifejezés (utasítás) két azonos precedenciájú
mûveletbõl épül fel: a=2, b=2. A két mûveletet egyetlen
kifejezésbe is írhatjuk, mivel az értékadás mûvelet kiértékelése jobbról
balra haladva történik, tehát elõször a kifejezés jobb oldalán álló
konstans kerül értelmezésre, majd elõször a b, másodszor az a változó
kapja meg a konstans értékét.
Szintaktikailag helyes a következõ utasítás is, amelyet egy kifejezés
segítségével írunk fel:
x+2;
A kifejezés valóban utasításként kerül kiértékelésre, de hatására semmi nem
történik, tehát szintaktikailag helyes, de valójában nincs értelme ilyen
utasításokat írni a C programba.
:
1585