![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Java2 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 26.4.2006 Репутация: нет Всего: нет |
enum flag {a = 3, b = 9};
Согласно Страуструпу переменная типа flag может содержать любое значение в диапазоне 0...15, а не только 3 и 9. К примеру, flag f = flag(5); Вопрос: где здесь логика? Я объявляю константы, потом по ходу могу дополнять это перечисление переменными? Кстати, VC++ 2005 не ругается, если сделать flag(99), что за пределами диапазона. |
|||
|
||||
Daevaorn |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
По поводу значений:
0...15 - это что-то странное и ты скорей всего не правильно понял Страуструпа
Какими переменными ты можешь, дополнять я так и не понял. Ты можешь присвоить переменной типа перечисление любое значение, даже явно не указанное в объявлении.
|
||||||||
|
|||||||||
Java2 |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 55 Регистрация: 26.4.2006 Репутация: нет Всего: нет |
Это был пример из его книги. Он там даже формулу для вычисления диапазона даёт. Это раздел 4.8 специального издания.
В этом и вопрос, зачем присваивать явно неуказанное в перечислении? В чём здесь логика? |
||||
|
|||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 1 Всего: 20 |
||||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Эта тема уже поднималась.
В стандарте четко прописано, что enum является int. |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Буду презнателен, если ты мне покажешь эту часть стандарта. Я этого не нашел. Нашел лишь, то что написал в первом своём сообщении в данной теме. Где говорится, что любой integral тип, который может хранить весь диапозон. Добавлено @ 20:53
|
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Не знаю, правильно я вставляю ссылку на топик или нет, но там как раз обсуждался вопрос преобразования enum
Вроде тут |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Anikmar, нет, там ничего путного нет. Но в принципе и не может быть, enum это любой integral тип.
|
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Исправляюсь. Не int, а целочисленный тип. Может быть unsigned int и (unsigned) long.
Параграф 4.5 черновика стандарта. Добавлено @ 21:15 Но то, что enum - это целый тип, это очевидно - так как там однозначное соответствие константы ее имени, что в других типах достичь нельзя. (char не предлагать - это тоже int) |
|||
|
||||
Daevaorn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
опять мимо ![]()
тут говорится о преобразованиях, а не о том как реализуется enum |
||||
|
|||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 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% уверенностью (не проверял даже) |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Не знаю о чем начал говорить ты, а мы гворили о том на основе чего реализован enum. В пункте 7.5 четко написано что underlying это integral тип. Что собственно я сразу и написал. При чем тут преобразования и не целочисленные константы о которых ты пишешь, я понять не могу. |
|||
|
||||
Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Видимо я неправильно понял суть обсуждаемого вопроса...
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |