「break」を含む「while(true)」ループの用語は何ですか?[閉まっている]


24

次のようなC ++またはC#のループがあるとします。

while( true ) {
    doSomething();
    if( condition() ) {
        break;
    }
    doSomethingElse();
}

これは一般に「無限ループ」と呼ばれます。しかし、それは技術的に無限ではありません-制御が通過すると停止しbreakます。

そのようなループの用語は何ですか-それは「永遠にループ」ループ制御ステートメントと内部に「ブレーク」を持っていますか?


22
特別な用語はないと思います。
ChrisF

2
制御がブレークを通過するという保証はありますか?その例では、condition()常にfalseを返すとどうなりますか?条件付きブレークのある無限ループだと思います。
JohnL

1
がなくてもbreak、ループは無限ではありません(kill、ctrl-alt-del、unplug ...)。では、なぜ用語の詳細に煩わされるのでしょうか?
mouviciel

5
「用語は何ですか?」-「これは一般に無限ループと呼ばれます」。それがあなたの答えです。あなたは明らかにこの用語に満足していないが、それは(自然な)言語が記述的であるという事実を取り去らない。「Xの用語」は、人々が使用しているものであり、使用すべきものではありません。
MSalters

5
この質問は「名前を付ける」質問であるため、トピック外のようです。「その名前に名前を付ける」というのは、「このあいまいなテレビ番組、映画、または本をそのキャラクターやストーリーで識別する」という悪い理由と同じ理由で悪い質問です。他の人を助けないでください、そして、彼らを許可することは、他のタイプの周辺の質問をするドアを開きます。参照してくださいblog.stackoverflow.com/2012/02/lets-play-the-guessing-game
ブヨ

回答:


24

CSを研究して、この教授は事前チェックループwhile(cond) {})、事後チェックループdo {} while(cond);)、および中間チェックループがあることを教えてくれました。(私はこれを英語にひどく翻訳したかもしれないが、あなたはそのアイデアを得る。)

CおよびC ++には後者(ISTR Adaがあり、BICBW)がないため、CおよびC ++でその構造に使用されます。


1
はい、エイダはこれを持っています:loop ... exit when condition; ... end loop;
キーストンプソン

@キース:確認してくれてありがとう!私がAdaをやったのは20年近く後です。
sbi

1
それが価値があるのは、私が20年以上プロのプログラマーであり(そしてそれ以上の愛好家でもあります)、私はそれらの用語を聞いたことがありません。
offby1

翻訳に関して-「pre」と「post」を使用する場合、「inorder」は通常、「preorder / postorder / inorder tree traversal」のように適していると思います。
オーク

1
私が育った用語は「中間出口ループ」でした。いくつかの異なる言語で作業しており、終了中ループを明示的にサポートしています。
mjfgates

13

スタンフォードのCSでの最初のコース(Mehran Sahamiによるプログラミング方法論)はこれをループ半分と呼んでいます。そして、それは必ずしも悪いプログラミング習慣ではありません。ユーザー入力の収集に関する次の例を考えてください(エリック・ロバーツがThe Art and Science of Javaから引用、ロバーツはa-loop-and-a-halfとも呼んでいます):

prompt user and read in the first value
while (value != sentinel) {
    process the data value
    prompt user and read in a new value
}

そして、同じことがコードの重複を避けるためにループと半分のアイデアを使用して解決しました:

while (true) {
    prompt user and read in a value
    if (value == sentinel) break;
    process the data value
}

10

正式な名前がないため、Broken Loopと呼びます。ループの途中での中断はaのように少し不明瞭なので、この用語のあいまいさが意図されていgotoます。


後藤よりもはるかに悪いと思います。私はそのようなループで偽りに構築された条件よりもむしろむしろgotoを見たいと思っています。
ブライアンノブラウチ

14
@ブライアン何?「真の」条件はそれを明白にし、そのようなループは本当に一般的です。たとえば、ファイルのすべての行をリストに追加する場合、その行を読み取って(何かを実行)、失敗した場合は停止(条件ブレークの場合)、そうでない場合はリストに追加して繰り返し(何かを実行)する必要がありますその他)。
クレイグギドニー

7
ループの途中でブレークしても問題はありません。サイクルの各開始時に何らかの操作を実行する必要がある場合は、コードを複製するか、これらの操作を条件に詰め込む必要があります。どちらのバリアントにも明らかに欠点があります。gotoまたC.でブロック最後に有効なアプリケーション、試してみるの例えばエミュレーション...持っていた
マルコムを

1
Malcolm:考えられる問題は、コードの読み取り中に、いつ、なぜループが終了したかを確認するのが難しいことです。このようなループを2つ以上ネストし、内部ループで見つかった条件に基づいて外部ループから抜け出したい場合、追加の問題が発生します。
user281377

Xorgアプリケーションを駆動する(疑似コード:)のようなイベントループがあるwhile(XEventGet(&ev) != NULL){ ... }とします。当然、ループ内のキーをチェックする必要がありますif(ev.key == XK_q) break;。次のことを実行します:はwhile(XEventGet(&ev) != NULL && ev.key != XK_q){ ... }、見苦しく、間違いなく、ミッドループブレークよりも読みにくいです。さらに、値をチェックする前に、まずその値に対して何かを行う必要がある場合はどうなりますか?あなたは真剣にそれらすべてをループのベースケースに詰め込むつもりはありませんか?
ブレーデンベスト

