如果可能的话,我想知道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 ++如何解释它们?
答案 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
。