2

我一直在研究 K&R 的 The C Programming Language 中的一些示例,但是我对我在练习 1-12 中切换 if 和 else 语句所做的测试感到有点困惑。

问题如下:编写一个程序,每行打印一个单词。

所以基本上是为了测试 \n 而忽略单词之间的多个空格,我首先写了这个。

#include <stdio.h>

int main()
{
    int c;

    while ((c = getchar()) != EOF) {
        if (c == ' ' || c == '\t') {
            printf("\n");

        }
        else {
            putchar(c);
        }

    }
}

在这一个中,它会在看到空格或制表符时打印出一个新段落,如果没有,那么它会完全复制输入。

这段代码产生了我想要的结果(好吧,输入单词之间的额外空格仍然有额外的段落,但我现在忽略了)

然后我决定看看如果在更改条件的同时切换 if 和 else 语句会发生什么,但结果却不一样。

#include <stdio.h>

int main()
{
    int c;

    while ((c = getchar()) != EOF) {
        if (c != ' ' || c != '\t') {
            putchar(c);
        }
        else {
            printf("\n");
        }

    }

}

在这一个中,我希望它打印出不是空格或制表符的任何内容,如果不是,它将创建一个新段落。

我预计新条件会产生相同的结果。相反,它只是复制了我输入的内容。有谁知道为什么这不起作用?

4

2 回答 2

9
    if (c != ' ' || c != '\t') {

此条件检查是否不是 c空格 c不是制表符。这总是正确的,因为c不能同时是空格和制表符。尝试:

    if (c != ' ' && c != '\t') {

您可以在De Morgan's Laws中更详细地了解这一原则。

另一种方法是让编译器为您执行逻辑否定:

    if (!(c == ' ' || c == '\t')) {

!但是,有些人(包括我在内)会认为由于多余的括号和左侧的小括号而难以阅读。

于 2012-08-16T21:57:38.070 回答
2

与以下相反:

if (c == ' ' || c == '\t') {

(参数c是空格或制表符)

是:

if (c != ' ' && c != '\t') {

(参数c既不是空格也不是制表符)

||更改为&&.

于 2012-08-16T21:58:02.790 回答