De ce contează?
Imaginează-ți un dulap cu sertare. Fiecare sertar are o etichetă lipită pe el (varsta, scor) și în fiecare poți ține un singur lucru. Când vrei să schimbi conținutul, scoți ce era și pui altceva — eticheta rămâne aceeași. O variabilă este exact un astfel de sertar: un loc în memoria calculatorului, cu un nume, în care ții o valoare pe care o poți schimba oricând.
Intuiția
Un program lucrează cu date: un scor, o vârstă, un rezultat de calcul. Ca să le ții undeva și să le regăsești după nume, ceri calculatorului un sertar și îi lipești o etichetă. Tot ce faci de aici încolo — citești, calculezi, afișezi — trece prin aceste sertare. Programul nu „știe” numerele tale; le ține în cutii și le caută după etichetă.
Ce este
O variabilă este o zonă de memorie cu un nume (eticheta) și un tip (ce fel de valoare încape în ea). Trei acțiuni o definesc:
- Declarare — ceri o cutie de un anumit tip și îi dai un nume:
int varsta; - Inițializare — pui prima valoare în cutie:
int varsta = 17; - Atribuire (reatribuire) — înlocuiești ce era cu altceva:
varsta = 18;
Tipul (vezi lecția despre tipuri simple) decide cât de mare e cutia și ce încape: int ține numere întregi, double numere cu zecimale, char un singur caracter. Numele e cum o regăsești.
Semnul = din C++ NU înseamnă „egal” ca la matematică — înseamnă „pune valoarea din dreapta în cutia din stânga”. De aceea x = x + 1; pare absurd ca egalitate (un număr nu e egal cu el plus 1!), dar are sens perfect ca atribuire: ia ce e acum în x, adună 1, și pune rezultatul înapoi în aceeași cutie.
Cum arată
Hai să urmărim trei sertare în timp ce un program le modifică. La fiecare pas se schimbă o singură cutie; etichetele rămân pe loc.
Pornim cu trei variabile inițializate: a = 5, b = 3, suma = 0.
5 | 3 | 0 |
a | b | suma |
Executăm suma = a + b; — calculatorul citește a (5) și b (3), adună, și pune 8 în cutia suma. Doar suma se schimbă.
5 | 3 | 8 |
a | b | suma |
devine-8 |
Acum reatribuim: a = 10;. Vechea valoare 5 dispare din cutia a — nu se duce nicăieri, e pur și simplu suprascrisă.
10 | 3 | 8 |
a | b | suma |
5-suprascris-de-10 |
Observă pasul 3: suma rămâne 8, deși a a devenit 10. Atribuirea a copiat valoarea lui a în momentul calculului — variabilele nu sunt „legate” între ele. Dacă vrei suma actualizată, trebuie să o recalculezi explicit.
Implementare C++
#include <iostream>
using namespace std;
int main() {
// declarare + initializare: cerem cutiile si punem prima valoare
int a = 5;
int b = 3;
int suma = 0;
// atribuire: punem in suma rezultatul calculului
suma = a + b;
cout << suma << endl; // 8
// reatribuire: suprascriem vechea valoare din a
a = 10;
cout << a << endl; // 10
cout << suma << endl; // 8 - suma NU se recalculeaza singura
// tiparul "citeste-modifica-scrie": foloseste vechea valoare a cutiei
suma = suma + a; // 8 + 10
cout << suma << endl; // 18
return 0;
}Poți declara o variabilă fără s-o inițializezi (int x;), dar atunci cutia conține orice octeți erau deja acolo — de regulă o valoare absurdă. De aceea obiceiul sănătos este să inițializezi în momentul declarării.
Numele și unde „trăiește” variabila
Numele unei variabile trebuie să înceapă cu o literă sau _, poate conține litere, cifre și _, și e bine să fie descriptiv: nrElevi spune mult mai mult decât n2. Un nume bun este jumătate din documentația codului tău.
O variabilă „trăiește” în blocul { } în care a fost declarată — acesta e domeniul ei de vizibilitate (scope). În afara acelui bloc, eticheta nu mai există: cutia a fost desfăcută.
#include <iostream>
using namespace std;
int main() {
int scor = 10; // traieste in tot main
if (scor > 5) {
int bonus = 3; // traieste DOAR in acest if
scor = scor + bonus;
}
// aici "bonus" nu mai exista - ar da eroare de compilare
cout << scor << endl; // 13
return 0;
}Complexitate
Declararea, inițializarea, atribuirea și citirea unei variabile sunt operații elementare.
| Operație | Timp | Spațiu |
|---|---|---|
| Declarare / inițializare | O(1) | O(1) pe variabilă |
| Atribuire / citire | O(1) | O(1) |
Greșeala clasică: folosești o variabilă neinițializată, crezând că pornește de la 0.
int suma; // NU am pus nimic in cutie
for (int i = 1; i <= 5; i++)
suma = suma + i; // suma porneste de la GUNOI, nu de la 0
cout << suma; // rezultat impredictibilC++ NU pune automat 0 într-o variabilă locală — cutia conține octeții care erau deja acolo în memorie, deci o valoare arbitrară („gunoi”). Codul poate da 15 pe calculatorul tău și cu totul altceva la corectare. Regula de aur: inițializează mereu la declarare — int suma = 0;.