web-dev-qa-db-fra.com

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

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?

124
Spikatrix

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 */
132
Paul Rubel

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*/
25
ikh

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;
}
9
Lundin