通常、unix ライクなシステムでコンパイルされた場合にのみ、「unix」と出力する必要があると思います。
これは、そのようなシステムでunix
は、 がの値を持つ定義済みマクロ1
であるためです。
そのため、次のように翻訳されます。
main() { printf(&1["\021%six\012\0"], (1)["have"]+"fun"-0x60); }
int[array]
ナンセンスを処分するために再注文すると、次のようになります。
main() { printf(&"\021%six\012\0"[1], "have"[1] + "fun"-0x60); }
はスキップされているので無視し\021
て (単に に置き換えます?
)、 を に変換\012
でき\n
ます。
main() { printf(&"?%six\n\0"[1], 'a' + "fun" - 0x60); }
main() { printf( "%six\n", 0x61 + "fun" - 0x60); }
これにより、次のことが得られます。
main() { printf("%six\n", "un"); }
注:途中で (特に 2 番目の部分) 再解決していましたが、最初に見たとき、説明を理解するために 2 つのヒントが必要でした。
unix
意味1
int[array]
コンパイラが受け入れる実際の表記です。