TOP >> マニアックなプログラミング
トリッキーコードネット トリッキーなコード

【C言語クイズ2:激難】ソースコードと同じ文字列を出力

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);}
こんな結果が表示されます^^;) C言語クイズ:ソースコードと画面表示が同じ (クリックで拡大) ※ 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;}
こんな結果が表示されます^^;) C言語クイズ:ソースコードと画面表示が同じ (クリックで拡大) ※ 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 へ続きます。
トリッキーコードネット の TOPへ HOTNEWS の 総合TOPへ