Ce face const
O variabilă const primește valoarea la declarare și apoi nu mai poate fi schimbată. Dacă încerci, compilatorul dă eroare. Folosește const pentru valori fixe (TVA, număr maxim de elevi) și pentru parametrii pe care funcția doar îi citește.
La pointeri, poziția lui const contează: const int *p înseamnă „prin p nu modific valoarea” (pointer la constantă), iar int *const p înseamnă „p arată mereu spre aceeași adresă” (pointer constant). Citește de la dreapta la stânga: p este un pointer constant la int.
În C, o variabilă const nu este o constantă de compilare: nu o poți folosi ca dimensiune a unui tablou global sau într-un case. Pentru asta există #define, enum sau, din C23, constexpr.
Exemple
Exemplul 1: O constantă pentru TVA
TVA nu poate fi modificat după declarare. Prețul cu TVA se calculează din prețul fără TVA.
#include <stdio.h>
int main(void) {
const double TVA = 0.21;
double pret = 100.0;
printf("Preț cu TVA: %.2f lei\n", pret * (1 + TVA));
return 0;
}
Rezultat
Preț cu TVA: 121.00 lei
Exemplul 2: Ce se întâmplă dacă modifici o constantă
Codul nu se compilează. Mesajul de mai jos este cel dat de clang.
#include <stdio.h>
int main(void) {
const double TVA = 0.21;
TVA = 0.19;
printf("%.2f\n", TVA);
return 0;
}
Eroare de compilare (clang)
exemplu.c:5:9: error: cannot assign to variable 'TVA' with const-qualified type 'const double'
5 | TVA = 0.19;
| ~~~ ^
exemplu.c:4:18: note: variable 'TVA' declared const here
4 | const double TVA = 0.21;
| ~~~~~~~~~~~~~^~~~~~~~~~
1 error generated.
Exemplul 3: Parametru const: funcția promite că doar citește
const int *note spune că media nu modifică notele. Dacă ai scrie note[0] = 10; în funcție, compilarea ar eșua.
#include <stdio.h>
double media(const int *note, int n) {
int suma = 0;
for (int i = 0; i < n; i++) {
suma += note[i];
}
return (double)suma / n;
}
int main(void) {
int note_ana[] = {9, 10, 8, 9};
printf("Media Anei: %.2f\n", media(note_ana, 4));
return 0;
}
Rezultat
Media Anei: 9.00
Greșeli frecvente
- Încurci
const int *pcuint *const p. Primul te lasă să muți pointerul, dar nu să schimbi valoarea; al doilea invers. - Folosești o variabilă
const intca dimensiune la un tablou global sau încase. În C nu este constantă de compilare; foloseșteenum,#definesauconstexpr(C23). - Elimini
constcu un cast și modifici obiectul. Dacă obiectul a fost declaratconst, modificarea este comportament nedefinit.
Comenzi înrudite
constexpr: Declară o constantă cu valoare calculată la compilare, cu tip, care poate fi folosită ca dimensiune de tablou sau în static_assert.#define: Definește o macro: un nume pe care preprocesorul îl înlocuiește cu textul dat, înainte ca programul să fie compilat.Pointeri (& și *): O variabilă care păstrează adresa altei variabile; cu * citești sau modifici valoarea de la acea adresă.enum: Definește un set de constante întregi cu nume, de exemplu zilele săptămânii sau stările unei comenzi.