standard Como o programa abaixo gera `C89` quando compilado no modo C89 e` C99` quando compilado no modo C99?




inline function c example (3)

Encontrei este programa C na Web:

#include <stdio.h>

int main(){

    printf("C%d\n",(int)(90-(-4.5//**/
    -4.5)));

    return 0;
}

O interessante deste programa é que, quando é compilado e executado no modo C89, ele imprime C89 e quando é compilado e executado no modo C99, imprime C99 . Mas não sou capaz de descobrir como esse programa funciona.

Você pode explicar como o segundo argumento do printf funciona no programa acima?


o comentário de linha // é introduzido desde C99. Portanto, seu código é igual a isso em C89

#include <stdio.h>

int main(){

    printf("C%d\n",(int)(90-(-4.5/
-4.5)));

    return 0;
}
/* 90 - (-4.5 / -4.5) = 89 */

e igual a isso em C99

#include <stdio.h>

int main(){

    printf("C%d\n",(int)(90-(-4.5
-4.5)));

    return 0;
}
/* 90 - (-4.5 - 4.5) = 99*/

O C99 permite comentários no estilo // , o C89 não. Então, para traduzir:

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

Como os comentários // existem apenas nos padrões C99 e posteriores, o código é equivalente ao seguinte:

#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;
}

O código correto seria:

#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;
}




c89