这个挑战的概念非常简单。您要做的就是编写一个可以同时作为有效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++ stinks
编译时和在C中编译时输出。
说明:
造成语言差异的是
tr()
函数。它利用了C和C ++之间的区别之一,特别是如何处理char文字。在C中,它们被视为整数,因此sizeof('!')
返回4,而在C ++中则为1。该((...+1)&1)
部分只是简单的按位运算的一部分,如果sizeof('!')
返回4,则返回1,如果返回1,则返回0。结果数乘以数组中的整数t
,然后最终将乘积添加到要转换的特定字符中。在C ++中,乘积始终为零,因此字符串C++ rules!
保持不变。在C中,乘积将始终是中的值t
,因此字符串更改为C++ stinks
。