【问题标题】:Difference between the following declarations?以下声明之间的区别?
【发布时间】:2017-05-06 22:18:43
【问题描述】:

我有枚举类型,颜色:

enum colors {green, red, blue};

colors mycolors=red 是否与int yourcolors=red 相同,每个枚举器的类型是int?两者的值都是 1,对吧?

谢谢!

【问题讨论】:

  • 枚举被实现为数字(可能是 int,但可能更小),但是将它们保持在接近零的窄范围内可以允许编译器进行更多优化(例如,编译器可能决定它们可以如果有帮助,可以塞进一个字符中)。这些值实际上在内部是相同的,但您最好尽可能使用枚举,因为它们抽象出底层的数字类型。另请注意,其他相关语言在这方面比 C++ 更严格。您可以在 C++ 中交换整数和枚举,但不能在 C# 中交换(即使它将存储为数字)。
  • 如果您使用 C++11 编码,只需使用 enum class
  • mycolors的类型是colorsyourcolors的类型是int
  • 试试bool mycolors = red;double mycolors = red,也是1。
  • @DanielKamilKozar,为什么?并感谢杰森的解释!

标签: c++


【解决方案1】:

我只是想发布一个小代码sn-p来证明Jason Lang和Kerrek SB的cmets:

#include <iostream>
#include  <typeinfo>
enum colors {green, red, blue};

int main()
{   
    colors mycolors=red;
    int yourcolors=red;
    if (mycolors == yourcolors)
        std::cout << "same values" << std::endl;

    if (typeid(mycolors) != typeid(yourcolors))
        std::cout << "not the same types" << std::endl;

    return 0;
}

运行此代码将导致以下控制台输出:

same values
not the same types

另外(正如 Daniel Kamil Kozar 提到的)还有 enum class(仅限 C++11 及更高版本!)。请参阅this Question,了解有关为什么更喜欢enum class 而不是enum 的更多信息。

关于“为什么enums 不仅仅是ints(或longs 或...)之后的问题,请考虑运算符重载。那就是++ colors(green) == 1 一定不是真的。 确认 this Question 可以对普通的 enums 和 this question and the accepted answer 进行运算符重载,以了解如何避免强制转换为“枚举类”的重载运算符。

最后请记住,enums 的使用(如果使用合理的话)可以提高代码的可读性。

【讨论】:

  • 好的,谢谢!但是如果 "mycolors == yourcolors" 为真,那是否意味着 mycolors 的值是 int(1),如果为真,变量不能只是 int 类型而不是颜色
  • 似乎两个变量具有相同值的事实可能意味着两个变量属于同一类型 - 但它们不是。想想0.0 == 0.0f,但doublefloat 不同。 (可能不是最好的例子,但我现在找不到更好的例子。)
  • @Game Ideas:II 完全忘记了运算符重载。我添加了一段关于它的内容。
【解决方案2】:
  • 我认为enum 似乎更安全一些。 int yourcolors=red 可以,colors mycolors=1 不行。
  • 当我调试枚举时,使用很有帮助。它显示枚举名称 而不是它的价值。
  • 枚举值不是左值。所以,当你通过他们 参考,没有使用静态内存。这几乎就像你 将计算值作为文字传递。

enum KEYS
{
    UP,
    RIGHT,
    DOWN,
    LEFT
};

void (KEYS select)
{
    switch (select)
    {
        case UP:
        case RIGHT:
        case DOWN:
        case LEFT: break;
        default: exit(1);
    }
}

【讨论】:

  • 谢谢。因此,有了这些优势,当涉及到是否应该使用 enum 或 int 时,它更多的是关于易读性并使您的代码更高效?还是我错了?
  • 我添加了一个例子。我更喜欢看标签而不是数字,因为它的可读性。
猜你喜欢
  • 1970-01-01
  • 2020-04-20
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 2011-09-20
  • 2020-06-07
  • 1970-01-01
相关资源
最近更新 更多