Короткий ответ «нет» - вы не можете изменить значение константы перечисления после того, как она была определена.
Семантически, в этом нет никакого смысла. Весь смысл использования перечисляемых типов состоит в том, чтобы абстрагироваться от базового представления - вам важно, чтобы цвет был 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
, blue
, green
, magenta
, cyan
, yellow
или white
(независимо от базового целочисленного значения).
Конечно, C не совсем строг в этом: объект перечисляемого типа может содержать произвольное целочисленное значение, даже если это значение не появляется в списке констант перечисления. Но тем самым вы нарушение концептуальной модели, подразумеваемой типом.