J'ai trouvé ce programme C sur le Web:
#include <stdio.h>
int main(){
printf("C%d\n",(int)(90-(-4.5//**/
-4.5)));
return 0;
}
La chose intéressante avec ce programme est que lorsqu'il est compilé et exécuté en mode C89, il affiche C89
et lorsqu'il est compilé et exécuté en mode C99, il affiche C99
. Mais je ne suis pas en mesure de comprendre comment ce programme fonctionne.
Pouvez-vous expliquer comment fonctionne le deuxième argument de printf
dans le programme ci-dessus?
C99 autorise les commentaires de style //
, Pas C89. Donc, 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 à cela en C89
#include <stdio.h>
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 <stdio.h>
int main(){
printf("C%d\n",(int)(90-(-4.5
-4.5)));
return 0;
}
/* 90 - (-4.5 - 4.5) = 99*/
Car //
les commentaires existent uniquement dans les normes C99 et ultérieures, le code est équivalent à ce qui suit:
#include <stdio.h>
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 <stdio.h>
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;
}