Mint a legtöbb programozási nyelv, a C képes névvel ellátott változók és azok tartalmának használatára és feldolgozására. A 'változók csak nevek, amelyek a memória egy helyére hivatkoznak - arra a helyre, amely azt az értéket tárolja, amire hivatkozunk.

Hasznos, ha úgy gondolunk a változókra, mint az értéket helyettesítő névre. Úgy gondolhatunk a változóra, mint ami egyenértékű a hozzá tartozó értékkel. Tehát, ha van egy i változó, amelyiket 4-es értékkel hoztunk létre (4-es értékkel inicializáltunk), abból következik, hogy az i+1 az 5 lesz.

Mivel a C viszonylag alacsony színtű programozási nyelv, mielőtt egy C program használni tud egy memóriaterületet egy változó tárolására, igényelni kell azt. Ezt a változó deklarálásával tehetjük meg. A változó deklarálása az a folyamat, amikor a C programnak megadjuk, hogy hány változó legyen, mi legyen a nevük és mekkora memóriaterületre van szükségük az egyes változóknak.

A C programozási nyelvben, amikor változókkal dolgozunk, fontos tudni a változó típusát és méretét. Mivel a C egy elég alacsony szintű nyelv, ezek hardver-specifikusak lehetnek - azaz, az hogy hogyan működik az egyik gépen, különbözhet attól, hogy hogyan működik egy másikon.

A C nyelv összes változóját csak a deklaráláskor megadott típus tárolására használhatjuk.

Deklarálás, inicializálás és értékadás

szerkesztés

Itt egy példa egy egész típusú változó deklarálására. Ezt a változót egy_szam néven fogjuk nevezni. (Fontos a sor végi pontosvessző; a fordító ilyen módon választja el egymástól a program egyes utasításait.)

int egy_szam;

Ez az utasítás azt jelenti, hogy az egy_szam nevű változó számára annyi helyet foglaltunk a memóriában, ami egy egész típus (integer) típusú változó tárolására elegendő. Fontos, hogy meg kell adni az adat típusát, amelyet a változó tárolni fog. Speciális kulcsszavak vannak a típusok megadására - ezt a következő fejezetben fogjuk látni.

Több változó is deklarálható egyetlen utasításban a következőképpen:

int egy_szam, masik_szam, megegy_szam;

Azt is megtehetjük, hogy deklaráljuk a változót és rögtön értéket adunk neki.

int egy_szam=3;

Ezt hívják initializálásnak.

A C korai verzióiban a változókat a blokkok elején kellett deklarálni. A C99-ben (a C 1999-es verziójában) megengedett a deklarálások és az egyéb utasítások keverése - de nem gyakran használják, mert ritkán szükséges, és néhány fordító még nem támogatja a C99-et.

Miután deklaráltunk egy változót, értéket adhatunk a változónak egy alábbihoz hasonló utasítással:

egy_szam=6;

Egy változónak akárhányszor értéket adhatunk, ezért is hívják változónak.

Egy változónak egy másik változó értékét is átadhatjuk:

  
egy_szam = masikszam;

Vagy több változónak ugyanazt az értéket adhatjuk egyetlen utasítással:

egy_szam = masikszam = megegyszam = 3;

Ez azért működik, mert az x = y értékadás a változóhoz rendelt értékkel tér vissza. Az x = y = z valójában egy rövidítése a x = (y = z) utasításnak.

Változók elnevezése

szerkesztés

A C-ben a változónevek betűkből (ékezet nélküli nagy- és kisbetűk) és számokból állnak. Az aláhúzás karakter ("_") is megengedett. A nevek nem kezdődhetnek számmal.

Alább látható pár érvényes változónév:

oszto
Nevek
URL
szemelyi_szam
_alma
_
JeloloBizottsag

Pár példa érvénytelen nevekre:

