Enrere Mòdul 2
Fonaments de Programació. Llenguatge C/C++---
Pràctica  Resum teòric Exercicis
Pràctica d'ampliació

 
Variables locals i globals

En aquesta pràctica coneixerem dos dels tipus de variables que existeixen en C/C++ pel que fa a l'àmbit d'existència: les variables globals o extern i les variables locals o auto.

 

Desenvolupament de la pràctica

Creeu un nou arxiu del tipus C++ anomenat m2p09.cc i escriviu el següent codi:

//m2p09.cc - Variables locals i globals  -

#include <stdio.h>

void funcio(int);

int ga;        //variable global no inicialitzada
int gb=2;      //variable global inicialitzada
int g=5;       //variable global inicialitzada

int main(){

    int la;        //variable local no inicialitzada
    int lb=2;      //variable local inicialitzada
    int g;         //variable local (amb el mateix nom
               //que una variable global

    g=10;

    printf("valor de la variable global ga: %d\n",ga);
    printf("valor de la variable global gb: %d\n",gb);
    printf("valor de la variable local la: %d\n",la);
    printf("valor de la variable local lb: %d\n",lb);
    printf("valor de la variable local g: %d\n",g);
    printf("valor de la variable global g: %d\n",::g);

    funcio(lb);    //crida a una funció

    printf("valor de la variable local la: %d\n",la);
    printf("valor de la variable local g: %d\n",g);
    printf("valor de la variable global g: %d\n",::g);

    return 0;

}

 

void funcio(int a){

   int lc;        //variable local 
   int g;         //variable local amb el mateix nom
               //que una global i que altra local
   int la;        //variable local amb el mateix nom que 
               //altre local de la funció main

   lc=14;g=15;la=16;

   printf("\n\n\n");
   printf("FUN:valor de la variable local lc: %d\n",lc);
   printf("FUN:valor del paràmetre formal a: %d\n",a);
   printf("FUN:valor de la variable local g: %d\n",g);
   printf("FUN:valor de la variable global g: %d\n",::g);
   printf("FUN:valor de la variable local la: %d\n",la);
   printf("\n\n\n");

}

Captura de l'execució del programa.

 

Explicació del programa

Aquest programa conté una funció anomenada funcio(). La seva declaració es fa al començament i conté els tipus de la funció i del seu argument:

 
void funcio(int);

La funció és del tipus void, això vol dir que no retornarà cap valor. Una crida a aquesta funció només executarà les sentències de la seva definició entre les quals hi ha sentències d'assignació a variables globals.

La definició de la funció és la següent:

 

void funcio(int a){

    int lc;        //variable local única
    int g;         //variable local amb el mateix nom
                   //que una global i que altra local
    int la;        //variable local amb el mateix nom que 
                   //altre local

    lc=14;g=15;la=16;

    printf("\n\n\n");
    printf("FUN:valor de la variable local lc: %d\n",lc);
    printf("FUN:valor del paràmetre formal a: %d\n",a);
   
printf("FUN:valor de la variable local g: %d\n",g);
    printf("FUN:valor de la variable global g: %d\n",::g);
    printf("FUN:valor de la variable local la: %d\n",la);
    printf("\n\n\n");

}

a és el nom del seu paràmetre formal i és del tipus int. A més d'aquest paràmetre formal, la funció defineix tres variables locals més: lc, g, i la. Després de la sentència d'assignació:

 

lc=14;g=15;la=16;

les variables contindran aquests valors.

Les sentències printf() imprimiran els següents valors:

lc -> 14
a->2  (ja que la crida a la funció es fa amb funcio(lb) i el valor de lb era 2. Aquest valor 2 és assignat a la variable local a.)
g->15 (encara que g tingui el valor 5 com a variable global i el valor 10 com a variable local de la funció main())
::g->5 (l'operador :: és propi del llenguatge C++ i s'anomena resolució d'àmbit. Permet recuperar una variable global que ha estat ocultada per una variable local amb el mateix nom)
la->16 (el valor assignat dintre de la funció. Aquesta assignació no ultrapassa l'àmbit de la funció)

Una vegada executada la funció funcio() el programa retorna a la funció que l'ha cridat, en aquest cas a la funció main(). Una nova sentència amb la funció printf() ens demostra que l'assignació de la variable la no s'ha conservat. El valor de la variable la és un valor sense sentit ja que les variables locals que no s'inicialitzen contenen valors aleatoris.

En el programa es pot comprovar que les inicialitzacions de les variables globals i locals es poden fer en el mateix moment de la seva declaració. Si una variable global no és inicialitzada s'inicialitza automàticament a 0. Al contrari, si una variable local no és inicialitzada, conté inicialment un valor arbitrari. El compilador ens avisa si s'utilitza una variable local que no ha estat inicialitzada.