Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Зачем такой enum? 
:(
    Опции темы
Java2
Дата 14.1.2007, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 26.4.2006

Репутация: нет
Всего: нет



enum flag {a = 3, b = 9};
Согласно Страуструпу переменная типа flag может содержать любое значение в диапазоне 0...15, а не только 3 и 9.
К примеру,
flag f = flag(5);

Вопрос: где здесь логика? Я объявляю константы, потом по ходу могу дополнять это перечисление переменными?
Кстати, VC++ 2005 не ругается, если сделать flag(99), что за пределами диапазона.
PM MAIL   Вверх
Daevaorn
Дата 14.1.2007, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Java2 @  14.1.2007,  17:48 Найти цитируемый пост)
enum flag {a = 3, b = 9};
Согласно Страуструпу переменная типа flag может содержать любое значение в диапазоне 0...15, а не только 3 и 9.
К примеру,
flag f = flag(5);

По поводу значений:
Цитата(ISO/IEC 14882 Second edition 2003-10-15)

The underlying type of an enumeration is an integral type that can represent all the enumerator values
defined in the enumeration.

0...15 - это что-то странное и ты скорей всего не правильно понял Страуструпа

Цитата(Java2 @  14.1.2007,  17:48 Найти цитируемый пост)
Вопрос: где здесь логика? Я объявляю константы, потом по ходу могу дополнять это перечисление переменными?

Какими переменными ты можешь, дополнять я так и не понял. Ты можешь присвоить переменной типа перечисление любое значение, даже явно не указанное в объявлении. 
Цитата(ISO/IEC 14882 Second edition 2003-10-15)

It is possible to define an enumeration that has values not defined by any of its enumerators.

PM MAIL WWW   Вверх
Java2
Дата 14.1.2007, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 26.4.2006

Репутация: нет
Всего: нет



Цитата(Daevaorn @  14.1.2007,  16:59 Найти цитируемый пост)
0...15 - это что-то странное и ты скорей всего не правильно понял Страуструпа


Это был пример из его книги. Он там даже формулу для вычисления диапазона даёт. Это раздел 4.8 специального издания.


Цитата(Daevaorn @  14.1.2007,  16:59 Найти цитируемый пост)
Какими переменными ты можешь, дополнять я так и не понял. Ты можешь присвоить переменной типа перечисление любое значение, даже явно не указанное в объявлении. 


В этом и вопрос, зачем присваивать явно неуказанное в перечислении?
В чём здесь логика?
PM MAIL   Вверх
Daevaorn
Дата 14.1.2007, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Java2 @  14.1.2007,  19:48 Найти цитируемый пост)
В этом и вопрос, зачем присваивать явно неуказанное в перечислении?
В чём здесь логика? 

так прописано в стандарте. видимо на то у них была своя причина.
PM MAIL WWW   Вверх
En_t_end
Дата 14.1.2007, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 1
Всего: 20



Daevaorn
Цитата(Daevaorn @  14.1.2007,  23:03 Найти цитируемый пост)
то у них была своя причина

Смею предположить, что enum был организован на int. Из-за этого возможно подобные вещи возможны. Полное, в том числе и обратное преобразование не выполняется, в случае присваивания значения и прочего доступа к enum как к int
PM MAIL ICQ Skype GTalk Jabber   Вверх
Daevaorn
Дата 14.1.2007, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(En_t_end @  14.1.2007,  21:29 Найти цитируемый пост)
Смею предположить, что enum был организован на int.

да. но это как один из возможных вариантов реализации, пусть и самый распространенный. Но жестко это не прописано, может быть любой "интегральный" тип.
PM MAIL WWW   Вверх
Anikmar
Дата 14.1.2007, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Эта тема уже поднималась.
В стандарте четко прописано, что enum является int.
PM MAIL ICQ   Вверх
Daevaorn
Дата 14.1.2007, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Anikmar @  14.1.2007,  21:44 Найти цитируемый пост)
В стандарте четко прописано, что enum является int. 

Буду презнателен, если ты мне покажешь эту часть стандарта. Я этого не нашел.
Нашел лишь, то что написал в первом своём сообщении в данной теме. Где говорится, что любой integral тип, который может хранить весь диапозон.

Добавлено @ 20:53 
Цитата(ISO/IEC 14882 Second edition 2003-10-15)

