Pourquoi le compilateur permet-il d’initialiser une variable avec lui-même?

Je trace enfin un bug de typo, qui ressemble au code suivant. Mais le compilateur ne devrait-il pas détecter cela (par les options par défaut)?

#include  int main() { int c = c; return printf("%d\n", c); } $ gcc --version gcc (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3 

Je ne vois pas pourquoi il ne comstackrait pas. La définition est antérieure à l’initialisation. Bien sûr, cette initialisation est inutile, cependant, il n’y a aucune raison pour que cela ne fonctionne pas du sharepoint vue des compilateurs.

C n’a pas les mêmes types de protection que les langages plus modernes comme C #. Le compilateur C # indiquerait à tort que vous utilisez une variable non affectée. C s’en moque. Cela ne vous protégera pas de vous-même.

Il est parfaitement légitime d’utiliser une variable dans son propre initialiseur. Considérons une liste chaînée:

 #include  struct node { struct node *prev, *next; int value; }; int main() { struct node l[] = {{0, l + 1, 42}, {l, l + 2, 5}, {l, 0, 99}}; for (struct node *n = l; n; n = n->next) printf("%d\n", n->value); return 0; } 

En général, diagnostiquer quand une valeur est utilisée non initialisée est un problème difficile; bien que certains compilateurs puissent le détecter dans certains cas, il n’a aucun sens de le demander.

Si

 int c; c = c; 

va comstackr, je ne vois pas pourquoi int c = c; ne pas comstackr.