0

可能であれば、 while in C++がこの 2 つの異なるコードをどのように解釈するかを知りたいです。

それらの 2 つの違いは、最初の while は既に値が与えられている前の var からロードされ、2 番目のコードは while を実行するときに変数の値が与えられることです。

以下のコードは、非常に単純な「ディレクトリ内のすべてのファイルを印刷する」プログラムの一部です。

1位。while を実行すると値が与えられます。意図したとおりにすべてのファイルを返します

    ent = readdir(directory);
    if(ent == NULL){
        cout << "Cannot read directory!";
    }else{
        while((ent = readdir (directory)) != NULL){
        cout << ent->d_name; //this one is the one which works fine; value is given when doing the while
        }
    }

2n. while を実行する前に変数に値が与えられます。while の最初の値を持つ無限ビュークルを返します。

        ent = readdir(directory);
        if(ent == NULL){
            cout << "Cannot read directory!";
        }else{
            while((ent) != NULL){
            cout << ent->d_name; //this one returns an infinite bucle of only the first value of the while
            }
        }

C++ はそれらをどのように解釈していますか?

4

5 に答える 5

4

そのチュートリアルを真剣に読み直す必要があります...

while()ステートメントの条件は、各反復の前に評価およびチェックされます。

したがって、この:

while ((ent = readdir(directory)) != NULL)

はすべての反復を呼び出しreaddir()ますが、他の反復は呼び出しません。この時点から、自分でロジックを実行できます。なぜそのように機能するのかがわかります。

于 2013-03-11T21:05:34.640 に答える
3

ent反復ごとに 2 番目のバージョンで再評価することはありません。したがって、その値は決して変化しないため、一度ループに入ると、常に内側にとどまります。

反対に、最初のバージョンでは、コードは反復ごとにwhile((ent = readdir (directory)) != NULL)新しい値を割り当て、ループを一度終了する場合があります(または、実際には NULL であることが判明します。ententreaddir(directory)

于 2013-03-11T21:05:00.407 に答える
0

あなたの混乱は、の誤った解釈から来るかもしれませんreaddir。毎回同じもの(ディレクトリの「ディレクトリ」または「リスト」)を返すと考えているかもしれませんreaddir。したがって、明らかに(あなたにとって)状態が2つのコードに違いがあるのはなぜか、戸惑うかもしれません。プログラムは変更されていません。しかし、その解釈readdirは誤りです!を呼び出すたびに、ディレクトリ内の次のreaddirファイルへのポインタが返されます。これは、システムが各呼び出しの後に中断した場所を「記憶」しているためです。すべてのファイルがトラバースされると、最後にに戻り、その時点で条件は失敗して終了します。readdirNULLwhile

于 2013-03-11T21:07:15.120 に答える
0

最初のものでは、ent=readdir(directory) によって次のディレクトリが取得され、最終的に null になり、while ループが終了します。これも最初のディレクトリ名を吐き出さないことに注意してください。

2 番目のものは決して変更されません。(ent) の値が null かどうかを継続的にチェックするだけです。したがって、最初のディレクトリの名前のみを吐き出し、それ以外は何も吐き出さず、永遠にそうし続けます。

于 2013-03-11T21:06:33.410 に答える
0

このコードでは

while((ent) != NULL){
    cout << ent->d_name;
}

変数entは決して変更されないため、while に入るとそこに閉じ込められます。

このコードで

while((ent = readdir (directory)) != NULL){
    cout << ent->d_name;
}

while 条件がチェックされる前に変数entが毎回変更されるため、終了する可能性があります。

これは、ディレクトリ ツリーをトラバースする正しい方法でreaddirあり、再帰的に呼び出されます。

于 2013-03-11T21:12:50.767 に答える