为什么我们需要声明枚举变量?(C)

野本健太

我是第一次开始学习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;
} 

我将枚举视为类。因此,指定使用枚举的变量对我来说没有任何意义。为什么第二种书写方式更常见?

埃里克·波斯蒂奇(Eric Postpischil)

枚举后来被添加到C语言中。因此,它们不是“强类型”的-C并不能将它们与其他整数值区分开来-因此它们在很大程度上很方便。

从理论上讲,您可以将对象声明为枚举类型,以表明该对象应具有枚举中的某些值,而不应包含其他任何值。C标准不要求强制执行。一些编译器在某些情况下可能会警告您违反此规定,但他们无法完全抓住它们。

枚举中的每个标识符都有一个int值。因此,人们将它们用作定义编译时常量的一种方式。这些通常是简单的连续常量,例如一周中的天数,但是它们也可以是任意常量,例如位掩码或内存地址(在int范围内)。那不是他们的真正目的,而是他们有用的东西,所以人们会使用它。

枚举类型和为其定义的任何对象(例如您声明的对象enum day today)必须具有与某种整数类型兼容的类型。例如,如果枚举中的所有值都在的范围内char,则枚举类型可以有效地为char这意味着与声明相比,结构中的空间可能更少int但是,C标准没有要求编译器使用适合的最小整数类型,因此此功能对于依靠枚举来限制使用的空间没有用。

当将一些通用整数值分配给枚举对象时,C标准也不要求任何警告。在现有的枚举设计中,这实际上是不可能的—因为枚举标识符是int值,所以使用它们的任何赋值的右侧(如中today = Monday + 1int)至少是枚举中的一个(显然)值,并且变得很难供编译器诊断问题。

由于存在关于枚举的松散规则,因此没有将对象定义为枚举类型而不是诸如int或的严格规则char可能希望将某种东西定义为一种枚举类型,以传达给源代码的未来读者,该东西正被用来记录该枚举类型,但是也可能希望将其定义为a,uint8_t以确保仅使用一种枚举类型。数组或结构中的字节。因此,选择的理由相互矛盾,因此作者将不得不选择一个或另一个。

通常,如果您只是在代码中使用枚举来保存和使用枚举值,并且它不是数组或结构或其他对空间影响很大的事物的一部分,请使用枚举类型对其进行定义。这最好传达给读者和编译器您的意图。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Java

为什么我们需要事后声明?

来自分类Linux

为什么我们需要mktemp?

来自分类Dev

为什么我们需要指针为Go / C中的变量分配值,而不是C#/ Java中的指针

来自分类Java

为什么我们用Java声明私有变量?

来自分类Dev

为什么我们需要需求?

来自分类Dev

我们为什么需要`ngDoCheck`

来自分类Dev

为什么我们需要单子?

来自分类Dev

为什么在声明变量时,C ++允许我们在括号内将变量名括起来?

来自分类Dev

为什么我们需要C ++中的虚函数?

来自分类Dev

为什么我们不能声明一个类型为void的变量?

来自分类Dev

Swig-为什么我们需要两次声明函数?

来自分类Dev

我们为什么需要容器?

来自分类Dev

为什么我们需要cmake?

来自分类Dev

为什么我们既需要未来又需要承诺?

来自分类Dev

为什么我们需要两个接口来枚举一个集合?

来自分类Dev

什么是稀疏文件,为什么我们需要它?

来自分类Dev

我们为什么需要ʻiteratoreltype()`?

来自分类Dev

为什么我们声明此方法已同步?

来自分类Dev

为什么在使用__syncthreads时我们不需要使用volatile变量

来自分类Dev

为什么我们需要主键?

来自分类Dev

为什么我们需要为Option <T>变量调用take()

来自分类Dev

为什么我们不能立即调用函数声明?

来自分类Dev

为什么我们需要在实体中声明非空构造函数?

来自分类Dev

为什么我们不需要为局部变量提供初始值?

来自分类Dev

为什么我们需要IO?

来自分类Dev

为什么我们需要浮点指针或整数指针分别指向浮点变量或整数变量?

来自分类Dev

为什么我们需要双重定义从 main 传递到方法的变量?

来自分类Dev

什么是 TLS,我们为什么需要它?

来自分类Dev

为什么我们不能在声明结构变量名称时使用连字符?

Related 相关文章

  1. 1

    为什么我们需要事后声明?

  2. 2

    为什么我们需要mktemp?

  3. 3

    为什么我们需要指针为Go / C中的变量分配值,而不是C#/ Java中的指针

  4. 4

    为什么我们用Java声明私有变量?

  5. 5

    为什么我们需要需求?

  6. 6

    我们为什么需要`ngDoCheck`

  7. 7

    为什么我们需要单子?

  8. 8

    为什么在声明变量时,C ++允许我们在括号内将变量名括起来?

  9. 9

    为什么我们需要C ++中的虚函数?

  10. 10

    为什么我们不能声明一个类型为void的变量?

  11. 11

    Swig-为什么我们需要两次声明函数?

  12. 12

    我们为什么需要容器?

  13. 13

    为什么我们需要cmake?

  14. 14

    为什么我们既需要未来又需要承诺?

  15. 15

    为什么我们需要两个接口来枚举一个集合?

  16. 16

    什么是稀疏文件,为什么我们需要它?

  17. 17

    我们为什么需要ʻiteratoreltype()`?

  18. 18

    为什么我们声明此方法已同步?

  19. 19

    为什么在使用__syncthreads时我们不需要使用volatile变量

  20. 20

    为什么我们需要主键?

  21. 21

    为什么我们需要为Option <T>变量调用take()

  22. 22

    为什么我们不能立即调用函数声明?

  23. 23

    为什么我们需要在实体中声明非空构造函数?

  24. 24

    为什么我们不需要为局部变量提供初始值?

  25. 25

    为什么我们需要IO?

  26. 26

    为什么我们需要浮点指针或整数指针分别指向浮点变量或整数变量?

  27. 27

    为什么我们需要双重定义从 main 传递到方法的变量?

  28. 28

    什么是 TLS,我们为什么需要它?

  29. 29

    为什么我们不能在声明结构变量名称时使用连字符?

热门标签

归档