なぜそれほど多くのfor(;;)コンストラクトが表示されるのですか?[閉まっている]


14

私の考え方では、forループを使用して、既知の範囲または決定可能な範囲を反復処理します。

String[] names = //something;
for ( int i = 0; i < names.length; i++ ) { //do stuff }

これは(iの範囲を除いて)と同等です:

String[] names = //something;
int i = 0;
while (i < names.length )
{
   // do stuff
   i++;
}

言い換えれば、forループは、一般的に使用されるwhile構造の単純な(非常に有用な)構文糖です。

しかし、私for(;;)は機能的にと同等であるウェブ上の多くの構造を見ていますwhile(true)

これの理由は何ですか?無限forループが無限whileループよりも優先されるのはなぜですか?

// whileループをまったく使用しないjavaテキストも見ました!次のような巨大な構成要素につながる:

String input = getInput();
for( ; !inputIsValid(input) ; )
{
   //redo;
}

主な理由は好みです。ただし、YMMVを選択する場合は、読みやすさが必要になります。
アーロンマクアイバー

なぜ誰かが厄介な構造を好むのでしょうか?
クリスカドモア

10
あなたは入れ替えることができwhilefor、ここで、問題は変更されません。同じことwhile(true)for(;;)意味します。あなたは明らかに強い好みを持っていますがwhile、他の人も同様に強い好みを持っているかもしれませんfor。一方が他方よりも正しいと言うことは不可能です。
カレブ

3
@クリス、私はまったくfor(;;)混乱を見つけることはありません。これは標準のCイディオムで、K&R(2e)のセクション3.5で文書化されています。あなたはそれが好きではないことを理解しています。他の人が明らかにそれを好むことを理解する必要があります(そうでない場合は表示されません)。C以外の言語では多かれ少なかれ受け入れられるかもしれません。あなたはこの言語にとらわれないタグを付けました。これは決定的な答えの可能性を減らすだけです。繰り返しになりますが、Qは建設的なものではないため私は閉会に投票しました。私が気分を害した場合、私は閉鎖の代わりに、または閉鎖に加えて攻撃的としてフラグを立てたでしょう。以上です。
カレブ

1
個人的に私は無限ループに完全に別の構文を持っているために、ここで本当の機会があると思う。何かのようにwheeeeeeee { ... }
detly

回答:


33

これは、PDP-11の古いプログラミング手法からの引き継ぎです(はい、私は古いと言いました)。以前は単一の命令を保存していたため、ループの実行を高速化するのに役立ちました。

追加情報については、以下を参照してください。http//www.flounder.com/exceptions.htm


3
それがまさに私が探していたものです。本当の正当な理由がありますが、それはもはや有効ではありません。
クリスカドモア

1
@chris Nnnope、現代のコンパイラーは時々、ループの状態で定数を使用することについて文句を言うでしょう。それは単なるホールドオーバーではありません。
イズカタ

それだけではありません。Unixシステムで1990年代初頭にCを書いたことを覚えていますが、while(true){}はオプションではありませんでした。標準のブール型はありませんでしたが、いくつかのUNIXシステムはCヘッダーファイルで独自のシステムを定義していました。メモリから、少なくとも1つのUNIXベンダーが、成功時にゼロを返すこと、および正の数が失敗であるため、関数の戻りを処理するために、TRUEをゼロとして定義しました。これは、while(TRUE){}が移植可能でなかったことを意味していました。
マイケルショー

1
私は今それを見つけることができませんが、数年前にデニス・リッチーがUsenetでこれが単に間違っていると書いており、彼/彼らはfor(;;)(彼らの意見では)ループを終了するための基準が記載されていないことを意図しています。
ジェリーコフィン

@Ptolemy:まあ、あなたは確かに書いたかもしれませんwhile(1) { }
エドS.

10

いくつかのコンパイラが警告を与える(のようなものの条件式が一定である)を使用したときwhile( 1 )が、とfor( ; ; )について警告するためには何もありません。プログラマは警告のないコードが必要なので、forバリアントを使用します。


ただし、コンパイラが警告するいくつかのことは完全に有効であり、(場合によっては)避けられません。だから私たちの中には、警告を警告として扱う人もいます。もちろん、それらを無視すると、重要なものを見ることができず、ひどいことに夢中になりますが、ローカルまたはグローバルに警告を無効にするプラグマとオプションがあります。基本的に、はい、警告を表示しない方が良いですが、通常は、より悪いコードスタイルを採用するよりも強力な理由が必要です。ここでは違いは悪くありませんが、とにかく「無限」ループはまれです(または非常に悪いスタイルです)。
Steve314

5

これは、ブール型が存在しないCプログラミングから習得した習慣です。while(1)は潜在的に同等ですが、正しく覚えていればK&Rに表示されるFor(;;)がよく使用されます。どこかにハードウェア上の理由もあったのではないかと思います。


4
...が疑われたハードウェアの理由...
アーロンMcIver

2
エドワード・ロバートソンが述べたように、その理由は、PDP-11のCコンパイラが「while(true)」のtrueがコンパイル時定数であることを認識せず、アセンブリを生成するときに追加の命令(比較)を追加するためです。PDP-11で利用可能なリソースが限られているため、プログラマはforループを使用して、プログラムからの1つの追加命令を最適化しました。
ジェッティ

3

for(;;)は「forever」と読むことができ、「while true」よりも自然なものもあります。


これが元の理由ではありませんが、それは、元の理由が廃止されてからずっと経ってから、設定が固執する二次的な理由です。ただし、経験豊富なプログラマーに尋ねる以外に、これをサポートする証拠を取り除くことは非常に困難です。
DarenW

-2

私が尋ねたすべての経験豊富なプログラマfor(;;)は、while(true)またはよりも早く認識できwhile(1)ます。


2
いまいましい価値のあるプログラマなら、3つすべてをすぐに認識できるはずです。3つすべてが十分に一般的であるため、コードの読み取りに5分以上を費やした人は、それぞれを何度も見ています。
cHao

1
研究では、経験豊富なプログラマが理解できることが示されているfor(;;)よりも速く約14msを消費しwhile(1):-)
ケビン・クライン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.