K&R 1.5.4,任何人都可以解释一下这个代码示例中的 else if 吗?

K&R 1.5.4, can anyone explain the else if in this code example?

我正在痛苦地完成 K&R 第二版。我不清楚示例 1.5.4 中的最终 if(else if)在做什么。

include stdio.h

define IN  1

define OUT 0

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);
}

是不是说:如果state是OUT,那么就把state改成IN,+1到nw在任何情况下都是

如果状态为 OUT,则什么也不做,否则将状态更改为 IN,如果状态为 IN,则将 +1 更改为 nw

文中的注释是:'[...] else 之后的 [statement] 是一个 if 控制两个大括号中的陈述。

出于某种原因,我很难了解那里发生的事情。谁能帮忙?每次看都脑子发凉

如果您遇到以下任何情况:spacetabnewline 然后它会将您的 position/state 设置为 OUT 这表明您是当前不在某些文本中间(例如 asd673r23@#$#),这意味着您刚刚在字符串中找到了另一个词,因此它增加了总数。单词数增加 1.

这让我发疯,没有人回答我需要的东西..但确实指导了我!这是新手容易混淆的部分。 这两个状态 == out 应该独立看待。

if (c == ' ' || c == '\n' || c == '\t')
                state = OUT;

            else if (state == OUT) {
                state = IN;
                ++nw;

第一个状态 = out 将状态设置为 out。而第二个 else if 以 state == out 开始,因为 out 之前已初始化为 0。第一部分中的 state = out 不会转移到 else if 语句。 else if 发生而不是。希望这对某人有所帮助,如果我错了请纠正我。