Kihagyás

Egy kis ráadás...

Egy kis ráadás...

Miután megismertük a különböző vezérlési szerkezeteket, az előző fejezetekben azt láthattuk, milyen adattípusokkal rendelkezik a C nyelv, és hogyan tudunk mi magunk is saját típusokat létrehozni.

Sokszor azonban egyéb dolgok is kellhetnek, amik segítik egy program futását, amikkel azok működése, működtetése kényelmesebbé tehető, illetve amiknek ismerete elengethetetlen akkor, amikor programozunk egy adott nyelven. Ezeket próbáljuk összeszedni ebben a fejezetben.

Műveletek precedenciája

Számos műveletet megismertünk az eddigiek során. Bár a legtöbbször el is hangzott, azért nem árt, ha összegzésképp megnézzük, hogy ezek a műveletek hogyan viszonyulnak egymáshoz.

A műveletek precedenciája, illetve feldolgozási iránya (asszociativitása) megadja, hogy egy kifejezésen belül a műveletek kiértékelésének mi lesz a helyes sorrendje. Nyilván ezeknek az ismerete sokszor nélkülözhetetlen annak érdekében, hogy a kódunk valóban azt a tevékenységet végezze, ami a szándékunk volt.

A tanult műveleteket, kiértékelési irányukat és precedenciájukat az alábbi táblázatban foglaljuk össze:

Műveletek Asszociativitás C operátor
egyoperandusú postfix
elemkiválasztás
mezőkiválasztás
függvényhívás
\(\rightarrow\) x++, x--
[]
., ->
f()
egyoperandusú prefix
méret
típuskényszerítés
\(\leftarrow\) +, -, ++x,--x, !,~, &,*
sizeof
(type)
multiplikatív \(\rightarrow\) *,/, %
additív \(\rightarrow\) +,-
bitléptetés \(\rightarrow\) <<,>>
kisebb-nagyobb relációs \(\rightarrow\) <=, >=, <,>
egyenlő-nem egyenlő relációs \(\rightarrow\) ==, !=
bitenkénti 'és' \(\rightarrow\) &
bitenkénti 'kizáró vagy' \(\rightarrow\) ^
bitenkénti 'vagy' \(\rightarrow\) |
logikai 'és' \(\rightarrow\) &&
logikai 'vagy' \(\rightarrow\) ||
feltételes \(\leftarrow\) ?:
értékadó \(\leftarrow\) =, +=, -=, *=, /=, %=, >>=, <<=, &=,&=,^=,|=,
szekvencia \(\rightarrow\) ,

Parancssori argumentumok

A C nyelvet támogató környezetekben lehetőség van arra, hogy a végrehajtás megkezdésekor a programnak parancssori argumentumokat vagy paramétereket adjunk át. Ez sokszor megkönnyítheti a program kezelését, főleg akkor, ha a parancssorban minden olyan információt át tudunk adni, amit korábban csak a felhasználó által való interakció által tudom meg a program.
Amikor az operációs rendszer elindítja a programot, azaz meghívja a main függvényt, a hívásban két argumentum szerepelhet:

  • Az első (általában argc névre hallgat) azoknak a parancssori argumentumoknak a darabszáma, amelyekkel a programot meghívtuk.
  • A második argumentum (általában argv) egy mutató egy sztring tömbre, amely a parancssori argumentumokat tartalmazza. Egy karakterlánc egy argumentumnak felel meg.
    • Megállapodás szerint C-ben az argv[0] az a név, amellyel a programot hívták, így azargc értéke legalább 1.
    • Számíthatunk arra is, hogy argv[argc]==NULL
  • Mivel az argv egy mutatótömböt megcímző mutató, a main függvényt többféleképpen deklarálhatjuk.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#include <stdio.h>
int main(int argc, char **argv) {
/* vagy így is lehet az argv-t deklarálni
int main(int argc, char *argv[]) {
*/
    int i;
    printf("argc = %d\n\n", argc);
    for (i = 0; i < argc; ++i) {
        printf("argv[%d]: %s\n", i, argv[i]);
    }
    return 0;
}

Elmentve a fenti programot arg.c néven, fordítsuk le és futtassuk a következő módon:

Kimenet

$ gcc -o arg arg.c
$ ./arg alma korte szilva barack palinka
argc = 6
argv[0]: ./arg
argv[1]: alma
argv[2]: korte
argv[3]: szilva
argv[4]: barack
argv[5]: palinka