0

在阅读 K&R 时,我遇到了一个示例问题。

这里程序的目的是计算换行符、新词和输入中输入的字符数。书中给出的代码是:

#include <stdio.h>

#define IN 1
#define OUT 0

void main(){
    int c, nl, nw, nc, state;

    state = OUT;
    nl=nw=nc=0;
    while ((c = getchar()) != EOF)
    {
        ++nc;
        if (c == '\n')
            ++nl;
        if(c == ' ' || c == '\n' || c == '\t')
            state = OUT;
        else if(state == OUT){
            state = IN;
            ++nw;
        }  
    }
    printf("%d %d %d\n", nl, nw, nc);
    

}

它可能看起来很傻,但很抱歉我是 C 的新手。我了解到,如果“if”语句的条件为真,它根本不会检查任何其他 if & else 语句条件,它只执行它的主体,因此不会t 执行其他 else & else if 语句的主体。

但是,在上面的代码(第 16 行)中,在使用非单词(空格)条件检查输入之后,它后面跟着一个 else if 语句。并增加其体内的 nw。但是如果 if 语句的条件为真, else if 怎么会被执行。

4

3 回答 3

2

在:

if(c == ' ' || c == '\n' || c == '\t')
            state = OUT;
        else if(state == OUT){
            state = IN;
            ++nw;
        }

执行大括号内的代码的唯一方法是:

  • 测试第一个条件if。那个条件是c == ' ' || c == '\n' || c == '\t'
  • 如果该条件为假,else则执行该部分。
  • else包含一个if语句,因此if测试第二个中的条件。那个条件是state == OUT
  • 如果该条件为真,则执行大括号内的代码。

因此大括号内的代码如果c == ' ' || c == '\n' || c == '\t'为假且state == OUT为真则执行。

于 2021-08-01T12:16:52.190 回答
0

这可以通过多种方式表达;我更喜欢更明确地对齐块:

    if (c == ' ' || c == '\n' || c == '\t')
            state = OUT;
        else 
            if (state == OUT) {
                state = IN;
                ++nw;
            }

这里复杂的部分与语言无关。它是在名为...的状态变量的帮助下检查单词边界state。(设置为OUT第一个)


用新词的条件检查输入后,

非单词字符的条件(空格)

于 2021-08-01T12:36:46.420 回答
0

经过大量研究后,我发现这篇文章证实了我的猜测。

这里发生的实际情况是,初始状态将是 OUT。并且每当您通过满足换行符、空白或制表符条件退出单词时,您的状态将通过执行第二个 if 语句设置为 OUT。除非您的状态为 IN,否则这实际上没有任何意义。

因此,当您在程序执行的未来遇到有效输入(不是 '\n'、'\t' 或 '')时,else if 块将被执行,将状态更改为 IN 并增加 nw 值.

这个过程一直持续到程序结束。该程序的逻辑将运行良好,因为输入永远不会以空格结尾。

于 2021-08-01T13:10:20.140 回答