Как нижеприведенная программа выводит `C89 "при компиляции в режиме C89 и" C99 " при компиляции в режиме C99?


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

#include <stdio.h>

int main(){

    printf("C%dn",(int)(90-(-4.5//**/
    -4.5)));

    return 0;
}

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

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

3 123

3 ответа:

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

комментарий к строке // вводится с 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*/

, потому что // комментарии существуют только в стандартах 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;
}