通常、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]コンパイラが受け入れる実際の表記です。