Didaxis
lecție · Informatică

Domeniul variabilelor

Variabile locale, globale și vizibilitate.

Se face în:
Clasa a IX-a
Clasa a X-a
Clasa a XI-a
Actualizat la: 30 octombrie 2026
1pe scurtstratul 1 din 3 · rezumatul lecției

Pe scurt

O variabilă locală aparține unei funcții: este folosită în interiorul ei. O variabilă globală este definită în afara funcțiilor. În Python, blocurile if și for nu creează un domeniu local nou; funcția îl creează. Dacă vrem să atribuim dintr-o funcție unei variabile globale, o declarăm global în acea funcție.

x = 2
def calcul():
    y = 3
    return x + y
print(calcul())  # 5

Funcția citește globala x și creează locala y; y nu este accesibilă după apel.

Desen la lecția „Domeniul variabilelor”
2în detaliustratul 2 din 3 · pentru clasă și Bacalaureat

În detaliu

O variabilă locală este declarată într-un subprogram sau într-un bloc și este vizibilă numai acolo, de la declarație până la sfârșitul blocului; este creată la fiecare apel și dispare la ieșire. O variabilă globală este declarată în afara oricărui subprogram și este vizibilă în tot programul, de la declarație încolo; în C++ ea este inițializată implicit cu 0. Domeniul unui nume se caută de la blocul cel mai interior spre cele exterioare: o declarație locală cu același nume ascunde variabila globală cât timp blocul este activ. În C++, variabila globală ascunsă se poate accesa prin operatorul ::, de exemplu ::x. O variabilă locală declarată static este creată o singură dată și își păstrează valoarea între apeluri, deși numele ei rămâne vizibil numai în subprogram. Python are domenii de funcție, nu de bloc: blocurile if și for nu creează un domeniu nou, iar o funcție care atribuie o valoare unei variabile globale trebuie să o declare global.

Exemplul 1 — ascunderea unei variabile globale.

#include <iostream>
using namespace std;
int x = 2;
void afiseaza() {
    int x = 5;
    cout << x;
}
int main() {
    afiseaza();
    cout << x;
    return 0;
}

Se afișează 52. În afiseaza, căutarea numelui x găsește întâi declarația locală int x = 5, deci prima afișare scrie 5. Funcția s-a încheiat, variabila locală nu mai există, iar în main numele x desemnează variabila globală, cu valoarea 2. Dacă apelul ar fi repetat, fiecare apel ar crea un nou x cu valoarea 5. Cu ::x în interiorul funcției s-ar fi afișat 2.

Exemplul 2 — variabila static. O funcție care numără apelurile ei folosește o variabilă statică:

#include <iostream>
using namespace std;
int apel() {
    static int c = 0;
    c++;
    return c;
}
int main() {
    int a = apel();
    int b = apel();
    cout << a << b << apel();
    return 0;
}

Programul afișează 123: variabila c este inițializată cu 0 numai la primul apel și își păstrează valoarea între apeluri, deci cele trei apeluri întorc 1, 2 și 3. Dacă c ar fi o variabilă locală obișnuită, ar fi creată din nou la fiecare apel și toate apelurile ar întoarce 1, deci s-ar afișa 111.

Exemplul 3 — Python. O funcție poate citi o variabilă globală, dar fără declarația global o atribuire creează o variabilă locală nouă.

x = 2
def calcul():
    y = 3
    return x + y
print(calcul())

Funcția citește globala x și creează locala y; rezultatul este 5, iar y nu este accesibilă după apel. Dacă în funcție ar apărea x = 10 fără global x, valoarea lui x din afara funcției ar rămâne 2.

Exemplul 4 — parametrii sunt variabile locale. Un parametru transmis prin valoare este o copie, deci este o variabilă locală a funcției; unul transmis prin referință este alt nume pentru variabila de la apel.

#include <iostream>
using namespace std;
void f(int a, int &b) {
    a++;
    b++;
}
int main() {
    int x = 1, y = 1;
    f(x, y);
    cout << x << y;
    return 0;
}

Se afișează 12: a este o copie, deci incrementarea ei nu schimbă x, iar b este chiar y, deci y devine 2.

Exemplul 5 — variabila de ciclu. O variabilă declarată în antetul unui for există numai în acel ciclu. Dacă înaintea lui avem int i = 7;, ciclul for (int i = 0; i < 2; i++) {} folosește propriul i, iar după ciclu cout << i; afișează tot 7. Mai reține valorile inițiale: o variabilă globală începe cu 0, dar una locală obișnuită, neinițializată, are o valoare nedeterminată și nu trebuie citită înainte de prima atribuire.

3pentru admiterestratul 3 din 3 · pentru examene

Pentru admitere

La apeluri repetate, o variabilă locală automată obișnuită este creată din nou la fiecare apel. O variabilă locală declarată static păstrează valoarea între apeluri; nu o confunda cu una globală, deoarece domeniul numelui rămâne local. Identifică întâi declarația asociată fiecărei apariții a numelui: începe de la blocul în care apare numele și urcă spre blocurile exterioare.

