【问题标题】:confused with K&R's 1.5.4 example与 K&R 的 1.5.4 示例混淆
【发布时间】:2021-10-07 03:20:36
【问题描述】:

在阅读 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 语句条件,它只执行它的主体和因此不会执行其他 else & else if 语句的主体。

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

【问题讨论】:

    标签: c if-statement conditional-statements


    【解决方案1】:

    在:

    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 为真,则执行大括号内的代码。

    【讨论】:

      【解决方案2】:

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

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

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


      新词的条件检查输入后,

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

      【讨论】:

      • 因此,每当遇到新单词条件(即 \n, \t, ' ' )时,它就会简单地将其状态更改为 OUT,并且当它再次遇到不满足新单词条件的输入时(即,有效的字符输入)它检查先前的 OUT 状态并将其转换为 IN 并增加 nw。我说的对吗!
      • 是的,从“OUT”开始计算状态变为“IN”的次数。两个连续的空格不是两个“新词”。
      【解决方案3】:

      经过大量研究,我发现了这个article,证实了我的猜测。

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-12
        • 1970-01-01
        • 2011-03-21
        • 1970-01-01
        相关资源
        最近更新 更多