我正在通过 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,我无法弄清楚问题是什么。
最佳答案
看起来这可能是一个问题想得太多了。除了错误之外,您最终得到的逻辑过于复杂。您关于 if
和 else 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 if
的 else
部分在这里没有区别。 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/