Форум программистов, компьютерный форум CyberForum.ru

Перечисления. Переменная не входит в диапазон - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.88
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
17.08.2013, 11:27     Перечисления. Переменная не входит в диапазон #1
Что плохого может случится, если переменной установить значения вне диапазона?

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
enum flag{x=1, y=2, z=4, e=8};  // диапазон: 0..15
 
int main()
{
    flag    f1 = (flag)90;              // не определено: 90 не входит в диапазон типа flag
 
    std::cout << f1;                    // 90
 
    return 0;
}
Эта программа не выдает никаких ошибок. И при компиляции даже нет никаких предупреждений
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
no_wearines
 Аватар для no_wearines
52 / 48 / 2
Регистрация: 01.01.2012
Сообщений: 322
17.08.2013, 17:16     Перечисления. Переменная не входит в диапазон #2
то, что в фигурных скобках - не есть диапозон, а просто список констант.
C++
1
enum ritm{val1 = 100, val2 = -2, val3 = 71, val4 = 'q'};
внутри типа enum скорее всего содержится объект целого типа, способный помимо списка констант принимать и другие значения.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
17.08.2013, 18:46     Перечисления. Переменная не входит в диапазон #3
Цитата Сообщение от BigLow Посмотреть сообщение
flag f1 = (flag)90; // не определено: 90 не входит в диапазон типа flag
Тут происходит определение константы f1 равной значению 90. Все по канонам языка С++.
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
18.08.2013, 09:23  [ТС]     Перечисления. Переменная не входит в диапазон #4
Цитата Сообщение от castaway Посмотреть сообщение
Все по канонам языка С++.
Страуструп так не считает )
C++
1
2
3
4
enum flag {x=1, y=2, z=4, e=8};
...
flag f2 = flag(5);    // OK: flag(5) принадлежит типу flag и входит в его диапазон
flag f4 = flag(99);  // не определено: 99 не входит в диапазон типа flag
Мне что не понятно во всем этом, так это то, что означает слово "не определено" и какие последствия могут быть от такого присваивания
Миниатюры
Перечисления. Переменная не входит в диапазон  
0x10
2426 / 1598 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
18.08.2013, 09:34     Перечисления. Переменная не входит в диапазон #5
BigLow, Undefined behavior (http://ru.wikipedia.org/wiki/%D0%9D%...BD%D0%B8%D0%B5)
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
18.08.2013, 09:58     Перечисления. Переменная не входит в диапазон #6
BigLow, реальный тип, которым представлен enum может быть больше, чем требуется. Посмотрите, например, чему равен sizeof(flag). Если этого размера будет достаточно, чтобы представить число 90, то ничего удивительного нет.

Другое дело, что Страуструп прав, это неопределенное поведение - компилятор может выбрать тип, минимально достаточный для представления диапазона enum, и большие значения в него "не войдут". Вот пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
enum flag{x = 1, y = 2, z = 4, e = 8};  
 
int main()
{
    flag f1 = (flag)256;             
    
    std::cout << sizeof(flag) << "\n";
    std::cout << f1;                   
 
    return 0;
}
Если скомпилировать в gcc с флагом -fshort-enums, то sizeof(flag) будет 1 байт. То есть минимальный размер, необходимый для представления указанных чисел от 1 до 8. С присвоением 256 будет переполнение, т.к. одного байта уже недостаточно. Короче, все зависит от компилятора и его настроек.
VIKT0R
8 / 8 / 2
Регистрация: 15.11.2011
Сообщений: 78
07.03.2015, 11:31     Перечисления. Переменная не входит в диапазон #7
Цитата Сообщение от BigLow Посмотреть сообщение
enum flag{x=1, y=2, z=4, e=8}; // диапазон: 0..15
Что-то никак не врублюсь, что такое "диапазон: 0..15", объясните плиз - 15 чего?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
07.03.2015, 12:10     Перечисления. Переменная не входит в диапазон #8
VIKT0R, в базе перечисления (enum) лежит целое число. Если ни один из флагов не установлен получим число 0, если установлены все, то 15. В сумме - 16 комбинаций.
VIKT0R
8 / 8 / 2
Регистрация: 15.11.2011
Сообщений: 78
07.03.2015, 14:48     Перечисления. Переменная не входит в диапазон #9
Не понял

Добавлено через 2 часа 22 минуты
А-а, наверно имеется в виду 16-разрядная система, поэтому int представлен 16 битами?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.03.2015, 17:22     Перечисления. Переменная не входит в диапазон
Еще ссылки по теме:

C++ Перечисления
4.53. Дано трехзначное число. Определить: а) входит ли в него цифра 6, б) входит ли в него цифра n C++
Структуры, Объединения, Перечисления C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
07.03.2015, 17:22     Перечисления. Переменная не входит в диапазон #10
VIKT0R, 16 битов дают 2^16 комбинаций, а не 16 комбинаций. 16 комбинаций получается из 4х битов.

C++
1
enum flag{x = 1, y = 2, z = 4, e = 8};
В битовом представлении:
Код
x = 0001b,
y = 0010b,
z = 0100b,
e = 1000b.
Реальное кол-во разрядов для типа flag будет определяться размером базового типа перечисления. По умолчанию это int. Но можно задать и другой базовый тип:
C++
1
2
3
enum flag : char {x = 1, y = 2, z = 4, e = 8};
enum flag : int {x = 1, y = 2, z = 4, e = 8};
enum flag : long long {x = 1, y = 2, z = 4, e = 8};
Yandex
Объявления
07.03.2015, 17:22     Перечисления. Переменная не входит в диапазон
Ответ Создать тему
Опции темы

Текущее время: 15:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru