IOCCCコード解析その4

こんちわ〜最近どうしても猫1匹分やせたいと思っております。お腹に猫が張り付いているようで、そいつを絶対に取ってやろうと思っているんですが何か良いダイエット方法ないですかね。
・1987年「Best One Liner」受賞作品(korn.c)

	main() { printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
なぜ先頭にタブがあるのか?疑問だがこの際気にしないでおこう。Best One Linerだけあって素晴らしいですね。このままでは私の頭で解析するのは不可能なのできちんとしてみた。
main() {
printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);
}
何かを表示している。なんだ?ってまあ既にコンパイルして実行しているから「unix」と表示される事は知っているんだよね。なぜ「unix」と表示されるのか、最初見たときわけわからなかったけどね〜そうそうこのコードは、「エキスパートCプログラミング」にも掲載されている。正直、この本のヒントがなければ解けなかったよ。「#define unix 1」これが最大級のヒントですよ。ちなみに凄く不思議なんですけど、上記ソースコード、define がなくても動くんですよね。何でだよ。まあ〜そこはカットしよう。
printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);
まずは〜 &unix["\021%six\012\0"] ですね

& 1["\021%six\012\0"]
\021 ===> これは〜asciiコードより制御コード「DC1」多分ね、これはね、かつて利用されていたテレタイプって装置に出力せよって制御コードだと思う。現在では意味なし
\012 ===> これは改行のこと
\0 ===> これは終端コード
で何を表しているかと言うと
& 1["\021%six\012\0"] ===> & "\021%six\012\0"[1] と言う事で、先頭「\021」を飛ばした次のアドレスを指し示しているって事だ。

次〜
(unix)["have"]+"fun"-0x60
===> 1["have"]+"fun"-0x60 ===> "have"[1]+fun-0x60

なんですけどね。最初は「0x60」はasciiコードで何を表すかな〜と思っていた。「`」を表すようだけど意味がわからないよね。で "have"[1] に注目。これは文字「a」を指し示している。「a」はasciiコードで表すと 0x61 なんですよ。そうすると、0x61+"fun"-0x60 ===> "fun"+0x01 となります。

で〜 "fun"+0x01 が何を表しているかと言うと"fun"の先頭から+1をしたアドレス。つまり〜「u」を表しています。

最終的に
printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);
===> printf("%six\012\0", "un")
となり、良く見ている形になりました。いや〜勉強になりますよ。では