所以这看起来像是一个愚蠢的问题,但我想知道是否有任何方法可以改变C中枚举成员的值。
例如,我说:
enum yourcolor{red = 43, blue = 54, green = 89};
enum yourcolor blue-green = red*blue*green;
有没有办法在代码中更改红色,蓝色和绿色的值?
我在想这样的事情:
yourcolor.red = 56; etc...
我知道你应该使用这样的结构,但这只是我今天想到的,我找不到答案。
任何帮助都将不胜感激。
答案 0 :(得分:2)
没有。 enum
中的标识符被声明为常量。
来自C99(强调我的):
枚举器列表中的标识符声明为常量 有类型int并且可能出现在允许的地方
注意,稍后在同一部分(斜体矿):
每个枚举类型应与整数类型兼容。该 类型的选择是实现定义的,但应该能够 表示枚举的所有成员的值。
更一般地说,我会质疑这种功能的动机。根据定义,枚举是某些集合中所有成员的完整列表,其值在正常情况下可能不应更改。
答案 1 :(得分:2)
不,这是不可能的。好吧,它可以在不同的翻译单元中工作,虽然这可能不是你想要的。
您可以使用变量:
typedef int color;
color red = 43;
color blue = 54;
color green = 89;
这些可以改变。
答案 2 :(得分:2)
简短回答是“否” - 在定义枚举常量后,您无法更改枚举常量的值。
从语义上讲,这样做没有任何意义。使用枚举类型的重点是抽象出底层表示 - 你关心颜色是red
,而不是43或56或其他什么。换句话说,如果事项 red
是43或56,那么你不应该使用枚举。
当你创建一个枚举类型的对象时,你基本上是说该对象只能接受其中一个枚举值;它可以是red
或blue
或green
。如果要表示二次颜色,则需要为这些辅助颜色定义枚举常量。您可以根据包含原色的表达式来定义这些辅助节点。以下是许多可能的编码之一:
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)。
通过创建此类型,您暗示类型为enum color
的对象应仅采用其中一个值black
,red
,{ {1}},blue
,green
,magenta
,cyan
或yellow
(与底层整数值无关)。
当然,C对此并不完全严格:枚举类型的对象可以保存任意整数值,即使该值没有出现在枚举常量列表中。但是通过这样做,你就是打破了类型隐含的概念模型。
答案 3 :(得分:0)
我认为非常不可能。枚举值很可能在编译时被常量静态替换,因此分配给它们的行为将是古怪的(最坏的情况),或者作为错误被拒绝(充其量)。
答案 4 :(得分:0)
似乎这没有意义。枚举实际上是常量,我认为它们被硬编码到机器指令中。
这意味着程序无法知道它们何时发生变化。如果你在一个非线性的程序中改变它,当你跳回来会发生什么?就像在循环或goto语句中一样?