Comment le programme ci-dessous génère-t-il C89 lorsqu’il est compilé en mode C89 et C99 en mode C99?

J’ai trouvé ce programme C sur le web:

#include  int main(){ printf("C%d\n",(int)(90-(-4.5//**/ -4.5))); return 0; } 

Ce qui est intéressant avec ce programme, c’est que quand il est compilé et exécuté en mode C89, il imprime C89 et quand il est compilé et exécuté en mode C99, il imprime C99 . Mais je ne suis pas capable de comprendre comment ce programme fonctionne.

Pouvez-vous expliquer comment le second argument de printf fonctionne dans le programme ci-dessus?

C99 autorise les commentaires de type // , mais pas C89. Alors, pour traduire:

C99:

  printf("C%d\n",(int)(90-(-4.5 /*Some comment stuff*/ -4.5))); // Outputs: 99 

C89:

 printf("C%d\n",(int)(90-(-4.5/ -4.5))); /* so we get 90-1 or 89 */ 

le commentaire de ligne // est introduit depuis C99. Par conséquent, votre code est égal à ceci dans C89

 #include  int main(){ printf("C%d\n",(int)(90-(-4.5/ -4.5))); return 0; } /* 90 - (-4.5 / -4.5) = 89 */ 

et égal à cela en C99

 #include  int main(){ printf("C%d\n",(int)(90-(-4.5 -4.5))); return 0; } /* 90 - (-4.5 - 4.5) = 99*/ 

Étant donné que // commentaires existent uniquement dans C99 et les normes ultérieures, le code est équivalent à ce qui suit:

 #include  int main (void) { int vers; #if __STDC_VERSION__ >= 201112L vers = 99; // oops #elif __STDC_VERSION__ >= 199901L vers = 99; #else vers = 90; #endif printf("C%d", vers); return 0; } 

Le code correct serait:

 #include  int main (void) { int vers; #if __STDC_VERSION__ >= 201112L vers = 11; #elif __STDC_VERSION__ >= 199901L vers = 99; #else vers = 90; #endif printf("C%d", vers); return 0; }