切换If和Else不会产生相同的结果

时间:2012-08-16 21:56:02

标签: c if-statement

我一直在研究K& R的C语言编程语言中的一些例子,但我对练习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");
        }

    }

}

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

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

2 个答案:

答案 0 :(得分:9)

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

此条件检查 c是否不是空格, c不是标签。这始终是真的,因为c不能同时是空格和制表符。尝试:

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

您可以在De Morgan's Laws详细了解此原则。

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

    if (!(c == ' ' || c == '\t')) {
然而,有些人(包括我在内)会因为额外的括号和左边的小!而认为更难阅读。

答案 1 :(得分:2)

与之相反:

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

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

是:

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

(参数c既不是空格也不是标签)

||应更改为&&