next up previous contents
Elõre: Még egyszer a deklarációkról Fel: További magyarázatok Vissza: További magyarázatok

A balérték és jobbérték fogalma

Egy tárterület-foglaló tárolási egységre vonatkozó kifejezést balértéknek (angolul lvalue) nevezzünk. Ez nyilvánvalóan konstansokat, változókat és dinamikusan lefoglalt memóriaterületeket jelent. (A konstansok olyan tárterület-foglaló egységek, amelyeknek nincs azonosítójuk.)

Szorosabb értelemben véve a balérték egy olyan tárolási egységre vonatkozó kifejezés, amelynek érték adható. Nyilvánvalóan balérték egy megfelelõ típusú és tárolási osztályú változó azonosítója.

Vannak olyan operátorok, amelyek eredményül balértéket szolgáltatnak. Például ha E egy tárterület-foglaló tárolási egységre mutató pointer típusú kifejezés, akkor *E egy olyan változó, amire E mutat.

A balérték elnevezés az értékadó operátorral kapcsolatos: az E1 = E2 típusú értékadó mûveletek bal oldalán álló E1 operandus balérték kell legyen. Röviden úgy is fogalmazhatunk, hogy minden olyan kifejezés, amelynek érték adható, balérték. Minden olyan kifejezést, amit értékül adhatunk, jobbértéknek (angolul rvalue-nak) nevezünk. A fentiek alapján persze az is nyilvánvaló, hogy nem minden balérték szerepelhet értékadás baloldalán (lásd a konstansokat). Tekintsük az alábbi definiciókat:

            char buffer[256];
            char *chptr, ch1;
            const char xchar = 'x';
                    
            char *get_buff_pos(int i);
            {
              if (i < 0 || i > 255) 
              {
                 return &ch1;       
              }   
              else   
              {
                 return buffer+i;
              }             
            }
A fenti definiciók szerint helyes értékadások lehetnek az alábbiak:
            chptr = get_buff_pos(12); /* &buffer[12] lesz */
            ch1 = xchar;
            *get_buff_pos(1) = 'b';
A fenti értékadásokban szereplõ balérték kifejezések rendre chptr, ch1, *get_buff_pos(1). Az elsõ két példa triviális: mindkét esetben egyszerû váltózóról van szó, melyeknek minden további nélkül érték adható. A harmadik példa azt mutatja be, hogy használhatjuk ki azt, hogy egyes operátorok balértéket képeznek. A függvények visszatérési értéke a C-ben nem használható fel balértékként (ezen változtat majd a C++-ban az ún. referencia típusú visszatérési érték - lásd a 2.1.2-es részt), de az indirekció oerátorral, a *-gal a get_buff_pos függvény karakterre mutató pointer típusú visszatérési értékébõl azonnal egy tényleges változót - a buffer tömb 1. indexû elemét - állítjuk elõ, amely már természetesen felhasználható balértékként.

Felmerülhet az a kérdés, hogy xchar miért nem szerepelt a fenti értékadó utasítások közt baloldalon. Nos azért, mert ezt a "változó"-t a const módosító szóval definiáltuk, és mint már említettük, az így definiált tárolási egységeket konstansnak tekinti a fordító, azaz értékük módosítását nem teszi lehetõvé, bár maga az xchar kifejezés balérték.


next up previous contents
Elõre: Még egyszer a deklarációkról Fel: További magyarázatok Vissza: További magyarázatok