为什么在 while 循环条件中将 getchar() 分配给变量会导致输出为 0?

0 c

所以目前我正在从 C 编程语言第二版书中学习 C,它说:

while (c = getchar() != EOF) {
}
Run Code Online (Sandbox Code Playgroud)

等同于:

while (c != EOF) {
   c = getchar();
}
Run Code Online (Sandbox Code Playgroud)

但是,当我运行刚刚编写的代码时:

#include <stdio.h>

int main() {
    char c;
    int times;
    
    while (c = getchar() != EOF) {
        if (c == 'a') {
            ++times;
        }
    }
    printf("%d\n", times);
}
Run Code Online (Sandbox Code Playgroud)

times它输出的值是 0 而不是我输入 'a' 字符的实际值。现在在这段代码中,它工作正常:

#include <stdio.h>

int main() {
    char c;
    int times;
    
    while (c != EOF) {
        c = getchar();
        if (c == 'a') {
            ++times;
        }
    }
    printf("%d\n",times);
}
Run Code Online (Sandbox Code Playgroud)

如果我输入a3 次,它输出的值是3.

ike*_*ami 5

优先!

c = getchar() != EOF
Run Code Online (Sandbox Code Playgroud)

方法

c = ( getchar() != EOF )   // Assigns `0` or `1` to `c`.
Run Code Online (Sandbox Code Playgroud)

但你想要

( c = getchar() ) != EOF
Run Code Online (Sandbox Code Playgroud)

另请注意,c需要是一个int.


这意味着你可以使用

for (int c; ( c = getchar() ) != EOF; ) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

但是我更喜欢

while (1) {
   int c = getchar();
   if (c == EOF)
      break;

   ...
}
Run Code Online (Sandbox Code Playgroud)