为什么 while 写在这里没有 body?

why is while written here with no body?

为什么这段代码写的while循环没有body?它有什么作用? 索引和长度都是整数,我正在从一个 txt 文件中读取。

  // ignore alphabetical strings too long to be words
        if (index > LENGTH)
        {
            // consume remainder of alphabetical string
            while ((c = fgetc(fp)) != EOF && isalpha(c));

            // prepare for new word
            index = 0;
        }

why is while written here with no body?

TL;DR - 因为它可以编写并且可以满足代码的预期目的。

详细说明,在代码中

while ((c = fgetc(fp)) != EOF && isalpha(c));

&& 运算符及其属性被用作控制表达式的一部分,用于循环语句的目的。 while 中的条件检查保持 TRUE (1),只要 && 的两个操作数都计算为 TRUE (1)。一旦其中任何一个不是 TRUE,循环就结束了。

明确一点,直到 (c = fgetc(fp)) != EOF isalpha(c) 的计算结果为非零值 (TRUE),循环继续(主体为空).

fgetc() and isalpha() 的主页可能会有进一步的帮助。

为了更好地理解发生了什么,循环可以重写如下:

do {
    c = fgetc(fp);
} while (c != EOF && isalpha(c)); 

它从文件描述符中读取一个字符,然后检查它是字母字符还是 EOF。

原来的循环所做的是将赋值作为条件中的子表达式执行,因此将主体留空。

评论清楚地提到了代码的用途。
// consume remainder of alphabetical string while ((c = fgetc(fp)) != EOF && isalpha(c));

函数 fgetc 每次调用都会从文件指针 fp 中读取一个字符。 在阅读时,它会跳过下一个字母序列,直到它到达其他数字。

一旦它解析了长度为 LENGTH 的字符串,它应该忽略所有后续字符。因此,在 while 循环体中:

c = fgetc(fp)) != EOF //get c from file pointer and check if it is not EOF
isalpha(c) //and also it is an alphabet because alphabets can only make a word

如果两个条件都为真,则继续解析并忽略。当您遇到字母以外的字符或 EOF 时,请重置索引并转到下一行。

因此,如果您阅读 fgetc 上的文档,它会说当成功时它将 return 内部文件位置指示器当前指向的字符 或 EOF。所以 while 循环只是将 c 分配给文件中的下一个字符,检查它是否不是 EOF 并确保它是 alpha character 并继续这样做直到这些条件不成立。该循环可以重写为:

int c = fgetc(fp);
while (c != EOF && isalpha(c))
    c = fgetc(fp);

这个while没有写正文,因为动作是在while循环的condition部分执行的。

如果你看到循环的条件是:

((c = fgetc(fp)) != EOF && isalpha(c))

当第一个条件 - 即 (c = fgetc(fp)) != EOF - 被评估时,c = fgetc(fp) 被执行,从你的文件中读取一个字节。首先检查此字节是否为 EOF,表示文件结束,如果不是 EOF,则检查它是否为非字母字符。

这个从文件中读取一个字节的操作会一直持续到读取到一个非字母字符,或者到达文件末尾。

所以,这段代码基本上做的是,每当 index 超过 LENGTH 时,它首先读取剩余的 alphabets - 什么都不做 - 直到一个非 -已读取 alpbabet 或已到达文件末尾。然后它将 index 设置为 0

那个while也可以写成不同的,这样它就不会有一个空体。但是,你看到的是C.

中常见的idiom