6. Initializare
2019/02/27 in Programare in C
Adesea dorim ca unele variabile din program sa aiba valori initiale. Acest lucru este posibil si anume, variabilelor gobale li se pot da valori initiale la definirea lor, iar celelalte clase de variabile pot fi initializate la declararea lor.
6.1. Initializarea variabilelor simple
O variabila simpla poate fi initializata printr-o constructie de forma:
tip nume = expresie;
sau
static tip nume = expresie;
daca variabila este statica.
Prima forma corespunde variabilelor automatice sau globale.
Variabilelor globale sau statice li se atribuie valori initiale la compilare, deci ele au valorile respective la lansarea programului. Faptul ca aceste variabile se initializeaza la compilare, cere ca expresiile utilizate pentru initializare sa fie constante.
Variabilele automatice simple se initializeaza la executie, de fiecare data cand ele se aloca pe stiva, adica la apelul functiei care contine declaratiile lor. In acest caz, expresiile utilizate pentru initializare pot sa nu fie constante. Cu toate acestea, operanzii variabili ai unei astfel de expresii trebuie sa aiba valori definite in prealabil. In caz contrar, expresia de initializare nu poate fi evaluata in momentul in care se aloca pe stiva variabila automatica pe care o initializeaza.
Variabilele globale si statice neinitializate au in mod implicit valoarea zero. Acest lucru nu mai are loc in cazul variabilelor automatice.
O variabila automatica neinitializata are o valoare imprevizibila in momentul apelului functiei in al carui corp este declarata. Aceasta rezulta din faptul ca ea se aloca pe stiva si in lipsa expresiei de initializare in declaratia sa, ei nu i se atribuie nicio valoare. In felul acesta, valoarea ei ramane nedefinita pana in momentul in care i se atribuie o valoare printr-o instructiune de atribuire.
In toate cazurile se fac conversii daca tipul expresiei de initializare nu coincide cu tipul variabilei pe care o initializeaza.
Exemple:
1.
int n = 100;
- definitie de variabila globala;
- lui n i se atribuie valoarea 100;
- la lansarea programului n are valoarea 100.
2.
double x = 3;
- definitie de variabila globala;
- lui x i se atribuie valoarea 3 dupa care se converteste spre double;
- la lansarea programului x are valoarea 3.
3.
#define MAX 100
int i = MAX*2;
- i este variabila globala initializata cu valoarea 200;
- la lansarea programului i are valoarea 200.
4.
int k;
- definitie de variabila globala;
- la lansarea programului k are valoarea 0.
5.
static char c = 'a';
- declaratie de variabila statica;
- lui c i se atribuie codul ASCII al caracterului a (97);
- la lansarea programului c are valoarea 97.
6.
static int s;
- declaratie de variabila statica;
- la lansarea programului s are valoarea 0.
7.
static int p = 'a' + 1;
- declaratie de variabila statica;
- la lansarea programului p are ca valoare codul ASCII al caracterului b (97 + 1).
8.
tip f(int n)
{
int x = 123; /* (1) */
int a = x + n; /* (2) */
...
}
(1)
- declaratie de variabila automatica;
- la fiecare apel al functiei f, x se aloca pe stiva si i se atribuie valoarea 123.
(2)
- declaratie de variabila automatica;
- la fiecare apel al functiei f, a se aloca pe stiva si i se atribuie valoarea expresiei x + n;
- la intalnirea declaratiei ambii operanzi ai expresiei x + n sunt definiti.
Exercitiu:
6.1. Sa se scrie o functie care are ca parametri doi intregi x si y, calculeaza si returneaza numarul aranjamentelor de x obiecte luate cate y.
Functia de fata este analoga functiei definite in exercitiul 4.29.
- FUNCTIA082A.C - Aranjamente de x obiecte luate cate y
double aranjamente(int x, int y)
/* calculeaza si returneaza numarul aranjamentelor de x obiecte luate cate y */
{
double a = 1.0;
int i = x - y + 1;
if(x < 1 || x > 170)
return -1.0;
if(y < 1 || y > x)
return -1.0;
while(i < x)
a *= i++;
return a;
}
Observatie: Pentru a testa functia de fata se poate utiliza Programul082 de la exercitiul 4.30.