为什么我们需要声明枚举变量?(C)
我第一次开始学习C语言。 这个问题可能听起来很基本,但我会感谢任何帮助 我的问题是,如果你能为什么我们需要声明枚举变量?(C),c,enums,C,Enums,我第一次开始学习C语言。 这个问题可能听起来很基本,但我会感谢任何帮助 我的问题是,如果你能 enum day { mon, tue, wed }; int main() { int today = mon; return 0; } 要将“today”变量设置为0,为什么大多数教程都这样写 enum day { mon, tue, wed }today; int main() { today = mon; return 0; } 我把
enum day {
mon, tue, wed
};
int main() {
int today = mon;
return 0;
}
要将“today”变量设置为0,为什么大多数教程都这样写
enum day {
mon, tue, wed
}today;
int main() {
today = mon;
return 0;
}
我把enum看作是一个类。因此,指定使用枚举的变量对我来说没有意义。为什么第二种写作方式更常见 枚举实际上是整数。它们用于代码类型正确性、更好的可读性、更好的错误消息传递(现代编译器甚至可能会在switch…case中未使用所有枚举时发出警告)和更方便的调试
enum day {
mon, tue, wed
};
I am seeing enum as something like a class.
这是一种错误的说法
enum表示编译时已知的整数常量。如果不显式地将其初始化,则enum的第一个成员的值为零,下一个成员的值为succ(prev_enum_member)
枚举很重要,因为它们允许编译器选择sizeof(enum),并且因为使用符号而不是硬编码常量更方便思考程序。因此,如果你有一个大的枚举,编译器可以用2个字节的整数替换它,如果你有一个小的枚举,编译器可以选择1个字节的整数,而你不在乎它是怎么做的。枚举是后来添加到C语言的。因此,它们不是“强类型的”-C无法将它们与其他整数值区分开来,因此它们在很大程度上是一种方便 理论上,您可以将对象声明为枚举类型,以指示它应该包含枚举中的某些值,而不是任何其他值。C标准不要求强制执行。某些编译器可能会在某些情况下警告违反此规则的行为,但它们无法全部捕获 枚举中的每个标识符都有一个
int
值。正因为如此,人们使用它们来定义编译时常量。这些通常是简单的连续常量,例如一周中的天数,但它们也可能是任意常量,例如位掩码或内存地址(在int
范围内)。这不是他们真正的目的,但这是他们有用的东西,所以人们使用它
枚举类型和为其定义的任何对象(例如您今天声明的enum day
)必须具有与某个整数类型兼容的类型。例如,如果枚举中的所有值都在char
的范围内,则枚举类型实际上可以是char
。这意味着它在结构中占用的空间可能比声明int
要少。然而,C标准并没有要求编译器使用适合的最小整数类型,所以这个特性对于依赖枚举来限制使用的空间是没有用的
当一些通用整数值被分配给枚举对象时,C标准也不需要任何警告。对于现有的枚举设计,这实际上是不可能的,因为枚举标识符是int
值,使用它们的任何赋值的右侧,如today=Monday+1
,至少是int
,而不是枚举中的值,编译器很难诊断问题
由于这些关于枚举的松散规则,没有关于将对象定义为枚举类型的硬性规则,比如说,int
或char
。您可能希望将某个对象定义为枚举类型,以向源代码的未来读者传达它正用于记录该枚举类型中的内容,但您也可能希望将其定义为uint8\t
,以确保它在数组或结构中仅使用一个字节。因此,这些选择有相互矛盾的原因,作者将不得不选择其中之一
通常,如果您只是在代码中使用枚举来保存和处理枚举值,而它不是数组、结构或其他空间非常重要的东西的一部分,那么请使用枚举类型来定义它。这最能向读者和编译器传达您的意图。枚举对代码类型的正确性几乎没有作用。根据C 2018 6.7.2.2,枚举常量的类型为
int
,并且每个枚举类型必须与char
或某个有符号或无符号整数类型兼容,因此在C标准的规则范围内,它基本上与该类型无法区分。因此,任何编译器在诊断枚举误用方面的帮助都被移植到了上面。