Informatika2-2012/Eloadas01
Ador (vitalap | szerkesztései) (→A C program formázása) |
|||
(2 szerkesztő 12 közbeeső változata nincs mutatva) | |||
1. sor: | 1. sor: | ||
− | == | + | == A C nyelv alapjai == |
=== A C nyelv tulajdonságai === | === A C nyelv tulajdonságai === | ||
18. sor: | 18. sor: | ||
* A C nyelv több programnyelv alapja (C++, C#, Java,...) | * A C nyelv több programnyelv alapja (C++, C#, Java,...) | ||
− | * Más programnyelven írt kódok hatékonnyá tehetők, ha a legtöbb gépidőt használó függvényeket C-ben újra írjuk. | + | * Más programnyelven írt kódok hatékonnyá tehetők, ha a legtöbb gépidőt használó függvényeket C-ben újra írjuk. Kritikusan sok gépidőt igénylő algoritmusoknál segíthet. |
+ | |||
=== Egy C program futtatása === | === Egy C program futtatása === | ||
A forrás egyszerű szövegfájl .c kiterjesztéssel, mely bármely szövegszerkesztővel szerkeszthető (pl gedit, kate, emacs, vi,...). Például a [http://www.math.bme.hu/~wettl/okt/info2/2012/hello.c hello.c] program kódja a következő: | A forrás egyszerű szövegfájl .c kiterjesztéssel, mely bármely szövegszerkesztővel szerkeszthető (pl gedit, kate, emacs, vi,...). Például a [http://www.math.bme.hu/~wettl/okt/info2/2012/hello.c hello.c] program kódja a következő: | ||
− | < | + | <c> |
− | + | #include <stdio.h> | |
− | + | int main(void) { | |
− | + | printf("Hello, World!\n"); | |
− | + | return 0; | |
− | + | } | |
− | + | </c> | |
− | </ | + | |
Ez kiírja, hogy ,,Hello, World!". Miután elmentettük a programot, fordítsuk le, majd futtassuk: | Ez kiírja, hogy ,,Hello, World!". Miután elmentettük a programot, fordítsuk le, majd futtassuk: | ||
− | $ gcc -Wall -o hello hello.c | + | $ gcc -W -Wall -o hello hello.c |
$ hello | $ hello | ||
Hello, World! | Hello, World! | ||
$ | $ | ||
− | Elhagyható a -o kapcsoló, ekkor egy a.out nevű fájl lesz a futtatható program, a -Wall figyelmeztető hibaüzeneteket is | + | Elhagyható a -o kapcsoló, ekkor egy a.out nevű fájl lesz a futtatható program, a -W és a -Wall több figyelmeztető hibaüzeneteket ír ki, ami segíthet a hibák megtalálásában. |
+ | |||
+ | A fordítás lépései külön-külön is elvégezhetők: | ||
+ | |||
+ | gcc -E hello.c >hello.ee (csak az előfeldolgozó fut le -> standard outputra ír) | ||
+ | gcc -S hello.c (fordít, de az assembler nem -> hello.s -- assembly kód) | ||
+ | gcc -c hello.c (fordít, de nem szerkeszt (nem linkel) -> hello.o -- object file) | ||
+ | gcc hello.c (előfeldolgoz+fordít+szerkeszt (linkel) -> a.out -- futtatható állomány) | ||
+ | |||
+ | Néhány a megadható számtalan opció közül csak tájékoztatásképp: | ||
+ | |||
+ | $ gcc -W -Wall -s -O2 -lm -o <program> <program>.c | ||
+ | |||
+ | * ''gcc'': a fordítóprogram neve. A ''GNU C Compiler'' és egyben a ''GNU Compiler Collection'' rövidítése. (Mi az a GNU?) | ||
+ | * ''-W'': a legfontosabb figyelmeztető üzeneteket (warning) bekapcsolja | ||
+ | * ''-Wall'': még néhány fontos figyelmeztető üzenetet bekapcsol | ||
+ | * ''-s'': a fölösleges részeket (pl. nyomkövetési információk és szimbólumok) eltávolítja kimenetből. Nélküle nagyobb lenne a kimenet. | ||
+ | * ''-O2'': bekapcsolja a második szintű optimalizálást. (A harmadik szintű esetén már lassabban fordul, és túl nagy lehet a kód. Az első szintű esetén lassabb lesz a futó program, és esetleg túl nagy is. Vannak egyéb szintek is, például alapból a nulladik szint érvényes. Nem nulla, hanem nagy O betű van a kapcsolóban.) | ||
+ | * ''-lm'': a matematikai függvényeket (pl. ''sqrt'' és ''cos'') tartalmazó matematikai függvénykönyvtárat teszi elérhetőve. Emellett a forráskódban szerepelnie kell még az <code>#include <math.h></code>-nak is a matematikai függvényekhez. Nem egyes, hanem kis l betű van a kapcsolóban. | ||
+ | * ''-o <program>'': a kimeneti futtatható fájl nevét adja meg | ||
+ | * ''<program>''.c: bemeneti forrásfájl nevét adja meg | ||
=== Egy C program elemei === | === Egy C program elemei === | ||
− | + | ==== Függvények ==== | |
+ | A hello.c programunk kódja meglepően hosszú. Mit jelentenek a sorai? Az | ||
+ | <c> | ||
int main(void) | int main(void) | ||
− | + | </c> | |
vagy | vagy | ||
− | + | <c> | |
int main() | int main() | ||
− | + | </c> | |
vagy | vagy | ||
− | + | <c> | |
main() | main() | ||
− | + | </c> | |
− | minden C programban kötelező, minden programban van egy main nevű függvény, és ennek meghívásával indul a program végrehajtása. Ha 0 a visszatérési értéke, akkor a program normálisan lefutott -- ez jelzés a külvilágnak. Ezt jelzi a return 0; parancs. Az | + | sor minden C programban kötelező, minden programban van egy main nevű függvény, és ennek meghívásával indul a program végrehajtása. Ha 0 a visszatérési értéke, akkor a program normálisan lefutott -- ez jelzés a külvilágnak. Ezt jelzi a return 0; parancs. Az |
− | + | <c> | |
+ | #include <stdio.h> | ||
+ | </c> | ||
sorral azt jelezzük, hogy a ,,standard input-output" függvények valamelyikét használni szeretnénk (itt pl. printf, azaz formázott kiírás). | sorral azt jelezzük, hogy a ,,standard input-output" függvények valamelyikét használni szeretnénk (itt pl. printf, azaz formázott kiírás). | ||
− | + | ==== Változók és típusaik ==== | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | Itt változót deklarálunk, | + | A következő programban aritmetikai számítást is végzünk: |
− | + | <c> | |
+ | #include <stdio.h> | ||
+ | int main(void) { | ||
+ | int n; | ||
+ | n = 5; | ||
+ | printf("az eredmeny: %d\n", 3*n + 1); | ||
+ | return 0; | ||
+ | } | ||
+ | </c> | ||
+ | Itt változót deklarálunk, azaz megadtuk típusát (lehet pl. int, float, double, char, void,....), majd értéket adunk neki. Ez egy sorban is elvégezhető: | ||
+ | <c> | ||
+ | int n = 5; | ||
+ | </c> | ||
A kiírásban az idézőjelbe tett szöveg mellett a kiírandó kifejezés értékének formátumát is megadjuk: %d az egész számok kiírását jelenti. | A kiírásban az idézőjelbe tett szöveg mellett a kiírandó kifejezés értékének formátumát is megadjuk: %d az egész számok kiírását jelenti. | ||
− | Következzen a standard bemenet egyszerű használata, olvassunk be az ' | + | Következzen a standard bemenet egyszerű használata, olvassunk be az 'a' és 'b' nevű változóba egy-egy egész számot, és ezzel számoljunk (kód: [http://www.math.bme.hu/~wettl/okt/info2/2012/muveletek.c muveletek.c]). A műveletek: összeadás (+), kivonás (-), szorzás (*), egész osztás (/), maradékképzés (%), bitenkénti és (&), bitenkénti vagy (|), logikai és (&&), logikai vagy (||), ahol 0 a hamis, minden más igaz. |
− | < | + | <c> |
− | + | #include <stdio.h> | |
− | int main(void) | + | |
− | + | int main(void) { | |
− | + | int a,b; | |
− | + | ||
− | + | printf("kerek egy pozitiv szamot: "); | |
− | + | scanf("%d", &a); | |
− | + | printf("kerek meg egy pozitiv szamot: "); | |
− | + | scanf("%d", &b); | |
− | </ | + | |
+ | printf("a ket szam osszege: %d\n", a+b); | ||
+ | printf("a ket szam kulonbsege: %d\n", a-b); | ||
+ | printf("a ket szam szorzata: %d\n", a*b); | ||
+ | printf("a ket szam egesz hanyadosa: %d\n", a/b); | ||
+ | printf("az osztasi maradek: %d\n", a%b); | ||
+ | printf("a ket szam lebegopontos hanyadosa:%f\n", (float)a/b); | ||
+ | printf("bitenkenti ES %d\n" ,a&b); | ||
+ | printf("bitenkenti VAGY %d\n", a|b); | ||
+ | printf("logikai ES %d\n" ,a&&b); | ||
+ | printf("logikai VAGY %d\n", a||b); | ||
+ | |||
+ | return 0; | ||
+ | } | ||
+ | </c> | ||
+ | A beolvasásnál nem 'a', hanem '&a' szerepel, ami az 'a' változó fizikai címét jelenti, erre később visszatérünk. | ||
+ | |||
+ | ==== Vezérlő struktúrák ==== | ||
És akkor következzen egy program, amiről nem is tudjuk, hogy véges időben leáll-e minden bemenetre, a Collatz-probléma [http://www.math.bme.hu/~wettl/okt/info2/2012/collatz.c collatz.c]: | És akkor következzen egy program, amiről nem is tudjuk, hogy véges időben leáll-e minden bemenetre, a Collatz-probléma [http://www.math.bme.hu/~wettl/okt/info2/2012/collatz.c collatz.c]: | ||
− | < | + | <c> |
− | + | #include <stdio.h> | |
− | + | int main(void) { | |
− | + | int x; | |
− | + | printf("legyen x = "); | |
− | + | scanf("%d", &x); | |
− | + | while (x>1) | |
− | + | { | |
− | + | if (x % 2) | |
− | + | x = 3*x + 1; | |
− | + | else | |
− | + | x /= 2; | |
− | + | printf("%d ", x); | |
− | + | } | |
− | + | printf("\n"); | |
− | + | return 0; | |
− | + | } | |
− | </ | + | </c> |
− | + | ||
Ebben szerepel egy elöl tesztelős while ciklus és egy elágazás! | Ebben szerepel egy elöl tesztelős while ciklus és egy elágazás! | ||
+ | |||
+ | Felsoroljuk a C vezérlőstruktúráit, hogy mindjárt egyszerűbb programokat írhassunk: | ||
+ | * if és if-else: | ||
+ | <c> | ||
+ | if (feltétel) { | ||
+ | ... | ||
+ | } | ||
+ | </c> | ||
+ | vagy | ||
+ | <c> | ||
+ | if (feltétel) { | ||
+ | ... | ||
+ | } | ||
+ | else { | ||
+ | ... | ||
+ | } | ||
+ | </c> | ||
+ | vagy több feltétel esetén (itt is elhagyható az utolsó "else" ág) | ||
+ | <c> | ||
+ | if (feltétel1) { | ||
+ | ... | ||
+ | } | ||
+ | else if (feltétel2) { | ||
+ | ... | ||
+ | } | ||
+ | ... | ||
+ | else if (feltételN) { | ||
+ | ... | ||
+ | } | ||
+ | else { | ||
+ | ... | ||
+ | } | ||
+ | </c> | ||
+ | * while-ciklusok: | ||
+ | ** hátultesztelős | ||
+ | <c> | ||
+ | do { | ||
+ | ... | ||
+ | } while (feltétel); | ||
+ | </c> | ||
+ | ** elöltesztelős | ||
+ | <c> | ||
+ | while (feltétel) { | ||
+ | ... | ||
+ | } | ||
+ | </c> | ||
+ | * for-ciklus: | ||
+ | <c> | ||
+ | for (inicializálás; feltétel; végén) { | ||
+ | ... | ||
+ | } | ||
+ | </c> | ||
+ | A for ciklus az ''inicializálás''-ban megadott parancsokat végrehajtja, majd minden ciklus elején ellenőrzi a ''feltétel''-t, és kilép, ha az hamis, végül minden ciklus végén végrehajtja a ''végén'' utasításait. Például | ||
+ | <c> | ||
+ | int i; | ||
+ | for (i=1; i<6; i++) { | ||
+ | printf("%d ", i^2); | ||
+ | } | ||
+ | </c> | ||
+ | kiírja 1-től 5-ig a számok négyzeteit. | ||
==== A C program formázása ==== | ==== A C program formázása ==== | ||
− | A | + | A sor elején levő szóközök számára vonatkozó beljebb kezdési szabály (sokféle változata lehetséges, itt csak a tárgy keretében használatosat értelmezzük): |
− | + | ||
+ | * Beljebb kezdésre csak szóközöket használjunk, tabulátort nem. | ||
+ | * A nyitó és a záró kapcsost is írjuk külön sorba, és azonos oszlopban legyenek. (Ha esetleg a nyitó kapcsos a sor végére kerülne, a záró kapcsos elé pontosan annyi szóköz kerüljön, ahány szóköz volt a hozzá tartozó nyitó kapcsos zárójelet tartalmazó sor elején.) | ||
+ | * Minden egyéb sor elején pontosan négyszer (esetleg pontosan kétszer) annyi szóköz van, ahány (bezáratlan) kapcsos zárójelen belül van az adott sor. | ||
− | < | + | További segítséget jelentenek a megjegyzések, ezeket /* és */ közé kell zárni, egy szokásos alkalmazásuk: |
− | + | <c> | |
− | + | /* megjegyzés | |
− | + | * megjegyzés | |
− | + | * megjegyzés | |
− | + | */ | |
− | </ | + | </c> |
+ | Egy másik elterjedt szabvány szerint // után írva adhatjuk meg a megjegyzést, mely a sor végéig tart. | ||
− | A | + | A C programok olvashatóvá tétele sokat segít a kód későbbi megértésében, erre vonatkozó tanácsokat érdemes betartani. Egy ilyen leírás pl. itt található: |
− | + | http://www.gidnetwork.com/b-38.html Érdemes lesz később is visszatérni rá, és követni. | |
− | + | ||
− | + | ||
− | + | ||
+ | A kódban van némi lazaságra lehetőség, pl. nem kiírni main típusát, mert az úgyis kötelezően int, vagy nem visszaadni a 0 értéket, de ezekkel legyünk óvatosak. | ||
+ | <c> | ||
+ | #include <stdio.h> | ||
+ | main() { | ||
+ | printf("Hello, World!\n"); | ||
+ | } | ||
+ | </c> | ||
+ | A behúzás sem része a szintaktikának, a kód folyamatosan is írható, vagy más logika szerint tördelhető, de ezt sose tegyük: | ||
+ | <c> | ||
+ | #include <stdio.h> | ||
+ | int main(){printf("Hello, World!\n");return(0);} | ||
+ | </c> | ||
Egy szándékosan elrettentő példa [http://www.math.bme.hu/~wettl/okt/info2/2012/mistery.c mistery.c] | Egy szándékosan elrettentő példa [http://www.math.bme.hu/~wettl/okt/info2/2012/mistery.c mistery.c] | ||
− | < | + | <c> |
− | + | #include <stdio.h> | |
− | + | main(t,_,a) | |
− | + | char *a; | |
− | + | {return!0<t?t<3?main(-79,-13,a+main(-87,1-_, | |
− | + | main(-86, 0, a+1 )+a)):1,t<_?main(t+1, _, a ):3,main ( -94, -27+t, a | |
− | + | )&&t == 2 ?_<13 ?main ( 2, _+1, "%s %d %d\n" ):9:16:t<0?t<-72?main(_, | |
− | + | t,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l,+,/n{n+\ | |
− | + | ,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/\ | |
− | + | +k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){n\ | |
− | + | l]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#\ | |
− | + | n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \ | |
− | + | ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;\ | |
− | + | #'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/") | |
− | + | :t<-50?_==*a ?putchar(a[31]):main(-65,_,a+1):main((*a == '/')+t,_,a\ | |
− | + | +1 ):0<t?main ( 2, 2 , "%s"):*a=='/'||main(0,main(-61,*a, "!ek;dc \ | |
− | + | i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);} | |
− | </ | + | </c> |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + |
A lap jelenlegi, 2012. február 8., 20:17-kori változata
Tartalomjegyzék |
A C nyelv alapjai
A C nyelv tulajdonságai
A C általános célú magas szintű nyelv (valójában a magasszintű és az alacsonyszintű nyelvek között helyezkedik el), melyet a Unix operációs rendszerhez Dennis Ritchie fejlesztett ki. 1989-ban szabványosítva lett: ANSI C (American National Standards Institute).
- Strukturált nyelv
- Szabványos könyvtári függvények
- Hordozható (a C kód számtalan gépen lefordítható és futtatható)
- Hatékony programok írására alkalmas (a magas szintű nyelvek közül a leghatékonyabbak egyike)
- Egyszerű nyelv, tömör szintaktika
- Előfeldolgozó (makroprocesszor)
A nyelv gyengéi: könnyű nehezen olvasható kódot írni, nehéz a hibák megtalálása, nincs automatikus memóriakezelés, tömbből kiírás veszélye,...
Matematikusként miért tanulunk C-t?
- A C nyelv több programnyelv alapja (C++, C#, Java,...)
- Más programnyelven írt kódok hatékonnyá tehetők, ha a legtöbb gépidőt használó függvényeket C-ben újra írjuk. Kritikusan sok gépidőt igénylő algoritmusoknál segíthet.
Egy C program futtatása
A forrás egyszerű szövegfájl .c kiterjesztéssel, mely bármely szövegszerkesztővel szerkeszthető (pl gedit, kate, emacs, vi,...). Például a hello.c program kódja a következő:
#include <stdio.h> int main(void) { printf("Hello, World!\n"); return 0; }
Ez kiírja, hogy ,,Hello, World!". Miután elmentettük a programot, fordítsuk le, majd futtassuk:
$ gcc -W -Wall -o hello hello.c $ hello Hello, World! $
Elhagyható a -o kapcsoló, ekkor egy a.out nevű fájl lesz a futtatható program, a -W és a -Wall több figyelmeztető hibaüzeneteket ír ki, ami segíthet a hibák megtalálásában.
A fordítás lépései külön-külön is elvégezhetők:
gcc -E hello.c >hello.ee (csak az előfeldolgozó fut le -> standard outputra ír) gcc -S hello.c (fordít, de az assembler nem -> hello.s -- assembly kód) gcc -c hello.c (fordít, de nem szerkeszt (nem linkel) -> hello.o -- object file) gcc hello.c (előfeldolgoz+fordít+szerkeszt (linkel) -> a.out -- futtatható állomány)
Néhány a megadható számtalan opció közül csak tájékoztatásképp:
$ gcc -W -Wall -s -O2 -lm -o <program> <program>.c
- gcc: a fordítóprogram neve. A GNU C Compiler és egyben a GNU Compiler Collection rövidítése. (Mi az a GNU?)
- -W: a legfontosabb figyelmeztető üzeneteket (warning) bekapcsolja
- -Wall: még néhány fontos figyelmeztető üzenetet bekapcsol
- -s: a fölösleges részeket (pl. nyomkövetési információk és szimbólumok) eltávolítja kimenetből. Nélküle nagyobb lenne a kimenet.
- -O2: bekapcsolja a második szintű optimalizálást. (A harmadik szintű esetén már lassabban fordul, és túl nagy lehet a kód. Az első szintű esetén lassabb lesz a futó program, és esetleg túl nagy is. Vannak egyéb szintek is, például alapból a nulladik szint érvényes. Nem nulla, hanem nagy O betű van a kapcsolóban.)
- -lm: a matematikai függvényeket (pl. sqrt és cos) tartalmazó matematikai függvénykönyvtárat teszi elérhetőve. Emellett a forráskódban szerepelnie kell még az
#include <math.h>
-nak is a matematikai függvényekhez. Nem egyes, hanem kis l betű van a kapcsolóban. - -o <program>: a kimeneti futtatható fájl nevét adja meg
- <program>.c: bemeneti forrásfájl nevét adja meg
Egy C program elemei
Függvények
A hello.c programunk kódja meglepően hosszú. Mit jelentenek a sorai? Az
int main(void)
vagy
int main()
vagy
main()
sor minden C programban kötelező, minden programban van egy main nevű függvény, és ennek meghívásával indul a program végrehajtása. Ha 0 a visszatérési értéke, akkor a program normálisan lefutott -- ez jelzés a külvilágnak. Ezt jelzi a return 0; parancs. Az
#include <stdio.h>
sorral azt jelezzük, hogy a ,,standard input-output" függvények valamelyikét használni szeretnénk (itt pl. printf, azaz formázott kiírás).
Változók és típusaik
A következő programban aritmetikai számítást is végzünk:
#include <stdio.h> int main(void) { int n; n = 5; printf("az eredmeny: %d\n", 3*n + 1); return 0; }
Itt változót deklarálunk, azaz megadtuk típusát (lehet pl. int, float, double, char, void,....), majd értéket adunk neki. Ez egy sorban is elvégezhető:
int n = 5;
A kiírásban az idézőjelbe tett szöveg mellett a kiírandó kifejezés értékének formátumát is megadjuk: %d az egész számok kiírását jelenti. Következzen a standard bemenet egyszerű használata, olvassunk be az 'a' és 'b' nevű változóba egy-egy egész számot, és ezzel számoljunk (kód: muveletek.c). A műveletek: összeadás (+), kivonás (-), szorzás (*), egész osztás (/), maradékképzés (%), bitenkénti és (&), bitenkénti vagy (|), logikai és (&&), logikai vagy (||), ahol 0 a hamis, minden más igaz.
#include <stdio.h> int main(void) { int a,b; printf("kerek egy pozitiv szamot: "); scanf("%d", &a); printf("kerek meg egy pozitiv szamot: "); scanf("%d", &b); printf("a ket szam osszege: %d\n", a+b); printf("a ket szam kulonbsege: %d\n", a-b); printf("a ket szam szorzata: %d\n", a*b); printf("a ket szam egesz hanyadosa: %d\n", a/b); printf("az osztasi maradek: %d\n", a%b); printf("a ket szam lebegopontos hanyadosa:%f\n", (float)a/b); printf("bitenkenti ES %d\n" ,a&b); printf("bitenkenti VAGY %d\n", a|b); printf("logikai ES %d\n" ,a&&b); printf("logikai VAGY %d\n", a||b); return 0; }
A beolvasásnál nem 'a', hanem '&a' szerepel, ami az 'a' változó fizikai címét jelenti, erre később visszatérünk.
Vezérlő struktúrák
És akkor következzen egy program, amiről nem is tudjuk, hogy véges időben leáll-e minden bemenetre, a Collatz-probléma collatz.c:
#include <stdio.h> int main(void) { int x; printf("legyen x = "); scanf("%d", &x); while (x>1) { if (x % 2) x = 3*x + 1; else x /= 2; printf("%d ", x); } printf("\n"); return 0; }
Ebben szerepel egy elöl tesztelős while ciklus és egy elágazás!
Felsoroljuk a C vezérlőstruktúráit, hogy mindjárt egyszerűbb programokat írhassunk:
- if és if-else:
if (feltétel) { ... }
vagy
if (feltétel) { ... } else { ... }
vagy több feltétel esetén (itt is elhagyható az utolsó "else" ág)
if (feltétel1) { ... } else if (feltétel2) { ... } ... else if (feltételN) { ... } else { ... }
- while-ciklusok:
- hátultesztelős
do { ... } while (feltétel);
- elöltesztelős
while (feltétel) { ... }
- for-ciklus:
for (inicializálás; feltétel; végén) { ... }
A for ciklus az inicializálás-ban megadott parancsokat végrehajtja, majd minden ciklus elején ellenőrzi a feltétel-t, és kilép, ha az hamis, végül minden ciklus végén végrehajtja a végén utasításait. Például
int i; for (i=1; i<6; i++) { printf("%d ", i^2); }
kiírja 1-től 5-ig a számok négyzeteit.
A C program formázása
A sor elején levő szóközök számára vonatkozó beljebb kezdési szabály (sokféle változata lehetséges, itt csak a tárgy keretében használatosat értelmezzük):
- Beljebb kezdésre csak szóközöket használjunk, tabulátort nem.
- A nyitó és a záró kapcsost is írjuk külön sorba, és azonos oszlopban legyenek. (Ha esetleg a nyitó kapcsos a sor végére kerülne, a záró kapcsos elé pontosan annyi szóköz kerüljön, ahány szóköz volt a hozzá tartozó nyitó kapcsos zárójelet tartalmazó sor elején.)
- Minden egyéb sor elején pontosan négyszer (esetleg pontosan kétszer) annyi szóköz van, ahány (bezáratlan) kapcsos zárójelen belül van az adott sor.
További segítséget jelentenek a megjegyzések, ezeket /* és */ közé kell zárni, egy szokásos alkalmazásuk:
/* megjegyzés
* megjegyzés
* megjegyzés
*/
Egy másik elterjedt szabvány szerint // után írva adhatjuk meg a megjegyzést, mely a sor végéig tart.
A C programok olvashatóvá tétele sokat segít a kód későbbi megértésében, erre vonatkozó tanácsokat érdemes betartani. Egy ilyen leírás pl. itt található: http://www.gidnetwork.com/b-38.html Érdemes lesz később is visszatérni rá, és követni.
A kódban van némi lazaságra lehetőség, pl. nem kiírni main típusát, mert az úgyis kötelezően int, vagy nem visszaadni a 0 értéket, de ezekkel legyünk óvatosak.
#include <stdio.h> main() { printf("Hello, World!\n"); }
A behúzás sem része a szintaktikának, a kód folyamatosan is írható, vagy más logika szerint tördelhető, de ezt sose tegyük:
#include <stdio.h> int main(){printf("Hello, World!\n");return(0);}
Egy szándékosan elrettentő példa mistery.c
#include <stdio.h> main(t,_,a) char *a; {return!0<t?t<3?main(-79,-13,a+main(-87,1-_, main(-86, 0, a+1 )+a)):1,t<_?main(t+1, _, a ):3,main ( -94, -27+t, a )&&t == 2 ?_<13 ?main ( 2, _+1, "%s %d %d\n" ):9:16:t<0?t<-72?main(_, t,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l,+,/n{n+\ ,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/\ +k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){n\ l]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#\ n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \ ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;\ #'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/") :t<-50?_==*a ?putchar(a[31]):main(-65,_,a+1):main((*a == '/')+t,_,a\ +1 ):0<t?main ( 2, 2 , "%s"):*a=='/'||main(0,main(-61,*a, "!ek;dc \ i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);}