0

如果可能的话,我想知道C++中的while 是如何解释这两个不同的代码的。

它们两者之间的区别在于,第一个 while 是从已经给定值的前一个 var 加载的,而第二个代码是在执行 while 时给出变量的值。

下面的代码是一个非常简单的“打印目录中的所有文件”程序的一部分

第一个。执行 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 之前给变量赋值。返回具有第一个值的无限 bucle。

        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。所以它的价值永远不会改变,因此如果你一旦进入循环,你将永远留在里面。

相反,在第一个版本中,代码while((ent = readdir (directory)) != NULL)ent在每次迭代时分配一个新值,并且可能会退出循环一次ent(或者实际上readdir(directory)结果为 NULL。

于 2013-03-11T21:05:00.407 回答
0

在第一个中, ent=readdir(directory) 导致它获取下一个目录,最终变为 null,并结束 while 循环。请注意,这也不会吐出第一个目录名称。

第二个永远不会改变 - 它只是不断检查 (ent) 中的值是否为空。所以它只会吐出第一个目录的名称,不会吐出其他任何东西,并且会一直如此。

于 2013-03-11T21:06:33.410 回答
0

您的困惑可能来自对readdir. 您可能会认为readdir每次都返回相同的内容(“目录”或目录的“列表”) - 因此您对为什么两个代码存在差异感到困惑,而显然(对您而言)程序没有改变。然而,这种解释readdir是错误的!每次调用readdir都会返回一个指向目录中下一个文件的指针,因为系统会“记住”每次调用后您离开的位置。遍历完所有文件后,readdir最后返回NULL,此时while条件失败并退出。

于 2013-03-11T21:07:15.120 回答
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 回答