这种while循环如何迭代?

问题描述

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/stat.h>
#include <errno.h>

#define ERR(source) (perror(source),\
        fprintf(stderr,"%s:%d\n",__FILE__,__LINE__),\
        exit(EXIT_FAILURE))

void scan_dir() {
    DIR* dirp;
    struct dirent *dp;
    struct stat filestat;
    if (NULL == (dirp = opendir("."))) ERR("opendir");

    do {
        errno = 0;
        if ((dp = readdir(dirp)) != NULL) {
            if (lstat(dp->d_name,&filestat)) ERR("lstat");
            printf("%s\n",dp->d_name);
        }
    }
    while (dp != NULL);
}

在这里了解大多数代码,但是我无法弄清楚dp每次的更改/迭代方式。我以为可能是dp = readdir(dirp),每次都将dp的值分配给另一个目录入口,但是我不确定,如果是这样,它将如何自动将其分配给下一个目录入口?

解决方法

在C中,=是一个运算符,与其他所有运算符一样。 a = b将变量a设置为值b,然后返回值b。因此,y = (x = 1) + 2将x设置为1,然后将1加2,然后将y设置为3。readdirDIR*作为参数,而DIR*具有一个确定要读取哪个文件的内部状态。每次您在其上调用readdir时,它将返回下一个文件。请参阅文档here