웹 에서이 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;
}