![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
gendalf7771 |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 19.7.2012 Где: Архангельск Репутация: нет Всего: нет |
Доброго времени суток!
Изучаю перечисления enum, и возник вопрос - как пользоваться нумерацией этого типа? Пытался скомпилировать это:
Результат ожидал такой: x1: 0 y1: 3 z1: 6 x2: 3 y2: 6 z2: 9 x3: 6 y3: 9 z3: 12 Вместо этого получил
Как же использовать нумерацию перечислений? И если можно, какой-нибудь примерчик, в котором чётко видно преимущество enum перед массивами ![]() |
||||
|
|||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
перечисления используются для создания именованных констант.
Это сообщение отредактировал(а) bsa - 19.7.2012, 10:58 |
|||
|
||||
gendalf7771 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 19.7.2012 Где: Архангельск Репутация: нет Всего: нет |
Да, это я понимаю. В своём коде я указал трём константам их имена - 0,1,2. Хочется узнать, что нужно сделать, чтобы происходила замена имени на значение.
Я имел ввиду, что можно ведь просто массив строк создать и не мучаться. Но ведь enum'ы для чего-то другого создавались, наверное. Также можно и #define пользоваться, тогда зачем enum? Или у меня в корне неверное представление о перечислениях? |
|||
|
||||
unclebenedict |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 30.3.2012 Репутация: нет Всего: нет |
Видимо ты просто не совсем понимаешь для чего нужны перечисления. Их часто используют для ослеживания состояний(например при интернет соединении) или ими достаточно удобно задавать свойства. Но я ниразу не встречал что бы перечислению что то присваивали
![]() Это сообщение отредактировал(а) unclebenedict - 19.7.2012, 11:27 |
|||
|
||||
gendalf7771 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 19.7.2012 Где: Архангельск Репутация: нет Всего: нет |
Посмотрел, спасибо) Однако всё ещё не вижу отличия от того же #define.
![]() Честно, смотрел описание enum на cplusplus.com и в темах здесь, и в интернете читал много Это сообщение отредактировал(а) gendalf7771 - 19.7.2012, 11:46 |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
gendalf7771, #define это операция препроцессора. В место использования макроса тупо подставляется значение. В итоге, результат может в корне отличаться от ожидаемого, так как компилятор не всегда способен понять, что именно ты хотел получить и предупредить тебя об опасности. В случае перечислений компилятор такие проверки сделать уже может. И если ты попытаешься присвоить левое значение переменной типа перечисления, то он тебя пошлет. Что есть совершенно правильно. Препроцессор вообще зло. И использовать его нужно только тогда, когда других вариантов не остается.
|
|||
|
||||
gendalf7771 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 19.7.2012 Где: Архангельск Репутация: нет Всего: нет |
Спасибо всем! Разобрался
![]() |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
||||
|
||||
math64 |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Для задания констнты нужно пользоваться не enum, а const:
Будет компилироваться enum используется для связанных значений, которые может принимать переменная:
В случае если в switch будет пропущен один из case компилятор выдаст предупреждение. |
||||
|
|||||
EvilsInterrupt |
|
||||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: нет Всего: 9 |
Почему? А если так:
? |
||||
|
|||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
EvilsInterrupt, перечисления менее универсальны, чем константные переменные (доступны только целые значения и нельзя разделить объявления и определения). Но под них гарантированно не выделяется память в сегменте данных.
|
|||
|
||||
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: нет Всего: 9 |
bsa,
Ну так это же хорошо, что гарантированно не выделяется! Если константа очень редко используется, то в некоторых случаях мы от этой вставки только выигрываем. Еще раз перескажу сказанное тобою: Как правило enum-константы вставляются прямо по месту в коде, а секции кода очень часто в исполнимых файлах помечаются только с атрибутами по чтению и выполнению. А константы по методу const int очень часто ложатся в секцию данных с атрибутом на чтение и в коде указатель на эту область. Что не особо хорошо. Пересказал, только лишь для того чтобы другие, кто не знал, понимали еще одно отличие этих констант. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
не в этом главное отличие константы от енума.. |
|||
|
||||
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: нет Всего: 9 |
А никто и не говорил, что это главное! ;) |
|||
|
||||
gendalf7771 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 19.7.2012 Где: Архангельск Репутация: нет Всего: нет |
mes, можно поподробнее об остальных отличиях?
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |