c - IF 和 ELSE IF 子句有什么区别?

标签 c

我正在通过 K&R 学习 C 语言。除了书上的习题,我自己也在做一些。我写了下面的代码,它的作用是,它计算你的输入,给你反馈还有多少单词可以达到 10 个单词的“目标”,并在你达到 10 个单词时立即祝贺你。

#include <stdio.h>

main()
{
    /* This programm will read your input, check the number of words,
    and will congratulate when you reach a value of 10 words*/

    int c, nw, counter;

    nw = 0;
    counter = 0;

    while (nw < 10)
    {
        c = getchar();

        if (c == ' ' || c == '\t' || c == '\n')
        {
            counter = 0;
        }

        else if (c != ' ' || c != '\t' || c != '\n')
        {
            if (counter == 0)
            {
                counter = 1;
                ++nw;
            }
            printf("Only %d words left\n", 10-nw );
        }
    }
}

好的,在此版本中,代码不会将空格计为单词,从而正确输出剩余的单词。

一开始我写代码时只用了“if”而不是“else if”。它所做的是它也将空白算作单词。

我要问的问题是为什么?使用 if 和 else if 的区别在哪里。

据我了解,编译器会检查条件是否满足。仅使用 if 时也应该如此。由于一切都是一样的,如果不是 if 而不是 else,我无法弄清楚问题是什么。

最佳答案

看起来这可能是一个问题想得太多了。除了错误之外,您最终得到的逻辑过于复杂。您关于 ifelse if 之间区别的问题很公平,我保证会在我的回答中解决这个问题。

首先,让我重申一下您正在尝试做的事情:

Read input, count number of words, and congratulate you when you reach 10 words

根据您的代码,我相信您的意图是根据空格、制表符和换行符拆分单词。拆分单词的方法有很多种,但就本题而言,您想要的方法就可以了。

当然,问题在于您的逻辑不起作用。你有一个永远不会为假的条件:

else if (c != ' ' || c != '\t' || c != '\n')

想想看(提示:else 本身不会改变条件)。如果有帮助,请大声说出来:您正在寻找 c 不是空格,或者 c 不是制表符,或者 c 不是换行符。请记住,逻辑或 (||) 是一个包含性,换句话说,如果任何,则表达式为true > 的条件是 true。例如,假设 c 是一个空格。第一个条件 (c != ' ') 失败,但第二个条件 c != '\t'true 因为空格不是标签。因此,整个表达式为 true。事实上,对于c任何 值,该表达式都为真。

但是else呢?

正如我所说,else ifelse 部分在这里没有区别。 else if 唯一不同的是本质上将其自身作为一个新条件添加到您的 if 语句中。让我们看一个更简单的例子:

if (a == 1) {
    /* a is 1 */
}

if (a != 1 && b == 2) {
    /* a isn't 1, but b == 2 */
}

这是两个完全独立的 if 语句的示例。这是在何处使用 else 的完美示例,因为您可能已经注意到,第二个 if 语句测试第一个语句的逆语句。 (a != 1)。所以,上面的内容可以简化为:

if (a == 1) {
    /* a is 1 */
else if (b == 2) {
    /* a isn't 1 and b is 2 */
}

else if block 中,我们不需要测试 a != 1,这是隐含的,因为我们只评估 else如果第一个 if 条件为假,则声明。

另请注意,else if 实际上是两个单独关键字的组合。它相当于:

else {
    if (b == 2) { ... }
}

但是,按照惯例,我们省略可选的大括号并将其写为:

else if (b == 2) { ... }

事实上,在某些情况下我们根本不需要第二个if:

if (a == 1) {
    printf("a is 1!\n");
} else {
    printf("a isn't 1. In fact, it's %d.\n", a);
}

简化版

因此,现在无需陷入 else if 中。专注于您的逻辑,并尽力简化它。我会为您简化它,但我鼓励您跳过这部分并先自己尝试:

char c;
int in_word = 0;

while (nw < 10) {
    c = getchar();

    if (c == ' ' || c == '\t' || c == '\n') {
        /* If we were in a word, then count that word! */
        if (in_word) {
            nw++;
            printf("You only have %d words to go!", 10 - nw);
        }
        in_word = 0; /* We are not in a word now */
    } else {
        in_word = 1; /* Now we're in a word
    }
}

关于c - IF 和 ELSE IF 子句有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32691461/

相关文章:

c - 如果malloc返回NULL怎么办?

c - 如何使用C从键盘读取字符串?

c - SQLite - 找到某个值并找到该行输入值出现的另一列上的最高值,然后选择该行上的所有元素

C - 套接字编程 - 我的服务器无法绑定(bind)到地址

java - 为什么C和Java代码之间的socket通信只收到64K数据?

objective-c - 计算返回 0 Objective-c

c++ - 在 C 中垂直打印字节数组

c - C语言中 'static void *'是什么意思?

c - 声明/初始化结构时每个花括号代表什么? (警告 : missing braces around initializer [-Wmissing-braces])

c - 从 ADC 样本到 C 语言的 .WAV 文件