为什么不是';C编译器没有检查枚举吗?
下面的文本是C语言的创建者所写的一段摘录(因此我认为它是正确的): 尽管可以声明枚举类型的变量,但编译器无需检查存储在此类变量中的内容是否是枚举的有效值 我有一些疑问:为什么不是';C编译器没有检查枚举吗?,c,compiler-construction,enums,C,Compiler Construction,Enums,下面的文本是C语言的创建者所写的一段摘录(因此我认为它是正确的): 尽管可以声明枚举类型的变量,但编译器无需检查存储在此类变量中的内容是否是枚举的有效值 我有一些疑问: 对于C语言中的哪些情况,编译器不检查enum的值 enum由于某些原因,未检查常量。为什么不呢?原因是什么 由于编译器未检查enum,因此使用enum是否容易出错?请解释一下 您可以像这样进行枚举 enum status { ST_READY = 1 << 0, /* 1 */ ST_WAIT =
enum
的值enum
由于某些原因,未检查常量。为什么不呢?原因是什么李>
enum
,因此使用enum
是否容易出错?请解释一下enum status {
ST_READY = 1 << 0, /* 1 */
ST_WAIT = 1 << 1, /* 2 */
ST_ERROR = 1 << 2, /* 4 */
ST_HALT = 1 << 3, /* 8 */
ST_ETC = 1 << 4, /* 16 */
};
并将其设置为按位或某些“简单”状态
status = ST_WAIT | ST_ERROR; /* recoverable error */
请注意,值ST|u WAIT | ST_ERROR
为6
,并且该值不是枚举的一部分
回答您的问题:
enum E { A, B } x;
x = 10000;
没有编译器错误。此外,枚举中的开关
不检查穷举性
2) 出于某些原因,为什么不检查枚举常量?这些原因是什么
人们喜欢把整数放进去。例如
enum E { END_OF_EVERYTHING = 5 };
其中0-4表示普通值,5表示特殊值
enum E { A = 1, B = -1 };
此枚举仅包含2位数据(值-2、-1、0、1)。如果你给它赋值10000,奇怪的事情可能会发生(实际看到)。+1c只是假设你知道自己在做什么,并让你以尽可能有效的方式处理它——还有:g/foot/s//head/@asc99c:我会像
:%s/foot/head/g
@pmg你能说1@Ant's:任何向左(或向右)移动的值吗0
位是初始值本身。我只是将它用于其他行的simmetry。有人认为这是/questions/432937/net的副本。为什么不检查枚举范围值。他们可能改变了主意(答案是一样的,但问题毕竟是关于一种不同的语言),但不可能取消投票。enum
s的另一个好处是,如果有一个开关
块打开enum
,一些编译器会警告您,在代码> >代码>子句中留下一个。对于一些编译器,我认为这是一个恼人的事情,而不是关于<代码> EnUM<代码>的一件大事。很有可能,甚至很有可能,由于先前的逻辑排除了其他值,某个开关
只处理可能的enum
值的子集…@R..:在这种情况下,您只需添加default:/*error handlign code*/
以使警告静音代码>,你怎么能说这些值是-2,-1,0,1?
enum E { A = 1, B = -1 };