不同的输出;同一变量 如果可能,我想知道C++中如何解释这两个不同的代码。

不同的输出;同一变量 如果可能,我想知道C++中如何解释这两个不同的代码。,c++,while-loop,C++,While Loop,两者之间的区别在于,第一个while是从先前的var加载的,该var已经给定了一个值,而第二个代码在执行while时给出了变量的值 ent = readdir(directory); if(ent == NULL){ cout << "Cannot read directory!"; }else{ while((ent) != NULL){ cout <<

两者之间的区别在于,第一个while是从先前的var加载的,该var已经给定了一个值,而第二个代码在执行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
            }
        }
下面的代码是一个非常简单的打印目录程序的一部分,该程序使用

第一。值是在执行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的第一个值返回一个无限Bucel

        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++如何解释它们?

你不是在每次迭代中重新评估第二版的ENT。因此,它的值永远不会改变,因此,如果你进入循环一次,你将永远呆在里面


相反,在第一个版本中,代码whileent=readdir directory!=NULL将在每次迭代时为ent分配一个新值,并且一旦entor实际readdirdirectory为NULL,可能会退出循环。

您需要重新阅读该教程

while语句的条件将在每次迭代之前进行评估和检查

因此:

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

将在每次迭代时调用readdir,而另一个不会。从这一点上,您可以自己做逻辑,您将看到它为什么会这样工作。

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


第二个永远不会改变——它只是不断地检查ent中的值是否为null。因此,它只会吐出第一个目录的名称,而不会吐出其他名称,并且将永远这样做。

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

在这段代码中

while((ent) != NULL){
    cout << ent->d_name;
}
while((ent = readdir (directory)) != NULL){
    cout << ent->d_name;
}
每次检查while条件之前都会更改变量ent,因此您有机会结束


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

在第二种情况下,ent将始终是readdirdirectory的结果,如果它不为NULL,则它是一个无限循环。@marounnaroun除非ent碰巧有一个重载的->运算符,它做了一些非常奇怪的事情。对于新手来说,其中一些词可能会令人困惑。初学者可能会认为,在每次迭代之前,将“ent”与NULL进行比较,而像我们这些更有经验的程序员会更清楚地理解“evaluated”的含义,以及每次迭代重新评估的结果。初学者在阅读时很容易犯错误,尤其是对于所有的程序员来说。条件、语句、已计算、迭代。。。在一句话中=对你的帖子投了正确的票。@JaminGrey不。我写的东西不能这样解释。while语句的条件是while语句的条件,而不是while语句的第二部分。我唯一的观点是,对于不熟悉该术语的人来说,它完全可能被错误地解释为while语句。我说的是while语句的条件的措辞,在每次迭代之前都要进行评估和检查,而不是你的帖子的措辞。我以为你是直接引用了OP阅读的教程