5

重複の可能性:
for および while ループにループ条件がない

a の条件をfor-loop空のままにしておくことができるのはなぜですか? 例えば

for (;;)

正常にコンパイルされます。trueこの空の式が次のように評価されるのはなぜですか

if () {}
while () {}

両方とも失敗しますか?このケースの例外であるかどうか、またはその理由を知りたいです。for-loop

4

2 に答える 2

10

http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

これらは反復ステートメントです

while (式) ステートメント

do ステートメント while ( 式 ) ;

for ( 式 [opt] ; 式 [opt] ; 式 [opt] ) ステートメント

for ( 宣言式 [opt] ; 式 [opt] ) ステートメント

while ループは、ループの各実行前に制御式を評価するように設計されており、do ループは各実行に評価するように設計されています。

for ループは、より洗練された反復ステートメントとして設計されました。

6.8.5.3 for ステートメント

ステートメント

for ( 節 1 ; 式 2 ; 式 3 ) ステートメント

式 expression-2 は、ループ本体の各実行前に評価される制御式です。式 expression-3 は、ループ本体の各実行後に void 式として評価されます。句-1 が宣言である場合、それが宣言する識別子の有効範囲は、残りの宣言とループ全体 (他の 2 つの式を含む) です。制御式の最初の評価の前の実行順序で到達します。句-1 が式の場合、制御式の最初の評価の前に無効な式として評価されます。

句-1 と式-3 は両方とも省略できます。省略された式-2 は、ゼロ以外の定数に置き換えられます。

この指定では、ループの条件である式-2 を省略でき、ゼロ以外の定数に置き換えられます。これは、for ループが無期限に実行し続けることを意味します。

これは、終わりのない反復のための単純な構文を許可するのに役立ちます。

for(int i = 0;;i++) { //do stuff with i }

これは、ループの外側で変数を宣言し、ループの内側でインクリメントする while(1) ループを記述するよりも、記述と理解がはるかに簡単です。

次に for ループの仕様は、clause-1 を省略して、他の場所で変数を宣言または初期化できるようにします。また、expression-3 を省略して、各ループの完了時に式を評価する必要がないようにします。

for ループは特殊なケースです。while ループと do ループは厳密で式が必要ですが、for ループは柔軟な繰り返しステートメントです。

于 2012-11-13T18:46:17.297 に答える
5

決定的な答えを出すことはできませんが、forループの場合には 3 つの異なる式があり、ループに応じてそれぞれを使用する必要がある場合と使用しない場合があるためだと思います。

そのif場合、表現がなければ意味がありません。式が true または false であるかのように常に動作する必要があるため、句の 1 つだけに相当します。このwhile場合、 の意味のある解釈があり、これは( で抜け出せるループを与える)while () { }に評価されますが、その単一の文字を除外することの利点は問題に値しないと思います。while (1) { }break

ただし、forループの場合、3 つの異なる式があり、それぞれが必要な場合と必要でない場合があります。たとえば、ループごとに何かを初期化してインクリメントしたいがbreak、ループから抜け出すために使用する場合は、 と書くことができますfor (i = 0; ; ++i)。または、変数が既に初期化されているため、テストとインクリメントだけが必要な場合は、 と書くことができますfor (; i > 0; --i)。ループによってはこれらの各式が必要ない場合があるため、使用しないすべての式のプレースホルダーを埋めるのは少し面倒に思えます。また、一貫性を保つために、それらの 1 つにプレースホルダーを必要とするのではなく、それらはすべてオプションであり、省略された場合、条件はゼロ以外の定数値と見なされます。

もちろん、設計上の決定に過度の意図を読み込んでしまいがちなこともあります。場合によっては、特定の標準が最初の実装で実装された方法であり、他のすべての人がそれをコピーしたという単純な理由があります。例として、Unix で で始まるファイルが非表示になる理由についての Rob Pike の説明を参照してください。.これは意図的な設計上の決定によるものではなく、誰かが書き込み時にショートカットを使用し、毎回ディレクトリ エントリを表示しlsたくなかったためです。...

于 2012-11-13T18:53:33.913 に答える