이 도전의 개념은 매우 간단합니다. 유효한 C와 유효한 C ++로 컴파일 할 프로그램을 작성하기 만하면됩니다! 글쎄, 몇 가지 캐치가 있습니다. 프로그램은 각 언어로 컴파일 될 때 다르게 작동해야합니다. "다르게 동작하는"것으로 간주 되려면 프로그램마다 언어마다 다른 출력이 있어야합니다.
규칙
- 프로그램은 유효한 C 및 C ++ 여야합니다.
- 프로그램은 컴파일 된 언어에 따라 다른 출력을 가져야합니다.
#ifdef __cplusplus
또는 다른 "쉬운"전 처리기 트릭은 권장하지 않습니다! (하지만 다른 전 처리기 작업은 완벽합니다.)- 프로그램이 다른 것을한다는 것을 완전히 명백하게 보이도록하지 마십시오.
이것은 인기 경연 대회 이므로 가장 흥미롭고 놀라운 솔루션을 가진 사람이 승리합니다. 즐기세요!
예:
나는 이것이 #ifdef
속임수 로도 가능한지 확인하기 위해 내 자신의 프로그램을 만들었습니다 .
#include <stdio.h>
#include <string.h>
char *m="C++ rules!";
int t[11]={0,0,0,0,1,-1,-3,9,-8,82,0};
char tr(char c,int i)
{
return c+((sizeof('!')+1)&1)*t[i];
}
int main()
{
int i = 0;
for(;i<strlen(m);i++)
{
printf("%c",tr(m[i],i));
}
printf("\n");
return 0;
}
이 프로그램 C++ rules!
은 C ++로 컴파일되고 C로 컴파일 될 때 출력 됩니다 C++ stinks
.
설명:
언어의 차이를 일으키는 것은
tr()
기능입니다. C와 C ++의 차이점 중 하나, 특히 문자 리터럴을 처리하는 방법을 활용합니다. C에서는 정수로 취급되므로sizeof('!')
C ++에서는 1이 아니라 4를 반환합니다. 이((...+1)&1)
부분은 간단한 비트 단위 연산 의 일부일뿐입니다.sizeof('!')
4를 반환 하면 1을 반환하고 1을 반환하면 0을 반환합니다. 결과 숫자에 배열의 정수를 곱한 다음 결과적t
으로 변환되는 특정 문자에 곱이 추가됩니다. C ++에서 제품은 항상 0이므로 문자열C++ rules!
은 변경되지 않습니다. C에서 제품은 항상의 값t
이므로 문자열은로 바뀝니다C++ stinks
.