Elöltesztelt, feltételvezérelt ciklusok szervezésére szolgál a while utasítás, alakja:
while (kifejezés) utasítás vagy blokk
A fenti ciklusba lépve a kifejezés kiértékelésre kerül, és ha értéke 0, akkor a ciklus törzsére nem adódik egyszer sem a vezérlés. Ha a kifejezés igaz, akkor végrehajtásra kerül az utasítás vagy blokk, majd újra a kifejezés kiértékelése következik, stb. A ciklusból tehát mindaddig nem jutunk ki, amíg a ciklusfeltétel hamis nem lesz. A pelda.c program fõ ciklusa is a while szerkezettel lett megoldva:
while ((c = getchar()) != EOF) {ciklustörzs
} /* endw */A ciklusban maradás feltétele itt az, hogy a terminálról beolvasott, és a c változóban tárolt érték ne a file-vége jel legyen. A fenti séma karakteres file-olvasásnál mindennapos a C-ben. Vegyük észre azt is, hogy ha a file nem tartalmaz (vagy a terminál nem küld) egyetlen karaktert sem, akkor a programunk illõen nem csinál semmit. Gyakran elõfordul, hogy a ciklus feltételrészében minden tennivalót elvégzünk, és a ciklus törzse üresen marad, például:
while ((c = str[i++]) == ' ') ;Induláskor az str karakterlánc i-edik elemén állunk, és a ciklus végére c felveszi a sztring soron következõ, nem szóköz karakterét, i pedig a karakterlánc rákövetkezõ elemének indexét tartalmazza.
Hátultesztelt, feltételvezérelt ciklusokat a következõ formában írhatunk:
do utasítás vagy blokk while( kifejezés);
Az adott utasítás vagy blokk végrehajtása mindaddig ciklikusan ismétlõdik, amíg a ciklusfeltételt jelentõ kifejezés igaz (nem 0) marad. Akkor célszerû a használata, ha a ciklustörzset legalább egyszer mindenképpen végre kell hajtani.
Más nyelvekhez hasonlóan elsõsorban a for utasítás szolgál arra, hogy számlálóvezérelt ciklusokat készítsünk; ugyanakkor a C nyelv for ciklusa jóval kötetlenebb. Általános alakja:
for (inicializáló_kifejezés;
feltétel_kifejezés;
léptetõ_kifejezés) utasítás vagy blokk
A ciklusba lépve kiértékelõdik az inicializáló_kifejezés, ami valamilyen mellékhatáson keresztül inicializáló szerepet tölt be. Ezután a feltétel_kifejezés értékét határozza meg a gép, és ha értéke hamis (0), akkor elhagyjuk a ciklust. Egyébként végrehajtásra kerül a ciklus törzsét alkotó utasítás vagy blokk, majd a léptetõ_kifejezés értékének meghatározására kerül sor (ez egy mellékhatás révén a ciklusban történõ léptetést vezérelheti), majd visszatérünk a ciklusfejben lévõ feltétel_kifejezés kiértékelésére, és a ciklus mindaddig folytatódik, amíg feltétel_fifejezés hamis nem lesz. A fentiek alapján látható, hogy a for a while egy olyan kiterjesztéseként is felfogható, ahol a ciklus elõtti inicializáló és a ciklustörzs legvégén szereplõ léptetõ kifejezés-utasításokat egy helyre, a ciklusfejbe összevonjuk. Elsõ példaként nézzünk meg egy, a hagyományos for-nak megfelelõ számlálóvezérelt ciklust:
for (i = 0; i < dbszam; i++) { .... } /* endfor */A fenti ciklus a törzsét dbszam-szor hajtja végre, illetve ha dbszam <= 0, akkor egyszer sem (azaz ez a változat is kicsit intelligensebb a hagyományos for utasításoknál).
A következõ példa megkeresi a float vektor[N] tömbben az elsõ negatív elemet:
for (i = 0; i < N && vektor[i] >= 0; i++) ;Ha kilépéskor i értéke N, akkor minden elem nemnegatív, egyébként i a kérdéses elem indexe. A for ciklus fejében lévõ kifejezések közül bármelyik el is maradhat. Ha a feltétel_kifejezés-t hagyjuk el, akkor az állandó igazat jelent. A
for (;;) { ... } /* endfor */alakú ciklus a végtelen ciklus, kilépés belõle csak egyéb vezérlõutasításokkal lehetséges. (Egy másik lehetõség a végtelen ciklus létrehozására a while(1) {...} szerkezetû ciklus.)