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

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

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

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

17.08.2013, 11:27. Просмотров 1163. Ответов 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;
}
Эта программа не выдает никаких ошибок. И при компиляции даже нет никаких предупреждений
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2013, 11:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перечисления. Переменная не входит в диапазон (C++):

Диапазон перечисления enum и его размер. - C++
Объясните,пожалуйста,точный,на Ваш взгляд,смысл диапазона перечисления enum и есть ли связь размера и диапазона? Точнее: Например,есть...

Написать рекурсивную функцию, проверяющую, входит или не входит элемент Е в не пустой список L, состоящий из вещественных чисел - C++
Помогите решить задачу, очень нужно Написать программу в которой объявить рекурсивную функцию, проверяющую, входит или не входит...

Глобальная переменная определена в хидере. Компилятор ругается на то, что переменная переопределена несколько раз - C++
Исходники: /* main.cpp */ #include &quot;hider.h&quot; int main(void) { return 0; } /* foo.cpp */

Переменная или переменная и условие - C++
Привет всем. Стало интересно. Есть предположим функция. В ней ссылкой передается аргумент Status; Как лучше сделать? ...

4.53. Дано трехзначное число. Определить: а) входит ли в него цифра 6, б) входит ли в него цифра n - C++
4.53. Дано трехзначное число. Определить: а) входит ли в него цифра 6, б) входит ли в него цифра n

Перечисления.. - C++
страна(Германия,Куба,Бирма,Монако,Непал,Польша,Кения) континент(Азия,Америка,Европа,Африка) страна s; континент k; По названия...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
no_wearines
52 / 48 / 2
Регистрация: 01.01.2012
Сообщений: 324
17.08.2013, 17:16 #2
то, что в фигурных скобках - не есть диапозон, а просто список констант.
C++
1
enum ritm{val1 = 100, val2 = -2, val3 = 71, val4 = 'q'};
внутри типа enum скорее всего содержится объект целого типа, способный помимо списка констант принимать и другие значения.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 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
2460 / 1632 / 238
Регистрация: 24.11.2012
Сообщений: 4,015
18.08.2013, 09:34 #5
BigLow, Undefined behavior (http://ru.wikipedia.org/wiki/%D0%9D%...BD%D0%B8%D0%B5)
Schizorb
509 / 461 / 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
Сообщений: 85
07.03.2015, 11:31 #7
Цитата Сообщение от BigLow Посмотреть сообщение
enum flag{x=1, y=2, z=4, e=8}; // диапазон: 0..15
Что-то никак не врублюсь, что такое "диапазон: 0..15", объясните плиз - 15 чего?
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
07.03.2015, 12:10 #8
VIKT0R, в базе перечисления (enum) лежит целое число. Если ни один из флагов не установлен получим число 0, если установлены все, то 15. В сумме - 16 комбинаций.
VIKT0R
8 / 8 / 2
Регистрация: 15.11.2011
Сообщений: 85
07.03.2015, 14:48 #9
Не понял

Добавлено через 2 часа 22 минуты
А-а, наверно имеется в виду 16-разрядная система, поэтому int представлен 16 битами?
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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};
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.03.2015, 17:22
Привет! Вот еще темы с ответами:

Перечисления - C++
Здравствуйте. Возник вопрос по использованию перечилсений в С++. Есть код: enum value {x = 1, y = 2, z = 4, e = 8}; int main(int...

Перечисления - C++
Добрый день, проблема в том чтобы использовать запись вида enum values { 2,3,4,5,6,7,8,9,10,J,Q,K,A } компилятор ругается на...

Перечисления в классах - C++
Не могу понять почему в классах работают перечисления? Я не могу в классе обьявить константу, но я могу ее за менить перечислением вроде...

Задание на перечисления - C++
Напишите программу,которая сначала по первой букве должности,введенной пользователем, определяет соответствующие значение переменной,...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
07.03.2015, 17:22
Ответ Создать тему
Опции темы

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