在 switch 语句中使用枚举类型

24

我正在使用switch语句来检测特殊情况并从我的主函数中提前返回。特殊情况使用枚举类型进行编码,如下所示。

typedef enum {
    NEG_INF,
    ZERO,
    POS_INF,
    NOT_SPECIAL
} extrema;

int main(){

    // ...

    extrema check = POS_INF;

    switch(check){
        NEG_INF: printf("neg inf"); return 1;
        ZERO: printf("zero"); return 2;
        POS_INF: printf("pos inf"); return 3;
        default: printf("not special"); break;
    }

    // ...

    return 0;

}

很奇怪,当我运行这段代码时,控制台会打印字符串not special,而主函数的其余部分则继续执行。

我该如何使switch语句在此处正常工作?谢谢!

3个回答

29

没有case标签了。现在你有了goto标签。尝试:

switch(check){
    case NEG_INF: printf("neg inf"); return 1;
    case ZERO: printf("zero"); return 2;
    case POS_INF: printf("pos inf"); return 3;
    default: printf("not special"); break;
}

1
我应该看到那个问题,但是我没有。真是令人惊讶,有时候我们可以读过去却没有注意到。 - zwol
3
哦,我的天啊。我已经习惯了Verilog,忘记了这个。这段C代码是用于某个我拥有的Verilog项目的功能仿真。 - tomocafe

4
您还没有使用关键字"case"。下面给出的版本将正常工作。
typedef enum {
    NEG_INF,
    ZERO,
    POS_INF,
    NOT_SPECIAL

} extrema;

int main(){

    extrema check = POS_INF;

    switch(check){
        case NEG_INF: printf("neg inf"); return 1;
        case ZERO: printf("zero"); return 2;
        case POS_INF: printf("pos inf"); return 3;
        default: printf("not special"); break;
    }

    return 0;

}

2
你错过了极为重要的case
switch(check){
    case NEG_INF: printf("neg inf");     return 1;
    case ZERO:    printf("zero");        return 2;
    case POS_INF: printf("pos inf");     return 3;
    default:      printf("not special"); break;
}

你创建了一些与枚举常量同名的(未使用的)标签(这就是为什么它编译通过了)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接