const în C

Marchează o variabilă ca doar pentru citire: compilatorul oprește orice încercare de a o modifica.

Sintaxă
const tip nume = valoare;
const int *p;        // nu poți modifica *p
int *const p = &x;   // nu poți muta p
const int *const p;  // niciuna

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 *p cu int *const p. Primul te lasă să muți pointerul, dar nu să schimbi valoarea; al doilea invers.
  • Folosești o variabilă const int ca dimensiune la un tablou global sau în case. În C nu este constantă de compilare; folosește enum, #define sau constexpr (C23).
  • Elimini const cu un cast și modifici obiectul. Dacă obiectul a fost declarat const, 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.