7szilvafa    (számmal kezdődik)
legnagyobb kozos oszto  (szóköz nem megengedett nevekben)
$koltseg    ($ nem megengedett -- csak betűk, számok és _)
while   (a nyelv kulcsszavai nem használhatóak változónévnek)

Ahogy az utolsó példa mutatja, bizonyos szavak le vannak foglalva a nyelv kulcsszavai számára, és ezeket nem használhatjuk változónévként. Ilyenek például az if és a for is. Érdemes betartani, hogy az aláhúzással kezdődő változóneveket nem használunk.

A C változóneveinek szabályai érvényesek egyéb nyelvi konstrukciók, mint a függvénynevek, struktúrák tag-jei és makrók esetén is; ezekről később lesz szó.

Literálisok

szerkesztés

Minden esetben, amikor a programban egy értéket közvetlenül adunk meg ahelyett, hogy egy változóra hivatkoznánk, vagy egyéb más módon, az értéket literálisnak nevezzük. A fenti inicializálási példában a 3 egy literális.

A négy alapvető adattípus

szerkesztés

A C szabványban négy alapvető adattípus van. Ezek az int, char, float és double.

Itt röviden leírjuk ezeket. Bővebben a C programozás/Típusok fejezetben lesz szó róluk.

Az int típus

szerkesztés

Az int típus egész számokat képes tárolni. Egy egész értéke tipikusan a számítógép szavának méretével egyezik, amely a legtöbb modern személyi számítógépben 32 bits (4 byte) vagy 64 bit (8 byte). A következők példák egész literálisokra: 1,2,3, 10, 100... Ha az int 32 bites, minden egész számot képes tárolni -2147483648 és 2147483647 között. Egy 32 bites szám 4294967296 (azaz ) lehetőséget képes tárolni.

Ha új egész változót szeretnénk használni, az int kulcsszót használjuk. Például:

int hallgatok_szama, i, j=5;

Ekkor három változót deklarálunk, továbbá a j-nek az 5 literális értéket adjuk.

A char típus

szerkesztés

A char típus képes tárolni a végrehajtás karakterkészletének bármelyik elemét. Olyan adatot tárol, mint az int, de tipikusan egy byte méretű. A legtöbb implementáció az ASCII karakterkészletet használja a végrehajtás karakterkészleteként.

Példák karakterliterálisokra 'a', 'b', '1', stb, valamint néhány speciális karakter, mint a '\0' (a null karakter) és '\n' (újsor, emlékezzünk a "Hello, Világ" példára). Vegyük észre, hogy a char értéknek egyszeres idézőjelben kell lenniük.

Egy példa az inicializálásra:

char betu1 = 'a';

A float típus

szerkesztés

A float a floating point, azaz lebegőpontos szám rövidítése. Valós számokat tud tárolni, de csak a egy gépi szó méretben. Ezért akkor használjuk, hogy nem szükséges a double által elérhető pontosság. A float literálisok végére F vagy f betűt kell írni, másképpen double-ként kerülnek értelmezésre. Példák: 3.1415926f, 4.0f, 6.022e+23f. A float változók a float kulcsszóval deklarálhatóak.

The double type

szerkesztés

A double és a float típusok nagyon hasonlóak, de a double kétszeres pontossággal képes tárolni a számokat – valós számokat, vagyis egész és tört számokat. Példák double literálisra 3.1415926535897932, 4.0, 6.022e+23. Az utolsó példa normálalakot használ, azaz 6,022·1023 értéket jelent. Ha 4-et használunk 4.0 helyett, azt egészként (int típusként) értelmezi a program.

A double változók a double kulcsszóval deklarálhatóak:

double ket_pi = 6.2883185307179586;

(Az angol változatnak itt még nincs vége. Az alábbi rész az angol változatban egy korábbi fejezetben található.)

Utasításblokkok és a változók hatáskörei

szerkesztés

Utasításblokkok

szerkesztés

