次の2つのループとそれぞれが停止するタイミングの違いは何ですか?
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main() {
int x,y;
while(cin >> x){
// code
}
while(cin){
cin >> y;
//code
}
return 0;
}
これらを個別に見てみましょう:
_while(cin >> x) {
// code
}
_
このループは、直感的には、「cin
からx
への値の読み取りを継続し、値が読み取れる限りループを続行する」ことを意味します。 int
ではない値が読み取られるとすぐに、またはcin
が閉じられるとすぐに、ループが終了します。つまり、ループはx
が有効な間だけ実行されます。
一方、次のループについて考えてみます。
_while(cin){
cin >> y;
//code
}
_
ステートメントwhile (cin)
は、「cin
に対する以前のすべての操作が成功している間、ループを継続すること」を意味します。ループに入ると、y
に値を読み取ろうとします。これは成功することもあれば、失敗することもあります。ただし、どちらの場合でも、ループは引き続き実行されます。つまり、無効なデータが入力されるか、読み取るデータがなくなると、y
の古い値を使用してループがもう一度実行されるため、必要以上にループが繰り返されます。
このループの最初のバージョンを2番目のバージョンよりも確実に優先する必要があります。有効なデータがない限り、反復を実行することはありません。
お役に立てれば!
違いは、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
}
while(cin >> x){
// code
}
これは、整数以外のエラー、EOF、またはその他のストリームエラーが発生するまで整数を読み取ります。ループ内でx
を使用すると、正常に読み取られたことがわかります。
while(cin){
cin >> y;
//code
}
これは、整数以外のエラー、EOF、またはその他のストリームエラーが発生するまで整数を読み取ります。ただし、ストリームはチェックされるbefore整数を読み取るだけです。ループでy
を使用する場合、正常に読み取られたことを保証することはできません。
_cin >> x
_は、入力値をxに格納します。
while(cin)
と同様に、_std::cin
_はエラーフラグが設定されているかどうかについてブール値を返します。したがって、_std::cin
_に内部でエラーフラグが設定されていない限り、whileループが続行されます。 _end of file
_文字が見つかった場合、または値を読み取って格納できなかった場合は、エラーフラグを設定できます。