これは、それ自体を出力する最小のコードです。しかし、これがどのように機能するかを理解できません。誰か説明できますか?
main(a){printf(a,34,a="main(a){printf(a,34,a=%c%s%c,34);}",34);}
モデルが ILP64 (64 ビットint
s) でない限り、64 ビット プラットフォームでは動作しないに違いありませint
んchar*
。
コードのコピーから文字列自体を除いたものを含む変数a
を宣言し、printf() の書式設定コードを使用してコードと文字列の両方を出力します。詳細が必要ですか?
これらのコードはクワインコードと呼ばれます。コンピューター言語は、この機能を固定点までサポートします。ウィキペディアによると
関数の固定点 (不変点とも呼ばれる固定点と短縮されることもあります) は、関数によってそれ自体にマップされる関数の定義域の要素です。
f(f(...f(c)...)) = fn(c) = c
は、たとえば c が何らかの定数であることを意味 します
f(x) = x^2 - 3 x + 4,
then 2 is a fixed point of f, because f(2) = 2
main(a){printf(a,34,a="main(a){printf(a,34,a=%c%s%c,34);}",34);}
に書き換えることができます
main(a) {
a = "main(a){printf(a,34,a=%c%s%c,34);}";
printf(a, 34, a, 34);
}
これら 2 つのバージョンは同等ではありませんが、2 番目のバージョンを使用して、最初のバージョンで何が行われているかを理解できます。