
この記事はかなり昔に執筆されており、誤りを含む場合があります。
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が定義されてないよ~と警告が出るけれど、とりあえず実行可。 よ~く、よ~く、コードと出力結果を見比べて見て下さい (・_ ・)ジーッ ソースコードと出力結果(画面表示)が全く同じになっていますよね!! いや~~、面白いです^^;) これを考えるのは、プログラマーのボケ防止(頭の体操)に効果がありそうな気がします。 追記 (新しいバージョンを発見)
C言語クイズ3 へ続きます。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);}}

