[c] 아래 프로그램은 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위의 프로그램에서 두 번째 주장이 어떻게 작동 하는지 설명 할 수 있습니까 ?



답변

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


답변