Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2012, 13:13   #1
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию зачем значения енумов мапятся на числа

Типа такого.
Код:
enum DAY      
{
    saturday,   
    sunday = 0,
    monday
}
the_deer_one вне форума Ответить с цитированием
Старый 30.11.2012, 13:20   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

К примеру, чтобы при записи данных в файл другая программа могла прочитать данные благодаря только коду программы, а не настройкам компилятора.
Ещё к примеру, чтобы было определено значение DAY(0).
Abstraction вне форума Ответить с цитированием
Старый 30.11.2012, 13:41   #3
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

the_deer_one

зачем значения енумов мапятся на числа

А на что они должны маппится, на строки? o_O

Впрочем, ты всегда можешь использовать strong typed enum

оно поддерживается в VS2012 (и вроде бы в 2010 тоже)
Rififi вне форума Ответить с цитированием
Старый 30.11.2012, 14:11   #4
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

так, это, если правильно понимаю, то enum - это именованые константы, которые мапятся на значения целочисленного типа, по определению.

вот такое
Код:
enum DAY      
{
    saturday,   
    sunday = 0,
    monday
}
можно и нужно понимать так
Код:
    const unsgined int saturday = 0;   
    const unsigned int sunday = 0;
    const unsigned int monday = 1;
f.hump вне форума Ответить с цитированием
Старый 30.11.2012, 14:39   #5
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,692
По умолчанию

Это следует из определения:
Цитата:
Тип-перечисление (enumeration) - это вариантный тип, в котором с каждым полем ассоциирован тип Unit. Например, тип, представляющий рабочие дни недели, можно определить так:

Код:
Weekday = <monday:Unit, tuesday:Unit, wednesday:Unit,
thursday:Unit, friday:Unit>;
При этом это отображение дней недели на Unit является взаимно однозначным(биекция)

Более подробно в "Типы в языках программирования".
PS: Интересный случай представляют перечисления всего с одним полем. В книге сплошная математика!
Kostia вне форума Ответить с цитированием
Старый 03.12.2012, 11:37   #6
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

Kostia
Цитата:
Это следует из определения:
Это следует из какой-то непонятной практической ценности. Не зря же тут, например, выдают какие то хитрые диапазоны значениям енумов.

http://msdn.microsoft.com/en-us/libr...platetype.aspx
the_deer_one вне форума Ответить с цитированием
Старый 03.12.2012, 12:10   #7
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Это следует из какой-то непонятной практической ценности.
Rififi, уже все объяснил вроде.
А Ваша ссылка здесь вообще ни к чему. enum это общий механизм. То что в ссылке это конкретное значение какого-то левого enuma от Мелкософта. Или мы должны это были на расстоянии в тысячи километров ментально (а может и ректально) определить?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 03.12.2012, 12:41   #8
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,091
По умолчанию

Правильный ответ: так исторически сложилось.
В 10 случаях из 100 это удобно. В 2 случаях из этих 10 это оправдано. Остальное время это не нужно или используется зря.
Исторически сложилось еще с тех времен, когда модно было согласовывать язык с простотой реализации. В плюсах, например, до сих пор добавляют синтаксический сахар с оглядкой на простоту реализации компилятора с поддержкой этой фичи.
int - это самый логичный тип, на котором можно было бы завязать перечисления. "автоматом" получаем и поддержку всяких switch и запись в файл и сравнение, т.е. наличие этого типа с такой реализацией достаточно "дешево" для создателей компиляторов. Так же можно писать крутые программы, в которых потом ничего не понятно, т.к. всё завязано непонятно на чём.
Глубокого смысла показывать программисту, что enum завязан на int и давать ему возможность менять нумерацию, нет. Иногда правильно это использовать при работе с внешними данными. Ну, вот принято, что 404 - это ошибка о том, что страницы нет и ведь круто использовать такую возможность для "бесплатного" проецирования кода ошибки на более понятное имя. Эдакое избавление от "магических" чисел. Хорошо, когда эти коды не меняются и очень плохо, когда это не так или же меняется концепция продукта. Сегодня всё завязано на HTTP и кодах ошибки только этого протокола, а завтра нужно добавить еще и FTP и куча кода идёт на свалку.
Итог: это своеобразный синтаксический "сахар", который достаточно редко может быть действительно нужен, но который не приносит трудностей разработчикам компиляторов и потому пусть будет. Использовать эту возможность внутри своих проектов - моветон, а вот для работы с "чужими" данными - очень даже полезная штука при условии относительного постоянства этих данных.
pu4koff вне форума Ответить с цитированием
Старый 03.12.2012, 14:53   #9
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,692
По умолчанию

Если говорить в терминах c++, то перечисления в нем, вовсе не перечисления, а только упрощенное подобие. К примеру отсутствие возможности задать любой тип для перечисления сводит на нет фишку с перечислением состоящим из одного элемента.
Впрочем эта фишка бы не понадобилась, если typedef работал как скажем в D. Иначе слишком многословно приходится обходить элементарные вещи.

Последний раз редактировалось Kostia; 03.12.2012 в 15:27.
Kostia вне форума Ответить с цитированием
Старый 03.12.2012, 17:42   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну в С++ до С++11 оно в принципе криво было.
как в посту №4.

с появлением enum class оно стало более менее работать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод значения числа в десятичной системе счисления Kaizzer Помощь студентам 0 23.04.2011 14:44
Изменение значения числа при увеличении разрядности PARTOS Microsoft Office Excel 5 25.02.2011 20:56
Даны действительные числа а0 ,..., а6 . Получить для х=1,3,4 значения p(x+1)-p(x), где LiptonICE Помощь студентам 6 29.05.2010 23:27
Pascal нахождение точного значения числа Зорянка Помощь студентам 6 01.07.2009 13:47
SOS, исчезли формулы,остались лишь значения (числа) lyolya Microsoft Office Excel 2 30.07.2008 14:41