有人可以解释一下为什么这个C代码没有编译我的else if语句?

rav*_*inx 1 c if-statement

所以我写了这个C代码但是找不到为什么编译器没有得到else if语句的错误.

    #include<stdio.h>

#define IN 1
#define OUT 0;

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

    state = OUT;

    while((c = getchar()) != EOF) {
        ++nc;

        if(c == '\n')
            ++nl;

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

    printf("%d %d %d\n", nl, nw, nc);

    getchar();
}
Run Code Online (Sandbox Code Playgroud)

我收到一条错误,上面写着''else'没有先前的'if'"

Jon*_*art 6

正如Jean-FrançoisFabre 在评论中指出的那样,你的问题是这个后面的分号#define:

#define OUT 0;
Run Code Online (Sandbox Code Playgroud)

这会使您的代码看起来像这样:

    if(c == '\n' || c == '\t' || c == ' ') 
        state = OUT;
    ;  // The "else" would go here, but you've already completed the "if"

    else if(state == OUT) {   // Now there is no "if" to associate with
        state = IN;
        ++nw;
    }
Run Code Online (Sandbox Code Playgroud)

预处理器能够引发这样的各种问题,这是在可能的情况下避免它的一个很好的理由.(这来自一个用cpp来做肮脏,恶心的事情的人).

在这种情况下,匿名enum是要走的路:

enum {
    OUT = 0,
    IN = 1,
};
Run Code Online (Sandbox Code Playgroud)

此外,这是一个风格问题,但我总是包括花括号,除了没有的简单条件else:

// OK
if (ok)
    foo();

// Not OK
if (ok)
    foo();
else if (x == 3) {
    lots();
    of();
    stuff();
}
else
    bad();
Run Code Online (Sandbox Code Playgroud)