Как вызывается следующая программа `C89` при компиляции в режиме C89 и` C99` при компиляции в режиме C99?

Я нашел эту C-программу из Интернета:

#include <stdio.h>

int main(){

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

    return 0;
}

Интересной особенностью этой программы является то, что когда она компилируется и запускается в режиме C89, она печатает C89, а когда она компилируется и запускается в режиме C99, она печатает C99. Но я не могу понять, как работает эта программа.

Можете ли вы объяснить, как второй аргумент printf работает в вышеуказанной программе?

Ответы

Ответ 1

C99 допускает // -стильные комментарии, C89 - нет. Итак, перевести:

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

Ответ 2

комментарий строки // вводится с C99. Поэтому ваш код равен этому в C89

#include <stdio.h>

int main(){

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

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

и равна этому в C99

#include <stdio.h>

int main(){

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

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

Ответ 3

Поскольку комментарии // существуют только в стандартах C99 и более поздних версий, код эквивалентен следующему:

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

Правильный код:

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