このチャレンジのコンセプトは非常にシンプルです。あなたがしなければならないのは、有効な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 ++の違いの1つ、特にcharリテラルの処理方法を利用します。Cでは、整数として扱われるためsizeof('!')
、C ++の1ではなく4を返します。この((...+1)&1)
部分はsizeof('!')
、4を返す場合は1を返し、1を返す場合は0を返す単純なビット演算の一部にすぎません。その結果の数値に配列内のintが乗算され、t
最終的に変換される特定の文字にその積が追加されます。C ++では、製品は常にゼロになるため、文字列C++ rules!
は変更されません。Cでは、製品は常にの値になるt
ため、文字列はに変わりますC++ stinks
。