8

決定的な名前はありません。無限ループは適切な用語だと思います。真に無限ループはありませんが、ブレークを含む分岐が発生しない可能性があるため、これは事実上無限になる可能性があります。

誰かに「無限ループを作成し、条件Xにブレークを使用する」と伝えると、その意味がわかります。誰かがあなたのコードをレビューしていて、「あなたが書いた無限ループが嫌いだ」としか言わないなら、彼らが何を話しているのかがわかります(もちろん、あなたが複数持っている場合を除きます)。


1
無限ループではありません。通常のwhileループと同様に終了条件が明確に定義されており、終了の証明方法はまったく同じです(単調に減少するメトリックを見つけることは素晴らしい出発点です)。
ドナルドフェローズ

8

条件が間違った場所にあるdo-whileループです。


2
ええ、書かれるべきです:while(keep_going){doSomething(); if(condition){keep_going = false; } else {doSomethingElse(); }}
スティーブングロス

10
だから...あなたは、あなたがコンピュータコースを教えていて、これを説明したいなら、あなたは言うだろうと言っているだろう「?それは名前というよりも宗教的な意見のようです。
ブライアンオークリー

5
@StephenGrossそのコードスニペットは恐ろしい提案です。リファクタリングは、ループ定義に実態を置くか、単に使用しますbreakcontinue。センチネルの値は絶対に避けてください。それらは精神的に追跡するための単なる別の任意の状態であり、コードの目的を隠しています。
イズカタ

2
センティナル値は遅延ゴトです。
ウィンストンイーバート

2
単一出口ウィニーである場合は-1。
ドナルドフェローズ

6

「無条件ジャンプ」に似た「無条件ループ」に投票します。何が起こっているか(コードが無条件にループする)を、嘘をつくことなく(「無限ループ」とは異なり)正確に示します。


1
ただし、終了条件はあります。そのif/ break中央はパターンの一部です。
ドナルドフェローズ

5

そのようなループの用語は何ですか-それは「永久にループ」ループ制御ステートメントと内部に「ブレーク」を持っていますか?

ブレーク条件を持つ無限ループ。

特別な名前を付けたい場合、無限部分ループと呼ぶことができるという点で、私はammilindに同意します。


1
無限ではありません。終了条件がチェックされるポイントは、別の場所にあります。
ドナルドフェローズ

5

Rosetta Codeでは、この特定のパターンは「Nプラス1/2」ループとして記述されます。それは私のお気に入りの用語ではありませんが、ひどいものではなく、明らかにある種のループに役立つパターンです。(代替手段は、条件の前のコードを複製することです-実際のプログラムでは潜在的にトリッキーです-ループ条件変数を追加しながら条件の後のコードの入れ子の深さを増やします。どちらもコードの保守性や理解可能性を改善しません。そのような構成を拒否する唯一の理由は、ループをbreak-freeにするように主張する場合だけです。)


4

標準的な用語はありませんが、私はそれを部分ループと言います

このループは、ループの一部を最後実行した後(つまり、部分実行)にのみブレークする場合に使用されます。ループ全体を中断するのに適した状況が見つからない場合に使用されます

この場合、少なくともdoSomething()最後に1回実行した後にループを解除する必要があります。


2

ここでsbiに同意する必要があります- 中間チェックのループ用語が好きです。この種の構造は、構造化プログラミングが開始され、多くの言語で構文がサポートされたときに一般的になりました。

そうは言っても、while不変式について推論するのは簡単であり、トリッキーな空のケースをよりよく処理することが多いため、ループは通常、より管理しやすいことが広く知られています。

あなたの特定のケースでは、ループは次と同等です

for(; doSomething(), !condition(); doSomethingElse()){}

そのため、複数のステートメントのbreakいずれかdoSomethingまたはdoSomethingElse複数が含まれる場合にのみバージョンを使用し、あなたのようにそれらを別々の関数に入れたくないです。

ただし、ループが(開始、チェック、増分)反復よりも複雑な場合は、ループをより単純なものにリファクタリングすることを検討する必要があります。


1

多分これについて用語を作ろうとするなら、

エスケープ可能なループ


-1。問題は名前を作ることではなく、共通名がすでに存在するかどうかです。さらに、すべてのループは「エスケープ可能」なので、特に効果的な名前ではありません。
ブライアンオークリー

@BryanOakley定義上、無限ループは壊れてはいけません。おそらく、不適切なプログラミング以外に、この用語はないはずです。
LarsTech


0

どんな場合でもそれほど悪くはありません。特定の種類のAPIでこの種のループを作成していることに気付きました。たとえば、ループオブジェクトがあり、その中のかなり深い状態を確認する必要があるとします。

while (loop
    .getAExecutionModelFactory()
    .getActiveXexecutor()
    .getYCancelModelHandler()
    .getCurrentHandler()
    .isCancelled()) {
        // ... do something with the current Handler ....
        loop = ..... // prepare for next loop
}

すべてのgetXXXメソッドが潜在的にnullを返す可能性があると仮定します。それから、非常に複雑で読みにくい式ですが、ブール式を書くことはまだ可能です。そして、現在のハンドラオブジェクトを取得するために、ほぼ同じやり直しを行う必要があります。そのような場合、while (true)breakとcontinueを使用してループを記述する方が簡単です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.