Több utasítást elhelyezhetünk egy utasításblokkban. Ekkor az utasítások elé nyitó kapcsos zárójelet "{", utánuk záró kapcsos zárójelet "}" kell rakni. Általános szabály, hogy egy C programban ahol egy utasítás állhat, ott mindig lehet utasításblokk is. Erre általában akkor van szükség, ha egy ciklusmaghoz, a feltételes elágazás egyik ágához több utasítás tartozik.

Egy példát már láttunk utasításblokkra. A main függvény utasításait utasításblokkba helyeztük, ahogy a függvények esetén szükséges. Később a vezérlési szerkezetek fejezetben megismerjük a ciklusokat. Ezek gyakran egyetlen utasítást ismételgetnek majd:

for (i=0; i<20, i++)
  printf("Sokszor kiírom.\n");

Itt a ciklusmag egyetlen utasítása a printf függvény meghívása. Ha viszont a ciklusmagba több utasítás tartozik, akkor utasításblokkra van szükségünk. Ez nem csak for-ciklusnál működik: a kapcsos zárójel jelzi, hogy meddig tart a függvény definíciója, a ciklus magja, a feltételes elágazás valamelyik ága.

A következő példában egynél több utasítás tartozik a for-ciklushoz, ezért szükséges az utasítások blokkba (kapcsos zárójelek közé) zárása:

for (i=1; i<20, i++)
{
  printf("%d. alkalom", i) 
  printf("Sokszor kiírom.\n");
}

(A printf karakterláncában a %d helyére fog beíródni az i változó értéke. A kiíratásról a Kiíratás és beolvasás fejezetben lesz bővebben szó.)

Mindig fontos figyelni arra, hogy a kapcsos zárójelek párosan szerepeljenek: minden utasításblokk le legyen zárva.

A változók hatáskörei

szerkesztés

Értékeket változókban tárolhatunk. Ekkor először deklarálni kell a változót, azaz meg kell adni a típusát. Ezután értéket adhatunk a változónak, majd kiírathatjuk a printf utasítással:

#include <stdio.h>

int main(void)
{
  int i;
  i = 8;
  printf("%d\n", i);
}

Egy változó hatásköre azt a szintet jelzi, ahol a változó látható. Egy utasításblokkban deklarált változó csak az utasításblokkon belül lesz elérhető. Utasításblokk tartalmazhat újabb utasításblokkot is. A belső utasításblokkban deklarált változók a külsőben nem érhetőek el.

/* a main függvény */
int main(void)
{
    /* Ez a main függvény definíciójának a blokkja */

    int i; /* ezt a külső blokkban deklaráltuk */
    i = 6;
    {
        /* ez egy új blokk új hatókörrel */

        /* ez is egy i változó, de mivel egy új blokkban van,
           nem befolyásolja a külső blokk i változójának értékét. */
        int i;
        i = 5;
        printf("%d\n", i); /* 5-öt ír ki a képernyőre */
    }
    /* visszatértünk a külső blokkba */

    printf("%d\n", i); /* 6-ot ír ki a képernyőre */

    return 0;
}

A C-ben kétféle hatáskör van. Azt mondjuk, hogy egy változó globális, ha egy változó a program tetszőleges helyén látható és módosítható. Akkor mondjuk, hogy egy változó lokális ha csak abban a blokkban elérhető és módosítható a változó, amelyben létrehozták. Az alábbi példában a main függvényen kívül deklarált i és j változó globális lesz, a belül deklarált i változó lokális.

int i =  5; /* ez globális változó, a programban akárhol elérhető */
int j = 15; /* ez is */

/*
Ez egy függvény.
Az összes benne definiált változó lokális, csak a függvényben érhető el.
*/
int main(void)
{
    int i = 6; /* 'i' most 6 */
    printf("%d\n", i); /* kiírja a lokális 6-ot a globális i változó 5-ös értéke helyett */
    printf("%d\n", j); /* kiírja a 15-öt, a globális változó értékét */

    return 0;
}

(A példában a változók deklarálásakor rögtön kezdőértéket is adtunk neki.)