Expliquer les résultats de ce programme C

Trouvé ce code à C Puzzles .

#include int main() { int a=1; switch(a) { int b=20; case 1: printf("b is %d\n",b); break; default:printf("b is %d\n",b); break; } return 0; } 

Sortie:

  b is 51 

Je n’arrive pas à comprendre cette sortie ..

Vous utilisez une variable avec une valeur indéterminée ( invoquant un comportement indéfini ) en sautant au-delà de l’initialisation de la variable b . Le programme peut produire n’importe quelle valeur et ce sera correct.

La norme C couvre même ce cas (dans un exemple non normatif).

ISO / IEC 9899: 2011 §6.8.4.2 La déclaration de switch :

7 EXEMPLE Dans le fragment de programme artificiel

 switch (expr) { int i = 4; f(i); case 0: i = 17; /* falls through into default code */ default: printf("%d\n", i); } 

l’object dont l’identifiant est i existe avec une durée de stockage automatique (dans le bloc) mais n’est jamais initialisé. Ainsi, si l’expression de contrôle a une valeur différente de zéro, l’appel de la fonction printf accédera à une valeur indéterminée. De même, l’appel de la fonction f est inaccessible.

Notez le commentaire ‘valeur indéterminée’.


Il y a matière à discussion quant à savoir si l’access à une valeur indéterminée entraîne un comportement indéfini. Dans certaines circonstances (représentations d’interruption), cela peut conduire à un comportement indéfini. Il me faudra un certain temps pour déterminer si un «comportement éventuellement indéfini» doit être considéré comme un «comportement indéfini». L’access à une variable non initialisée est une mauvaise idée et vous ne pouvez rien dire à propos de la valeur imprimée dans votre code.

b n’est pas en cours d’initialisation. Mettez-le en dehors de l’instruction switch.

 #include int main() { int a = 1; switch(a) { int b=20; printf("This gets called!\n"); case 1: printf("b is %d\n",b); break; default: printf("b is %d\n",b); break; } return 0; } 

La clé ici est que int b=20; ne se fait jamais appeler. Le compilateur créera la variable b mais celle-ci ne sera jamais initialisée.

À l’intérieur de l’ switch statement rien ne sera accepté, comme l’ assigning values to the variable et l’ printing except inside case . si vous voulez que la valeur b l’assigne en dehors du commutateur. De plus, la valeur b doit ressembler à la valeur de garbage, elle ne peut pas être modifiée tant que vous n’atsortingbuez pas de valeurs à cet emplacement.