K&R C 直方图

K&R C Histogram

我目前正在 K&R 的 C 编程语言第 2 版中做练习 1-13。我决定从一个简单的直方图开始,它只是用“*”替换单词中的每个字母。

#include <stdio.h>
// histogram

#define IN 1
#define OUT 0

main() {
  int c, state;
  state = OUT;

  while ((c = getchar()) != EOF) {
    if (c == '\n' || c == '\t' || c == ' ') {
      state = OUT;
      putchar('\n');
    }
    else {
      if (c != '\n' || c != ' ' || c != '\t') {
        state = IN;
        putchar('*');
      }
    }
  }
}

不过,看看这段代码:

 else {
   if (c != '\n' || c != ' ' || c != '\t') {
     state = IN;
     putchar('*');
   }
 }

为什么这行得通,但如果我输入 if (state != OUT) ,它却行不通?我最终得到了完全不同的输出。这两个说法本质上不是一回事吗?

c 等于三个项 "or" 彼此不等价 c 不等于相同三个项 "or" 彼此的否定。

参见De Morgan's laws