为什么 getchar() 在这两种情况下的工作方式不同?

Why getchar() works int these two cases differently?

我正在编写用于编码字符的小程序,但我在读取 NUL 字符时遇到了问题,也许在读取其他字符时也遇到了问题。我的问题是这段代码中的 getchar 以某种方式忽略了 CTRL + 输入的 NUL 字符 @。

while ((numberOfRead < 40) && (character = getchar()) && (character != EOF) && (character != '\n')) { ... }

但是此代码可以正常工作并正确读取 NUL 字符。

character = getchar();
while ((numberOfRead < 40) && (character != EOF) && (character != '\n')) {
    numberOfChars++;
    ...
    character = getchar();
}

导致问题的原因是什么?感谢您对此行为的任何解释。代码在 Windows 8.1,gcc 4.7.1

下测试

这里:

    while (... && (character = getchar()) && ...) ...

你使用character的值作为真值。当读取到的character为值为0的空字符时,则此条件为假。

您可以这样做:

    while (numberOfRead < 40
       && (character = getchar()) != EOF && character != '\n') { ... }

但我发现您的第二个变体 getchar 在条件之外更具可读性。