1

末尾再帰は、 gotoと同じ効果を実行します。つまり、lang C では、whilegotoが Scheme の末尾再帰の役割を置き換えます。設計者がgotowhileの両方の実装を C で保持することに決めた理由は何ですか? 実際の場面で「goto」を使う人はほとんどいないと思います。

gotowhileが、C が再帰的に書くことによって反復を実装できないという欠点を補うものである場合、それらは同じ特別な構造にあるのでしょうか? - 通常の再帰を避けるため。(Scheme で 'cond' が 'if' と異なるのと同じように) この問題は、両方の単語を保持する理由に関連していますか?

4

1 に答える 1

5

末尾再帰は の代わりにはなりませんgoto。テールコールは、ファーストクラスの関数もある場合です(Cにはどちらもありません)。

設計者が goto と while の両方を C で実装することに決めた理由は何ですか?

がなければwhile(そしてfor、程度はやや劣りますが)、構造化プログラミングを適切に行うことはできませんgotogoto組み込みの制御フローコンストラクターがないいくつかのパターンをより明確かつ効率的に表現できるため、(少なくとも C のコンテキストでは)持つことは依然として有用です。たとえば、可能性のあるすべての終了点でクリーンアップを繰り返すよりも、関数の終了時に簡単で信頼性の高いクリーンアップが得られます。

もし C がスキームのようなマクロを持っていたなら、おそらく 1 つのプリミティブ だけで十分に機能し、すべてのループ構造がマクロとしてgoto上に構築されていました。gotoしかし、C にはそのようなマクロがありません。これには正当な理由があります (あまり正当でない理由もあります)。

于 2013-11-10T17:35:44.227 に答える