Perché C è assolutamente fiducioso nel programmatore e gli consente di fare un sacco di cose tra cui quelle stupide: int *x = NULL; x[4] = 12;
verrà compilato senza errori e anche senza avvisi da molti compilatori.
Più precisamente, const
è solo una promessa che il programmatore fa che la variabile non debba essere modificata e che il compilatore possa considerarlo costante se è in grado di aiutare le ottimizzazioni. Ma compilatore non potrà mai far rispettare tutte le regole fase di esecuzione per proibire per modificare un valore const:
const a = 1;
int *ix = (int *) &a;
*ix = 2;
printf("a=%d\n", a); /* UB : could print 1 or 2 */
verrà compilato senza un avvertimento. Ma invocherà un comportamento indefinito perché hai modificato un oggetto dichiarato come const.
Credo che non sia possibile inizializzare le variabili const semplicemente perché l'attuale specifica C non lo impedisce! Nelle precedenti versioni, l'inizializzazione è sempre facoltativa. Forse le versioni future potrebbero forzare l'inizializzazione per le variabili automatiche
In ogni caso, una variabile const globale o statica viene infatti automaticamente inizializzata (per le specifiche del linguaggio C 6.7.9 10): Se un oggetto con durata di memorizzazione statica o di thread non è inizializzato in modo esplicito , quindi: ... se ha un tipo aritmetico, viene inizializzato su zero (positivo o senza segno); ...
Così static const a;
è perfettamente valido come è const a
se a
è globale e in quelli caso a=0
.
fonte
2015-06-23 14:47:56
** Nota del moderatore **: utilizzare i commenti per richiedere chiarimenti/discutere la domanda posta. Grazie. –