ハビエルは、私の以前の回答 (ワーズワースを引用したもの) に対して興味深いコメントをしました。
while(true){} は while(condition){} よりも「純粋な」構造だと思います。
300文字で十分に答えられませんでした(ごめんなさい!)
私は教育とメンタリングにおいて、「複雑さ」を「この 1 行または式を理解できるようにするために頭の中に必要な残りのコードの量はどれくらいか」と非公式に定義しました。覚えておかなければならないことが多ければ多いほど、コードは複雑になります。コードが明示的に教えてくれるほど、複雑さが軽減されます。
したがって、複雑さを軽減するという目標を掲げて、純粋さではなく完全性と強さの観点からハビエルに返信させてください。
このコードフラグメントについて考えます:
while (c1) {
// p1
a1;
// p2
...
// pz
az;
}
2 つのことを同時に表現する場合:
c1
(全体の) 本体はtrue である限り繰り返されます。
a1
が実行されるポイント 1 では、保持c1
が保証されます。
違いは視点の 1 つです。a1
これらの最初のものは、一般的にループ全体の外側の動的な動作に関係していますが、2 つ目は、特に考えているときに信頼できる内側の静的な保証を理解するのに役立ちます。もちろん、 の正味の効果はa1
を無効c1
にする可能性があり、ポイント 2 で何を当てにできるかについてより真剣に考える必要があります。
条件と最初のアクションについて考えるために、特定の (小さな) 例を配置してみましょう。
while (index < length(someString)) {
// p1
char c = someString.charAt(index++);
// p2
...
}
「外側」の問題は、ループが に配置さsomeString
れている限り実行できる何かを明らかに実行していることです。これにより、終了が最終的に発生するように、体のいずれかまたは内部 (場所と方法は、体を調べるまではわかりません) を変更するという期待が設定されます。それは、身体について考えるための文脈と期待の両方を私に与えてくれます。index
someString
index
someString
「内部」の問題は、ポイント 1 に続くアクションが正当であることが保証されていることです。そのため、ポイント 2 のコードを読みながら、合法的に取得されたことがわかっているchar 値で何が行われているかを考えることができます。(条件 if が null ref であることを評価することさえできませんsomeString
が、この例のコンテキストではそれを回避していると仮定しています!)
対照的に、次の形式のループ:
while (true) {
// p1
a1;
// p2
...
}
両方の問題について私を失望させます。外側のレベルでは、このループが永遠に繰り返されることを本当に期待すべきなのか (オペレーティング システムのメイン イベント ディスパッチ ループなど)、それとも何か他のことが起こっているのか疑問に思っています。これは、本文を読むための明示的な文脈も、(不確実な) 終了に向けた進歩を構成するものについての期待も与えません。
内部レベルでは、ポイント 1 で成立する可能性のある状況について、明示的な保証はまったくありませんtrue
。条件は、もちろんどこでも真ですが、プログラムの任意の時点で知ることができることに関する最も弱いステートメントです。アクションの前提条件を理解することは、アクションが何を達成するかを考えようとするときに非常に貴重な情報です!
したがって、このwhile (true) ...
イディオムは、上で説明した論理よりもはるかに不完全で弱いため、より複雑であるとwhile (c1) ...
思います。