C には do while ループがあり、pascal の (ほぼ) 相当するものは repeat until ループですが、この 2 つには小さな違いがあります。どちらの構造も少なくとも 1 回反復し、ループを再度実行する必要があるかどうかを確認します。最後に、パスカルでは、ループを終了するために満たす必要がある条件を記述します (REPEAT UNTIL something)。C では、ループを続行するために満たす必要がある条件を記述します (DO WHILE something)。この違いには何か理由があるのでしょうか、それとも恣意的な判断なのでしょうか?
9 に答える
基本的な違いはまったくなく、どちらにも利点はありません。それは単なる「シンタックス シュガー」です。言語の構文を変更しただけで、実際の動作はまったく変わりません。「repeat until」の方が概念化しやすいと考える人もいれば、「repeat while」の方が簡単だと考える人もいます。
C で「まで」が必要な状況に遭遇した場合は、いつでも条件を否定できます。
do {
excitingThings();
} while ( !endOfTheWorld() );
Cのステートメント
while(some_condition);
「何もしない」ループであるか、「do ... while」ループから切り離されている可能性があります。
do {
statement;
statement;
statement;
lots more statements;
}
while(some_condition);
別のキーワード (until) を使用すると、このような誤解を避けることができます。
誰もがすべてのコンパイラ警告をオンにして注意を払うようになった最近では、そのような問題はありませんね。それでも、ほとんどのベテラン C プログラマーは、いつかは C がこの場合「until」を使用することを望んでいたのではないかと思います。
Pascalの設計は、EdsgerDijkstraの画期的な作品であるADiscipline of Programmingを含む、1960年代の構造化プログラミングの仕事によって部分的に動機付けられました。ダイクストラ(有害であると考えたのと同じ人goto
)は、構築によって正しいプログラムを作成するための方法を発明しました。これらのメソッドには、ループの終了時に確立された事後条件に焦点を当てたループを作成するためのメソッドが含まれます。フォームを作成する際にrepeat... until
、Wirthはダイクストラに触発されて、コード内でその補完ではなく終了条件を明示的にしました。
私は常にSmalltalkやIconのような、2つの構文形式を提供する言語を賞賛してきました。これにより、プログラマーは、簡単に見落とされがちな補数演算子に頼ることなく、意図を明確に表現できます。(アイコンではフォームwhile e1 do e2
はとuntil e1 do e2
です。Smalltalkではフォームはとです。)私の観点からはblock1 whileTrue: block2
、block1 whileFalse: block2
CもPascalも完全に構築された直交設計ではありません。
歴史的な影響についてはよくわかりませんが、s やs と同様に、コードを実行するにif
は条件が真である必要があるという意味で、C の方が一貫性があると思います。while
do while
Pascal の repeat/until ループの動作と C の do/while ループの動作を関連付ける「決定」は、意図的でも恣意的でもありませんでした。これらは、まったく無関係な 2 つの問題です。
それはただの恣意的な決定です。一部の言語には両方があります。QBASIC/VB DO...LOOPステートメントは、pretest/posttest と WHILE/UNTIL の 4 つの組み合わせすべてをサポートします。
私は常に UNTIL ループが後方にあることを発見しましたが、それは私が C のバックグラウンドを持っているためかもしれません。両方を提供する Perl のような最新の言語がありますが、一方が他方より優れているという特別な利点はありません。
C 構文には、追加のキーワードは必要ありません。
C では、2 つのキーワードdo
とwhile
が 2 種類のループに対して機能します。Pascal には、、、、およびの4 つのキーワードが必要while
です。do
repeat
until