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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.88
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
#1

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

17.08.2013, 11:27. Просмотров 1059. Ответов 9
Метки нет (Все метки)

Что плохого может случится, если переменной установить значения вне диапазона?

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
Сообщений: 323
17.08.2013, 17:16     Перечисления. Переменная не входит в диапазон #2
то, что в фигурных скобках - не есть диапозон, а просто список констант.
C++
1
enum ritm{val1 = 100, val2 = -2, val3 = 71, val4 = 'q'};
внутри типа enum скорее всего содержится объект целого типа, способный помимо списка констант принимать и другие значения.
castaway
Эксперт С++
4869 / 3008 / 370
Регистрация: 10.11.2010
Сообщений: 11,059
Записей в блоге: 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
2442 / 1614 / 235
Регистрация: 24.11.2012
Сообщений: 3,962
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
:)
Эксперт С++
4383 / 3226 / 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     Перечисления. Переменная не входит в диапазон
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4383 / 3226 / 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     Перечисления. Переменная не входит в диапазон
Ответ Создать тему
Опции темы

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