关于C中枚举的使用:是否可以更改枚举成员的值?

关于C中枚举的使用:是否可以更改枚举成员的值?,c,enums,C,Enums,因此,这似乎是一个愚蠢的问题,但我想知道是否有任何方法可以更改C中枚举成员的值 例如,假设我有: enum yourcolor{red = 43, blue = 54, green = 89}; enum yourcolor blue-green = red*blue*green; 有没有办法在以后的代码中更改红色、蓝色和绿色的值 我的想法是: yourcolor.red = 56; etc... 我知道你应该用一个struct来做这样的事情,但这只是我今天想的,我找不到答案 任何帮助都将

因此,这似乎是一个愚蠢的问题,但我想知道是否有任何方法可以更改C中枚举成员的值

例如,假设我有:

enum yourcolor{red = 43, blue = 54, green = 89};

enum yourcolor blue-green = red*blue*green;
有没有办法在以后的代码中更改红色、蓝色和绿色的值

我的想法是:

yourcolor.red = 56; etc...
我知道你应该用一个struct来做这样的事情,但这只是我今天想的,我找不到答案


任何帮助都将不胜感激。

否。
枚举中的标识符声明为常量

来自(我的):

枚举器列表中的标识符被声明为常量 具有int类型,并可在允许的任何地方出现

注意,在同一节后面(斜体):

每个枚举类型应与整数类型兼容。这个 类型选择由实现定义,但应能够 表示枚举的所有成员的值


更一般地说,我会质疑这样一个特性的动机。根据定义,枚举是某个集合的所有成员的完整列表,其值在正常情况下可能不应更改。

否。
枚举中的标识符声明为常量

来自(我的):

枚举器列表中的标识符被声明为常量 具有int类型,并可在允许的任何地方出现

注意,在同一节后面(斜体):

每个枚举类型应与整数类型兼容。这个 类型选择由实现定义,但应能够 表示枚举的所有成员的值


更一般地说,我会质疑这样一个特性的动机。根据定义,枚举是某个集合的所有成员的完整列表,其值在正常情况下可能不应更改。

不,这是不可能的。嗯,它可以在不同的翻译单元中工作,尽管这可能不是你想要的

但您可以使用变量:

typedef int color;
color red = 43;
color blue = 54;
color green = 89;

这些可以更改。

不,这是不可能的。嗯,它可以在不同的翻译单元中工作,尽管这可能不是你想要的

但您可以使用变量:

typedef int color;
color red = 43;
color blue = 54;
color green = 89;

这些都是可以改变的。

我想这不太可能。枚举值很可能在编译时被常量静态替换,因此分配给它们的行为将是古怪的(最坏的情况),或者作为错误被拒绝(最好的情况)。

我认为这不太可能。枚举值很可能在编译时被常量静态替换,因此分配给它们的行为将是古怪的(最坏的情况),或者作为错误被拒绝(最好的情况)。

这似乎没有意义。枚举实际上是常量,我假设它们被硬编码到机器指令中


这意味着程序无法知道它们何时更改。如果你在一个非线性的程序中改变了它,当你跳回时会发生什么?像在循环或goto语句中一样?

这似乎没有意义。枚举实际上是常量,我假设它们被硬编码到机器指令中

这意味着程序无法知道它们何时更改。如果你在一个非线性的程序中改变了它,当你跳回时会发生什么?就像在循环或goto语句中一样?

简短的回答是“否”--定义枚举常量后,不能更改其值

从语义上讲,这样做没有任何意义。使用枚举类型背后的全部要点是抽象出底层表示——您关心的是颜色是红色,而不是43或56或其他颜色。换句话说,如果
red
是43或56很重要,那么就不应该使用枚举

当您创建枚举类型的对象时,您基本上是说该对象只能接受其中一个枚举值;它可以是
红色
蓝色
绿色
。如果要表示二级颜色,则需要为这些二级颜色定义枚举常量。您可以根据包含原色的表达式定义这些二级。以下是许多可能的编码之一:

enum color {black   = 0x00,              // binary 0000
            red     = 0x01,              // binary 0001
            blue    = 0x02,              // binary 0010
            green   = 0x04,              // binary 0100
            magenta = red | blue,        // binary 0011
            cyan    = blue | green,      // binary 0110 
            yellow  = red | green,       // binary 0101
            white   = red | blue | green // binary 0111
};
显示的编码很方便;它们显示了如何从原色构建二次颜色。他们也是完全武断的;您可以将类型定义为

enum color {black, red, blue, green, magenta, cyan, yellow, white};
而且根本不用担心基础值(分别是0、1、2、3、4、5、6和7)

通过创建此类型,您意味着
枚举颜色类型的对象应仅具有以下值之一:
黑色
红色
蓝色
绿色
洋红
青色
黄色
、或
白色
(与基础整数值无关)

当然,C对此并不严格:枚举类型的对象可以包含任意整数值,即使该值没有出现在枚举常量列表中。但这样做,您打破了该类型所隐含的概念模型。

简短的回答是“否”“--定义枚举常量后,不能更改其值

从语义上讲,这样做没有任何意义。使用枚举类型背后的全部要点是抽象出底层表示——您关心的是颜色是红色,而不是43或56或其他颜色。换句话说,如果
red
是43或56很重要,那么就不应该使用枚举

当您创建枚举类型的对象时,您基本上是说该对象只能接受其中一个枚举值;它可以是