아래 프로그램은 C89 모드에서 컴파일 할 때`C89`를, C99 모드에서 컴파일 할 때`C99`를 어떻게 출력합니까?


128

웹 에서이 C 프로그램을 찾았습니다.

#include <stdio.h>

int main(){

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

    return 0;
}

이 프로그램의 흥미로운 점은 C89 모드에서 컴파일되어 실행될 C89때 인쇄 되고 C99 모드에서 컴파일되고 실행될 때 인쇄 C99됩니다. 그러나이 프로그램이 어떻게 작동하는지 알 수 없습니다.

printf위의 프로그램에서 두 번째 주장이 어떻게 작동 하는지 설명 할 수 있습니까 ?


47
힌트 : C ++ 스타일 //주석은 C99에 도입되었습니다.
Paul R

4
좋은 속임수이지만 실패합니다 gcc. 없이 std=c99당신이 경고를 얻을 것이다, 당신이 그것을 무시하면 gcc됩니다 여전히 를 해석 //주석의 시작으로 (아 - 당신이 사용해야합니다 -pedantic. 물론 나는 기본적으로 그 수 있습니다.)
usr2564301

3
@Jongware 글쎄, gcc 4.9.2에서 C89명시 적으로 얻었다 std=c89.
ikh

60
C99 지원을 테스트하는 방법을 찾는 동안 누군가가 이것을 발견하는 경우를 대비하여; 댓글 트릭이 #if __STDC_VERSION__ >= 199901L아닌 과 같은 것을 사용하십시오 //. =)
Arkku 2016 년

10
또한 C11에 대한 "C99"를 인쇄합니다.
Lundin

답변:


133

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

25

라인 주석은 //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*/

9

때문에 //의견은 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;
}

답변에 1 개씩 오류가 발생하면 89를 인쇄해야 할 때 어떻게 90을 얻습니까?
Pimgd 2016 년

1
@Pimgd C89와 C90도 같은 것입니다. stackoverflow.com/questions/17206568/…
Lundin 2016 년

3
그것들은 같은 것을 의미하지만 같은 문자열이 아닙니다. 내 원래 질문에 의해 서.
Pimgd 2016 년

@Pimgd 위 코드의 목적은 주어진 형식 이후에 문자열을 인쇄하기 위해 인공 작업을 처리하는 것이 아닙니다. 목적은 IOCCC 외부의 실제 응용 프로그램이 프로그램이 컴파일 된 C 버전을 인쇄하는 방법을 설명하는 것 입니다. C90은 "C89"또는 "ANSI-C"보다 사용하기에 더 정확합니다.
Lundin 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.