C言語の激難クイズ2です。
これは、プログラミング言語(C言語)の動作・言語仕様に対する、とてつもなく深い理解がないと解けません^^;)
問題
「ソースコード」と「出力結果(画面表示)」が、全く同じになるC言語プログラムを答えましょう。
※ コンパイラによる警告は出てもOKですが、実行ファイルを生成できないと駄目です。
解答
↓のコードを実行すると・・・
#define X(x) #x
char x[]=X(main(){puts(X(#define X(x) #x));printf(X(char x[]=X(%s);%s),x,x);});main(){puts(X(#define X(x) #x));printf(X(char x[]=X(%s);%s),x,x);}
こんな結果が表示されます^^;)
(クリックで拡大)
※ VC++2005では、putsとprintfが定義されてないよ~と警告が出るけれど、とりあえず実行可。
もう1つ、解答の別バージョン。
↓のコードを実行すると・・・
int main(){char c='"',*text="int main(){char c='%c',*text=%c%s%c;printf(text,c,c,text,c);return 0;}";printf(text,c,c,text,c);return 0;}
こんな結果が表示されます^^;)
(クリックで拡大)
※ VC++2005では、printfが定義されてないよ~と警告が出るけれど、とりあえず実行可。
よ~く、よ~く、コードと出力結果を見比べて見て下さい (・_ ・)ジーッ
ソースコードと出力結果(画面表示)が全く同じになっていますよね!!
いや~~、面白いです^^;)
これを考えるのは、プログラマーのボケ防止(頭の体操)に効果がありそうな気がします。
追記 (新しいバージョンを発見)
int a[]={0,41,60,-1},*b=a,*c=a;char q[]="int a[]={0,41,60,-1},*b=a,*c=a;char q[]=\0#include <stdio.h>\0main(){for(;*b!=-1;b++){printf(q+*b);for(*c||putchar(34);-1<*c;c++){printf(q+*c);putchar(92);putchar(48);}*b||putchar(34)&putchar(59); putchar(10);}}\0";
#include <stdio.h>
main(){for(;*b!=-1;b++){printf(q+*b);for(*c||putchar(34);-1<*c;c++){printf(q+*c);putchar(92);putchar(48);}*b||putchar(34)&putchar(59);putchar(10);}}
C言語クイズ3 へ続きます。