O privire atenta asupra variabilelor si constantelor
12In urmatorul articol voi prezenta cateva principii de baza in ceea ce priveste lucrul cu variabile si constante. Articolul este destinat incepatorilor si cuprinde exemple explicatii si fragmente sugestive de cod.
- Ce sunt variabilele ?
O variabila este o locatie de memorie. Ea este caracterizata prin numele sau si prin valoarea atribuita. Oricarei variabile ii corespunde un tip de date, acestea fiind prezentate aici.
Ne vom ocupa mai mult de studiul variabilelor, decat de tipurile acestora. Ca punct de pornire avem declararea:
tip nume_variabila ;
Unde tip este tipul variabilei, iar nume_variabila este numele pe care dorim sa-l atribuim variabilei. Exemplu:
int n;
Astfel am declarat o variabila care se numeste n si este de tip integer.
Atat in limbajul de programare C++ , cat si in C, declararea unei variabile se termina cu ; Â .
- De cate feluri sunt variabilele ?
Variabilele pot fi de 2 feluri:
- locale
- globale
Variabilele locale: sunt cunoscute si pot fi accesate numai de functia in interiorul caruia au fost declarate. Variabilele locale dintr-o functie nu au nicio legatura cu variabilele locale din alta functie, ele sunt create numai cand respectiva functie este apelata. Variabilele locale nu-si mentin valorile intre 2 apelari ale aceleiasi functii.
Variabilele globale: sunt declarate in exteriorul oricarei functii. Spre deosebire de variabilele locale, ele sunt initializate automat cu valoarea 0. Sunt recunoscute de orice functie si pot si utilizate ca-atare. Ele exista pe tot timpul executie programului.
Exemple:
Declaratie variabile locale:
int functie1( int n) { int a,b,c; ... }
Declaratie variabile globale :
void functie1 (void) { .... } int n,i,j; int main() { ........ return 0; }
- Atribuirea valorilor
Atribuirea valorilor unor variabile se poate face direct la declarare, sau in interiorul unei functii.
Direct la declarare:
int main() { int a=0,b=8,c=4; //a este 0, b este 8, c este 4 ..... return 0; }
Sau in interiorul unei functii:
int main() { int n,i; n=9; i=1; ... return 0; }
Numai cele mai banale programe nu utilizeaza variabile, asa ca este bine sa invatati cum se folosesc acestea. Cateva sfaturi:
- Obisnuiti-va sa initializati fiecare variabila, chiar si cu 0, daca nu declarati totul global.
- Nu faceti confuzia intre semnele  = si == . = inseamna „ia valoarea” , iar == inseamna egal. Sunt operatori diferiti !
- Eu declar de ceva timp totul global, este mai comod asa. 😀
Si acum sa ne uitam un pic peste constante …
- Ce sunt constantele ?
Constantele sunt valori fixe pe care le utilizam in program. Ca si variabilele, constantele sunt de diferite feluri.
De exemplu, pentru a specifica o constanta de tip char, trebuie sa-i punem valoare intre  ‘  ‘ . Daca vrem ca A sa fie atribuita constantei char ch facem astfel:  ch=’A’.
Constantele in virgula mobila trebuie sa includa punctul zecimal. Daca o constanta float nu are cifre in dreapta punctului zecimal, trebuie pus 0.
n=100.0 ; //ceea ce inseamna ca n are valoarea 100
Atentie! Limbajul C++, dar si C sunt CASE-SENSITIVE, adica fac diferenta dintre majuscule si minuscule. Ceea ce inseamna ca variabila max nu este aceeasi cu Max sau MAX.
Keep it simple, and programming ahead. 😉
Insa principala diferenta intre variabile si constante (dupa cum o zice si numele) este reprezentata de faptul ca variabilele isi pot schimba valoarea in timpul programului, in timp ce constantele nu. Iar pentru a „ajuta” compilatorul sa faca diferenta intre variabile si constante, la constante se pune si cuvantul „const” in fata. De exemplu: const int x = 4;
In cazul asta, daca incercam sa schimbam valoarea lui x, compilatorul o sa faca urat 😀 Avantajul constantelor este ca lucrul cu ele dureaza mult mai putin, dar acestea nu se pot citi sau modifica 🙂
Din cate stiam compilatorul va modifica oriunde intalneste constanta cu valoarea ei.Asta este motivul pentru care viteza lor este mai mare.
Asa stiam si eu, ca Andrew. 🙂
Nu-i bine?
De fapt, compilatorul nu inlocuieste o constanta cu valoarea ei. O constanta, in C++, nu este un define.
Pana la urma cel mai rapid mod de a declara o constanta este prin define, efectul fiind acelasi ca in cazul declararii unor constante.
„Eu declar de ceva timp totul global, este mai comod asa. :D”
Mai comod da, dar mai sanatos nu. Cu cat ai mai multe variabile globale cu atat timpul de executie am programului creste mai mult. Explicatia e simpla; variabilele globale sunt retinute pana la terminarea programului, pe cand cele locale doar pana la terminarea functiei.
Tin minte ca citisem o data un experiment pe infoarena,in care doar au schimbat tipul variabilelor(din globale in locale).Efectul a fost drastic,o imbunatatire aproape la jumatate a timpului. 😀
Exact, si de ex o variabila care se foloseste doar intr-o instructiune repetitiva sau un if, este mai bine sa fie declarata doar in cadrul acelei instructiuni (sunt multe chestii care desi par banale pot sa mareasca mult timpul de executie, motiv pentru care trebuiesc folosite corect inca de la inceput).
O variabile constanta este mult mai mult decat un define. Nu e doar un simplu substitut pentru un define.
Calificativul const, in C++, este folosit pentru a oferi suport de const-corectness.
Calificativul const nu se limiteaza doar la variabile constante. Poate fi, de exemplu, aplicat si functiilor membre intr-o clasa.
Folosirea unei variabile constante prezinta avantajul faptului ca se asigura suport si pentru type-safety, fata de un define.
Facilitatea de const-corectness in C++ are caracteristici logice. Asta inseamna ca compilatorul verifica doar faptul ca nu modifici variabila constanta in mod direct. Poti totusi sa o modifici indirect (de exemplu prin intermediul unui pointer), fara a obtine neaparat o eroare de compilare
Variabilele globale ar trebui sa fie evitate pe cat posibil, din motive evidente.
Din cate stiu eu e mai bine declararea variabilelor global. Cand declari o variabila in interiorul unei functii se creeaza o stiva pe memorie pt acea functie si dupa cum stim lucrul cu memoria e foarte incet 😐 si cred ca, cu cat e mai mica stiva, cu atat se creeaza/sterge mai repede
I may be wrong:D
@Adrian: Foarte bun commentul si este de retinut ce se intampla cu const si define.
@Leocrux: Din contra, lucrul cu varibilele alocate stiva este mult mai rapid decat lucrul cu variblele alocate pe heap (globale), capacitatea stivei este mult mai mica decat capacitatea heapului.
I said I may be wrong. 🙂
Nu e nici o problema,aici toti invatam! 😀
Eu in general declar totul global, insa in cazul in care rezolvi o problema de informatica si ai solutia eficienta a problemei nu va trebui sa`ti faci griji de alocarea variabilelor(atentie : in cele mai multe cazuri), insa daca solutia ta trebuie „sa traga” de puncte(in fond pentru asta luptam) atunci optimizarile trebuie sa fie pana in cel mai mic detaliu. 😀