[dcl.enum] 7.2 Enumeration declarations
5
The underlying type of an enumeration is an integral type that can represent all the enumerator values
defined in the enumeration. It is implementation-defined which integral type is used as the underlying type
for an enumeration except that the underlying type shall not be larger than int unless the value of an enu-
merator cannot fit in an int or unsigned int. If the enumerator-list is empty, the underlying type is
as if the enumeration had a single enumerator with value 0. The value of sizeof() applied to an enu-
meration type, an object of enumeration type, or an enumerator, is the value of sizeof() applied to the
underlying type.

PM MAIL WWW   Вверх
Anikmar
Дата 14.1.2007, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Не знаю, правильно я вставляю ссылку на топик или нет, но там как раз обсуждался вопрос преобразования enum
Вроде тут
PM MAIL ICQ   Вверх
Daevaorn
Дата 14.1.2007, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Anikmar, нет, там ничего путного нет. Но в принципе и не может быть, enum это любой integral тип.
PM MAIL WWW   Вверх
Anikmar
Дата 14.1.2007, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Исправляюсь. Не int, а целочисленный тип. Может быть unsigned int и (unsigned) long.
Параграф 4.5 черновика стандарта.

Добавлено @ 21:15 
Но то, что enum - это целый тип, это очевидно - так как там однозначное соответствие константы ее имени, что в других типах достичь нельзя. (char не предлагать - это тоже int)
PM MAIL ICQ   Вверх
Daevaorn
Дата 14.1.2007, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Anikmar @  14.1.2007,  22:13 Найти цитируемый пост)
Исправляюсь. Не int, а целочисленный тип. Может быть unsigned int и (unsigned) long.
Параграф 4.5 черновика стандарта. 

опять мимоsmile
Цитата

[conv.prom] 4.5 Integral promotions
An rvalue of type wchar_t (3.9.1) or an enumeration type (7.2) can be converted to an rvalue of the first
of the following types that can represent all the values of its underlying type: int, unsigned int,
long, or unsigned long.

тут говорится о преобразованиях, а не о том как реализуется enum
PM MAIL WWW   Вверх
Anikmar
Дата 14.1.2007, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Мы говорили о том, как можно работать с переменной типа enum.

В любом выражении С++ будет использовано неявное преобразование. Этот параграф и утверждает, что тип enum неявно преобразовывается к целочисленному типу, достаточному для хранения значения.

Это прописано в стандарте и там не указаны никакие другие типы кроме целочисленных.

Если использовать переменную типа enum в выражениях C++, то можно смело ожидать, что значение неявно будет преобразовано в целочисленное и  никак не иначе.

Думаю ни один компилятор не съест такое объявление:

typedef enum {FirstV = 0.01, SecondV = 0.05} MyEnum;

Если посмотреть параграф 7.2 вышеуказанного черновика стандарта, то там тоже обсолютно четко указывается int и приводится ссылка на уже указанный мною параграф 4.5 о правилах неявного преобразования для типов enum.

К сожалению не могу привести куски из pdf-файла

Добавлено @ 21:31 
p.s.
Как реализованы конкретные типы данных в конкретном компиляторе - этот вопрос не стоит обсуждения - так как обсуждается именно высокоуровневый язык C++.

И если рассматривать два выражения:
enum {FirstV, LastV} AVar;

AVar = FirstV;

if (AVar == 0) // 100% условие согласно стандарту

а вот
int *iPtr;

iPtr = (int*)&AVar;
if (*iPtr == 0) // Вот тут я бы не утверждал со 100% уверенностью (не проверял даже)
PM MAIL ICQ   Вверх
Daevaorn
Дата 14.1.2007, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Anikmar @  14.1.2007,  22:26 Найти цитируемый пост)
Мы говорили о том, как можно работать с переменной типа enum.

Не знаю о чем начал говорить ты, а мы гворили о том на основе чего реализован enum. В пункте 7.5 четко написано что underlying это integral тип. Что собственно я сразу и написал. При чем тут преобразования и не целочисленные константы о которых ты пишешь, я понять не могу.
PM MAIL WWW   Вверх
Anikmar
Дата 14.1.2007, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Видимо я неправильно понял суть обсуждаемого вопроса...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0811 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.