2013-10-20 10 views

答えて

12

のは、これらの独立して見てみましょう:

while(cin >> x) { 
    // code 
} 

このループ、直感的に、「xcinから読み取り値を維持し、限り値を読み取ることができるよう、ループ継続」を意味します。 intでない値が読み取られると、またはすぐにcinが閉じられると、ループは終了します。つまり、ループはxが有効な間だけ実行されます。一方

、このループ考える:「cin上のすべての以前の操作がループし続け、成功しているが。」

while(cin){ 
    cin >> y; 
    //code 
} 

声明while (cin)手段ループに入ると、値をyに読み込もうとします。これは成功するか、失敗する可能性があります。ただし、どのケースに関係なく、ループは実行を継続します。つまり、無効なデータが入力されたり、読み取るべきデータがなくなった場合、ループはもう一度古い値yを使用して実行されるため、必要以上にループが1回繰り返されます。

このループの最初のバージョンを2番目のバージョンに置き換えることをお勧めします。有効なデータがない限り、繰り返しは実行されません。

希望すると便利です。

+0

"値を読み取ることができる限り、ループを続行します。つまり、読み取りが成功した場合は、ループ本体を実行します。 – dyp

3

違いはcin >> whateverがfalseと評価された場合、2番目のバージョンは、まだループの残りの部分を実行していることです。

cin >> whateverが失敗するとします。何が起こるか?

while(cin >> x){ 
    // code that DOESN'T RUN 
} 

while(cin){ 
    cin >> y; 
    //code that DOES RUN, even if the previous read failed 
} 
+0

私はオンラインジャッジでそれを使用していたので、結果は間違った答えではありませんでした。 –

0

cin >> xは、入力値をxに格納します。

while(cin)については、std::cinは、エラーフラグが設定されているかどうかについてブール値を返します。したがって、std::cinに内部でエラーフラグが設定されていない限り、whileループを継続します。エラーフラグは、end of file文字を見つけた場合、または値の読み込みと格納に失敗した場合に設定できます。

1
while(cin >> x){ 
    // code 
} 

これは、非整数、EOF、またはその他のストリームエラーが発生するまで整数を読み取ります。ループ内でxを使用するたびに、正常に読み取られたことがわかります。

while(cin){ 
    cin >> y; 
    //code 
} 

これは、非整数、EOF、またはその他のストリームエラーが発生するまで、整数を読み取ります。ただし、ストリームはの前にのみチェックされ、は整数を読み取ります。ループ内でyを使用すると、正常に読み取られたことを保証できません。

関連する問題