|
Переменные перечислимых типов могут выводиться, а перечислимые литералы могут вводиться при наличии пакета TEXT_IO языка Ada. Эти операции требуют настраиваемых реализаций встроенных пакетов для специфических перечислимых типов.
Типы BOOLEAN и CHARACTER языка Ada фактически являются встроенными перечислимыми типами. Обычными операциями с перечислимыми типами являются определение предшествующего и последующего элементов, позиции в списке величин и значения данной позиции. В Pascal эти операции предоставляются встроенными функциями. Например, значение функции Pred (blue) равно red. В Ada эти операции являются атрибутами. Например, значение LETTERS'PRED ('В') равно 'А'.
Перечислимые типы способствуют повышению читабельности и надежности программ. Читабельность улучшается непосредственно: именованные значения легко различаются, тогда как закодированные – нет. Закодированные элементы бессмысленны для всех, кроме автора программы. Предположим, что программе на языке FORTRAN потребуется переменная, принимающая значения десяти различных цветов. Скорее всего, названия цветов будут закодированы в виде целых чисел 1, 2,..., 10. Использованные для кодировки целочисленные значения малоосмысленны. Если, например, константа 4 обозначает голубой цвет, и это значение присваивается переменной, то этот факт будет далеко не очевидным читателю программы.
С точки зрения надежности перечислимые типы предоставляют два преимущества. Во-первых, если целая переменная используется программистом для кодирования, требующего небольшого диапазона целых значений, то может появиться ошибка выхода из диапазона, которая не будет обнаружена системой поддержки исполнения программ. Во-вторых, допускается применение любого арифметического оператора к закодированным дням и любым целым числам, поскольку типы этих величин будут совпадать. Это исключает обнаружение компилятором многих логических ошибок и опечаток, связанных с закодированными данными. Поскольку в языках ANSI C и C++ перечислимые переменные рассматриваются как целые, то ни одного из этих преимуществ данные языки не имеют.
Таким образом, использование вместо целого типа перечислимых типов, подобных определенному выше типу LETTERS, ограничивающих присваиваемые значения небольшим диапазоном, улучшает читабельность и обеспечивает проверку типов.
В силу указанных недостатков типы enum (перечислимые типы) языков C и C++ не включены в язык Java. Они имеются в C#, но подчиняются более строгим правилам. Для использования числовых значений членов перечисления в C# необходимо явно приводить их к соответствующему целочисленному типу, например:
public enum Numbers
{
zero, one, two
}
…………………………………………..
MessageBox.Show (((int) Numbers.two * 2).ToString());
4.4.2. Ограниченные типы
Ограниченным типом называется непрерывная подпоследовательность порядкового типа. Например, тип 12..14 является ограниченным целым типом. Впервые ограниченные типы появились в языке Pascal, также они имеются в языках Modula-2 и Ada.
В языке Pascal объявление ограниченного типа выглядит следующим образом:
Type
TUpperCase = 'A'..'Z'; TIndex = 1..100;
Связь ограниченного типа с его родительским типом устанавливается путем сопоставления величин в определении ограниченного типа с соответствующими величинами в ранее объявленном или встроенном порядковом типе. Тип TUpperCase в приведенном выше примере определен как ограниченный встроенный тип отдельных символов. Тип TIndex определен как ограниченный тип целых чисел.
В языке Ada ограниченные типы относятся к классу подтипов. Они не являются новыми типами, но лишь дают новые имена ограниченным версиям существующих типов. Предположим, что тип DAYS определен как в предыдущем разделе, и запишем следующее:
subtype WEEKDAYS is DAYS range Mon..Fri;
subtype INDEX is INTEGER range 1..100;
В этих примерах сужение существующих типов касается диапазона возможных значений. Все операции, определенные для породившего типа, определены и для подтипа, за исключением операции присваивания значений, не входящих в заданный диапазон. В следующих командах
DAY1: DAYS;
DAY2: WEEKDAYS;
DAY2:= DAY1;
присваивание разрешено только в случаях, когда значение переменной DAY1 не равно Sat или Sun. В языках Pascal и Modula-2, как и в языке Ada, подтипы наследуют все разрешенные родительскому типу операции.
Определяемые пользователем порядковые типы часто используются в качестве индексов массивов. Они также могут использоваться переменными циклов. В языке Ada, например, подтипы порядковых типов являются единственным способом указания переменных цикла for.
Отметим также, что в Ada ограниченные типы значительно отличаются от производных типов. Рассмотрим следующие объявления:
type DERIVED_SMALL_INT is new INTEGER range 1..100;
subtype SUBRANGE_SMALL_INT is INTEGER range 1..100;
Переменные обоих типов, DERIVED_SMALL_INT (производный тип) и SUBRANGE_SMALL_INT (подтип – ограниченный тип), наследуют область значений и операции над переменными типа INTEGER. Тем не менее, переменные типа DERIVED_SMALL_INT не совместимы ни с каким типом INTEGER, тогда как переменные типа SUBRANGE_SMALL_INT совместимы с величинами типа INTEGER и любого его подтипа.
Ограниченные типы улучшают читабельность программ, показывая, что переменные подтипа могут содержать только определенный диапазон значений. Надежность при использовании ограниченных типов повышается, поскольку присвоение переменной такого типа некоторого значения, лежащего вне разрешенного диапазона, диагностируется компилятором (если присваиваемое значение является литеральной величиной) или системой поддержки выполнения (если это переменная или выражение) как ошибка.
4.4.3. Реализация порядковых типов
Для реализации перечислимых типов необходимо установить соответствие между неотрицательными целым числами и символьными константами. Обычно по умолчанию первое из перечисляемых значений представляется числом 0, второе – числом 1 и так далее. Операции с переменными перечислимых типов значительно отличаются от операций с целыми числами, исключением являются только операторы отношений, идентичные для обоих случаев. Как указывалось ранее, перечислимые типы языков ANSI C и C++ рассматриваются как целые типы.
Ограниченные типы реализуются так же, как и породившие их типы, за исключением того, что в каждом операторе присваивания и в каждом выражении, которые содержат переменную ограниченного типа, компилятор должен выполнять неявную проверку выхода значения переменной за пределы допустимого диапазона. Это увеличивает размер программы и время ее выполнения, однако хорошо оптимизированный компилятор может минимизировать количество проверок.
Дата добавления: 2014-12-15; просмотров: 134 | Поможем написать вашу работу | Нарушение авторских прав |