Exemplu în formatul examenului. Ce se afișează în urma executării programului de mai jos?

#include <iostream>
using namespace std;
int x = 10;
void f() {
    x = x + 1;
    int x = 5;
    x = x + 1;
    cout << x << ' ';
}
int main() {
    f();
    f();
    cout << x;
    return 0;
}
  • a) 6 6 10
  • b) 6 6 12
  • c) 6 7 12
  • d) 11 12 12

Răspunsul corect este b). În f, prima instrucțiune se referă încă la variabila globală, pentru că declarația locală int x = 5 apare mai târziu: globala crește de la 10 la 11 la primul apel și la 12 la al doilea. Apoi apare variabila locală x = 5, care ascunde globala; ea devine 6 și este afișată. Variabila locală este creată din nou la fiecare apel, deci ambele apeluri afișează 6. În main, x desemnează globala, cu valoarea 12. Varianta a) uită că globala a fost modificată, iar varianta c) tratează locala ca și cum și-ar păstra valoarea.

Al doilea exemplu rezolvat. Se execută programul

#include <iostream>
using namespace std;
int s = 0;
void adauga(int n) { s += n; }
int main() {
    int s = 100;
    adauga(5);
    adauga(7);
    cout << s << ' ' << ::s;
    return 0;
}

În adauga nu există altă declarație a lui s, deci funcția modifică globala: ea devine 5, apoi 12. În main, s desemnează variabila locală, care rămâne 100, iar ::s este globala. Se afișează 100 12. Greșeala tipică este să crezi că apelurile au modificat locala din main și să răspunzi 112 12.

Greșeli frecvente

  • Greșit: o variabilă locală obișnuită își păstrează valoarea între două apeluri.
    Corect: este creată din nou la fiecare apel; își păstrează valoarea numai dacă este static.
  • Greșit: o variabilă locală cu același nume ca una globală modifică variabila globală.
    Corect: o ascunde, iar variabila globală rămâne neschimbată.
  • Greșit: în Python, blocurile if și for creează un domeniu local nou.
    Corect: domeniul local este creat doar de funcții.
în contul tăuPremium

Testează-te pe această lecție

Lecția o citești aici, fără cont. Testele pe lecții și capitole sunt în cont, cu grile originale Didaxis și explicația fiecăreia: gratuit 10 grile pe zi, fără limită cu Premium, 49 de lei pe lună pentru fiecare copil.

Înainte și după

Surse și referințe

Redactare proprie, conform programei:

  • OMEC 6930/2025, MO 4 bis/2026, Informatică CS, p. 1632–1633 și 1653–1654; OMEC 4370/2026, anexa 8, p. 155–156; rocnee.eu
  • OMEC 4370/2026, anexa 8, Informatică IX intensiv, p. 155–156
  • OMEC 6930/2025, MO 4 bis/2026, Informatică CS, p. 1632–1633; rocnee.eu
  • OMEC 6930/2025, anexa 66, Informatică IX CS militar, Monitorul Oficial nr. 4 bis/8.01.2026, pp. 2563–2578; cdn.edupedu.ro; centralizator oficial actualizat prin OMEC 3224/2026, legislatie.just.ro
  • OMEC 6930/2025, MO 4 bis/2026, Informatică CS, p. 1653–1654; rocnee.eu
  • OMECI 5099/2009, anexa 5, Informatică, p. 4–5, clasa X intensiv; rocnee.eu
  • OMECI 5099/2009, anexa 5, Informatică, p. 4–5, clasa XI; plan de încadrare: OMEC 7723/2024, anexa 2, tabelele 1–25, legislatie.just.ro; filiera tehnologică: OMEC 7724/2024, anexa 4, tabelul calificării, legislatie.just.ro
  • UNSTPB, Regulament admitere licență 2026, Anexa II-1.2 p. Anx II-14 și Anexa XI-3 p. Anx XI-6–7 (PDF p. 64, 120–121); admitere.pub.ro
  • OMECTS 4800/2010, anexa 2, Informatică, p. 3–4; edu.ro

Documente consultate

  • UNSTPB, admitere 2026, anexa XI-3, p. Anx XI-6–7
  • Programa școlară de informatică, clasa a XI-a (OMECI 5099/2009, anexa 5), CNCE; rocnee.eu
  • Programa școlară de informatică, clasa a IX-a, matematică-informatică (OMEC 6930/2025, anexa 42); rocnee.eu
  • Programa de bacalaureat la informatică, matematică-informatică (anexa 2 la OMECTS 4800/2010), Ministerul Educației, p. 4–5; edu.ro
  • Subiectele și baremele Bacalaureatului 2026; subiecte2026.edu.ro

Desene: Redactare proprie (desen original), conform Programa școlară de informatică, clasa a XI-a (OMECI 5099/2009, anexa 5), CNCE; rocnee.eu

lecțiile sunt gratuite

Ai citit lecția. Acum verifică-te.