首页 > 解决方案 > 枚举在 C 中超出索引时如何转换

问题描述

在 C++ 中,我看到

#include <iostream>

typedef enum {
    NORMAL = 0,
    EXTENDED
} CyclicPrefixType_t;

void func (CyclicPrefixType_t x) {
    if(x < NORMAL){
        printf ("lower\n");
    }else{
        printf ("higher\n");
    }
}

int main (void) {
    //MUST CAST OR WE GET ERROR
    CyclicPrefixType_t cpType = CyclicPrefixType_t(NORMAL - 1);

    func (cpType);
    return 0;
}

在 C++ 上运行代码

预期:lower>没关系

但在 C 中,

#include <stdio.h>

typedef enum {
    NORMAL = 0,
    EXTENDED
} CyclicPrefixType_t;

void func (CyclicPrefixType_t x) {
    if(x < NORMAL){
        printf ("lower\n");
    }else{
        printf ("higher\n");
    }
}

int main (void) {
    //NO NEED TO CAST
    CyclicPrefixType_t cpType = (NORMAL - 1);

    func (cpType);
    return 0;
}

在 C 上运行代码

实际结果:Higher>不行

在这种情况下, (-1) 会自动转换为另一个值。任何人都可以告诉我这里是哪个值以及它是如何转换成的 因为如果你打印它(%d),它仍然会(-1)

标签: c++cenums

解决方案


在 C 中,枚举值是整数......这允许各种不良行为和程序员的不端行为(有意或无意)

例如,虽然 C 语言不提供nextorprevious运算符,但有些人认为+-提供了......但不,这些只是从基础值中加一或减一——即使这给你的值不是枚举集的有效成员。

通常,依赖枚举的底层值是不明智的……尤其是因为编译器有优化值范围的习惯,除非它们确实需要成为指定的值。

它在这里不适用,但如果你真的需要数字来表示某些东西,你最好使用#define.


推荐阅读