Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我们需要声明枚举变量?(C)_C_Enums - Fatal编程技术网

为什么我们需要声明枚举变量?(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; } 我把

我第一次开始学习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看作是一个类。因此,指定使用枚举的变量对我来说没有意义。为什么第二种写作方式更常见

枚举实际上是整数。它们用于代码类型正确性、更好的可读性、更好的错误消息传递(现代编译器甚至可能会在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标准的规则范围内,它基本上与该类型无法区分。因此,任何编译器在诊断枚举误用方面的帮助都被移植到了上面。