web-dev-qa-db-ja.com

while(cin)とwhile(cin >> num)の違いは何ですか

次の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;
}
16
Ahmed_Mohsen

これらを個別に見てみましょう:

_while(cin >> x) {
    // code
}
_

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

一方、次のループについて考えてみます。

_while(cin){
    cin >> y;
    //code
}
_

ステートメントwhile (cin)は、「cinに対する以前のすべての操作が成功している間、ループを継続すること」を意味します。ループに入ると、yに値を読み取ろうとします。これは成功することもあれば、失敗することもあります。ただし、どちらの場合でも、ループは引き続き実行されます。つまり、無効なデータが入力されるか、読み取るデータがなくなると、yの古い値を使用してループがもう一度実行されるため、必要以上にループが繰り返されます。

このループの最初のバージョンを2番目のバージョンよりも確実に優先する必要があります。有効なデータがない限り、反復を実行することはありません。

お役に立てれば!

27
templatetypedef

違いは、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
}
3
Luchian Grigore
while(cin >> x){
    // code
}

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

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

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

3
paddy

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

while(cin)と同様に、_std::cin_はエラーフラグが設定されているかどうかについてブール値を返します。したがって、_std::cin_に内部でエラーフラグが設定されていない限り、whileループが続行されます。 _end of file_文字が見つかった場合、または値を読み取って格納できなかった場合は、エラーフラグを設定できます。

0
Caesar