c++ - 枚举在 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;
}
预期: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;
}
实际结果:Higher
>不行
在这种情况下, (-1) 会自动转换为另一个值。任何人都可以告诉我这里是哪个值以及它是如何转换成的 因为如果你打印它(%d),它仍然会(-1)
解决方案
在 C 中,枚举值是整数......这允许各种不良行为和程序员的不端行为(有意或无意)
例如,虽然 C 语言不提供next
orprevious
运算符,但有些人认为+
并-
提供了......但不,这些只是从基础值中加一或减一——即使这给你的值不是枚举集的有效成员。
通常,依赖枚举的底层值是不明智的……尤其是因为编译器有优化值范围的习惯,除非它们确实需要成为指定的值。
它在这里不适用,但如果你真的需要数字来表示某些东西,你最好使用#define
.
推荐阅读
- flutter - 接收用于空值错误的空检查运算符
- css - How to add a mask on image without use absolute element
- windows - 在 Windows 上使用 cmd 减少文件名中的数字
- html - 左侧栏被推到右侧
- python - 从 Python 中正在运行的进程中读取变量
- python - 如何在python中实现序列?
- autohotkey - win10操作中心如何开启热点
- php - PHP Curl Post 使 ¤cy 变成奇怪的字符
- javascript - 如何从数组中删除特定项目?
- reactjs - 图像未显示在 ReactJs 中