6. Initializare

2019/02/27 in Programare

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;

2.

double x = 3;

3.

#define MAX 100

int i = MAX*2;

4.

int k;

5.

static char c = 'a';

6.

static int s;

7.

static int p = 'a' + 1;

8.

tip f(int n)
{
  int x = 123; /* (1) */
  int a = x + n; /* (2) */
...
}

(1)

(2)

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.

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.

6.2. Initializarea tablourilor