while()不同的输出;相同的变量

时间:2013-03-11 21:02:22

标签: c++ while-loop

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

两者之间的区别在于,第一个while是从前一个已加载值的var加载而第二个代码是在执行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 ++如何解释它们?

5 个答案:

答案 0 :(得分:4)

你真的需要重新阅读那个教程......

在每次迭代之前评估并检查while()语句的条件。

所以这个:

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

每次迭代都会调用readdir(),而另一个则不会。从这一点开始,你可以自己做逻辑,你会发现它为什么会这样运作。

答案 1 :(得分:3)

在每次迭代中,您不会在第二个版本中重新评估ent。因此它的价值永远不会改变,因此如果你进入循环,你将永远留在里面。

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

答案 2 :(得分:0)

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

第二个永远不会改变 - 它只是不断检查(ent)中的值是否为空。所以它只会吐出第一个目录的名称,而不会其他任何东西,并将继续这样做。

答案 3 :(得分:0)

你的困惑可能来自readdir的错误解释。您可能会认为readdir每次都返回相同的内容(&#34;目录&#34;或者#34;列表&#34;目录) - 因此您对为什么会出现问题感到疑惑;两个代码的区别,显然(对你而言)程序的状态没有改变。但是,对readdir的解释是错误的!每次调用readdir都会返回指向目录中 next 文件的指针,因为系统会记住&#34;你在每次通话后离开的地方。遍历完所有文件后,readdir最终返回NULL,此时while条件失败并退出。

答案 4 :(得分:0)

在这段代码中

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

变量ent永远不会改变,所以一旦你输入了while,就会被困在那里。

在这个代码中

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

每次检查while条件之前,变量ent都会更改,因此您有机会结束。

这是如何遍历目录树的正确方法,递归调用readdir