Б. Страуструп - Язык программирования С++. Специальное издание, 3-изд. Бином. 2004 (1160791), страница 26
Текст из файла (страница 26)
На многих машинах объем памяти, время доступа и скорость вычисления существенно зависит от выбора типа. Если вы знаете архитектуру машины, как правило, несложно выбрать подходящий целый тип для конкретной переменной, Гораздо сложнее написзть реально переносимый код. Размеры объектов в С++ выражаются в единицах размера ейаг. Таким образом, размер ейаг по определению равен !. Размер объекта илп типа можно получить с помощью оператора з!геоГЯ 6.2).
По поводу размеров фундаментальных типов гарантируется следующее: ! — = гцгео!" )еппг) < еГгео! )Яоп) < е!геоЯпй < е!геоЯопй) ! < аггее/)йао!) < е!геоЯопд) еггео!)сйпг) <спгеп!)шеПпг !) < еГгео!)!опт) еГгео!')йоай < агеоДе)опйе) < вгеоЯопд попйе) пгео" у«)п — пгеодегдпе~)я = ангес!)ппеГдпед Ф) где Лг может быть слиг, због! 2лй !л! или !огш' !лп Кроме того гарантируется, что для представления сйаг используется по меньшей мере 8 бит, для представления ейог!— по меньшей мере 16 бпт и для!олп' — по меньшей мере 32 бита. Переменная типа епаг может хранить .любой символ пз мапшнного набора символов.
Приведем графическое представление некоторого набора фундаментальных типов и строки: Глава 4. Типы и объявления 114 '('аз, Д~ ~756 ~ ~~ооооооо2 сЬаг зЬок 1пс 1вт'. с)опЬ1е: сЬаг114): бс1 Не!!о, чгог16110 оп! гпа!п ',1 ( в!й,.сои! « "наибольшее число с плавающей гпочкой == «в!йспитег!с йтнв тах 0«",тип сбагзнаковый ==" «и!й:.витек!с 1!т!!вшв в!иней <' 'о и', Фундаментальные типы можно свободно смешивать в операциях присваивания и в выражениях. Там где это возможно, значения преобразовываются без потери информации Я В.б). Если значение и может быть точно представлено в переменной типа Т, преобразование и в Тою ведет к потере информации, и проблем не возникает. Лучше избегать преобразований типов, которые приводят к потере инфорлсации Я В,6.2.6). Для того чтобы довести до конца большой проект и в особенное~и для того, чтобы понимать реальный код, написанный другими, необходимо знать правила неявных преобразований.
Однако для чтения следующих глав этого не требуется. 4.7. Тип чоЫ Синтаксически тип иоЫявчяется фундаментальным типом, Однако, его можно использовать только как часть более сложного типа, так как объектов типа иоЫ не существует. !тот тип используется либо для указания па то, что функция не возвращает значения, .поо в качестве базового типа для указателей на объекты неизвестного типа. Например: ио!йх,,Ч ошибка: не суи1ествует объектов типа иоос! ио!йД,,ГоГфунко1гоя(не возвращает значение (Л" Е1 иогй'ри, у! укшзагогель на обьект ненвлсо" н,штина 1б б Ь! При данном масштабе (0.2 дюйма на байт), мегабайт памяти растянется на три мили (пять километров).
Предполагается, что в конкретной реализации размер тица айаг будет выбран наиболее подходящим для хранения и манипулирования символами на данном компьютере; обычно байта (8 бит) достаточно. 1!одобным же образом размер типа !п1 будет выбран наиболее подходящим для хранения целых чисел и выполнения операций над ними на данном компьютере; обычно это 4-байтное слово (32 бита). Неразумно предполагать что-либо кроме этого. Например, есть машины с 32-битным типом сйаг Если возникнет необходимость, значения, зависящие от конкретной реализапии, можно получить нз <1!т!!з> Я 22.2). Например: №тс1ийе <1гтпл> №!пс(иде <!овггеат 115 4.8.
Перечисления При объявлении функцни вы должны указать тип возвращаемого значения. Логично предположить, что для указания того, что функция не возвращает значение, нужно просто опусти~ь тип. Это, однако, сделало бы синтаксис менее единообразным (см. приложение !т) н противоречило бы правилам языка С. Как следствие, в качестве < псевдотипа возвращаемого результата» используется тип ооЫ, указывающий на отсутствие возвращаемого значения.
4.8. Перечисления Тип епит (перечисление) задает набор значений, определяемый пользователем. После своего определения перечисление используется почти так же, как и целые типы. В качестве элементов перечисления можно определить имснованные целые константы. Например: спит ( АБМ, АЮТО, В((ЕАК); определяет три целые константы, называемые элементами перечисления, и присваивает пм значения. По умолчанию, элементам перечисления прнсванваются значения начиная с нуля; значение для каждого следующего элемента увеличивается на единицу. Таким образом.
АЗМ-=О, А(!ТО==! и ВИЕАК==2. Перечислению можно присвоить пмя. Например: спит Ьеуитгд(АБМ, АСТО, ВРЕАК), Каждое пере шсление является отдельным типом. Типом элемента перечисления является само перечисление, Например, АРТО имеет тип йеуюогд. Объявление переменной типа йеувоЫ, а пс простого (и(, подсказывает пользователю и компилятору, как предполагается употреблять эту переменную.
Например, в случае оо(д! 'глеуюогд Ьеу) ( пицсЬ (йеу) ( саьеАЗМ ,Ч некоторые дейстеип Ьгеай; сазе ВРЕАК. О неколпорые действия Ьгеай; компилятор может выдать предупреждающее сообщение о том, что проверены только два значения йеутооп( пз трех возможных, Перечисление можно инициализировать константным' выражением Я В.б) интегрального типа Я 4.1.1). Диапазон значений перечисления определяется следующим ооразом. Пусть и — максимальное возможное значение элемента перечисления. Пусть и такое минимальное целое, что 2 -! больше или равно и, Тогда верхняя граница диапазона равна 2" — !. Если наименьший элемент имеет неотрицательное значение, нижняя граница диапазона равняется нулю.
Если наименьшее значение элемента отрицательно, Мы используем прилагательное «константный», чтобы подчеркнуть связь с модификатором сопит — Т(рилеч. род Глава 4. Типы и объявления 1сб нижней границей диапазона является наименьшая бэсссжайспая отрицатеэп,ная степень двойки плюс 1. Таким образом, диапазон определяегся минимальным количеством бнт, требуемым для представления значений всех элементов перечисления. Например: епит е1 ( с!а»К 11аЬГ); //диапозон 0:1 епите2(а=3,Ь=9); // диапазон О. 15 епит еЗ ( пип = — 10, так =1000000), //диапазон -104857б:1048575 Значенссе интегрального типа можно явно привести к типу перечисления.
Если значение находится вне пределов диапазона, результат преобразования не определен Например: епит/!а8(к =1, у =2, х = 4, е= 8) //диапазон 0 15 Яау/1 = 5, //ошибка типа: 5 не принадлежит тсспу)уа8 !Гав!2 =!!ау(5); //прссвссльно — ))иу (5) исмет тссп/Са8 // и находигпся в пределах диапазона ба8 Яа818 =Дав (х(е~; //правильно — Яау (12) илсеет тсспЯад //и находится в пределах див»сазана/)аа 7)а814 =1(ад(99) //не определено; 99 находится О вне пределов диапозона)са8 Последнее прис ванванне демонстрирует причину отсутствия неявного преобразования целого в перечисление.
Большинство целых значений не имеет представления в произвольно взятом конкретном перечислении. Понятие диапазона значений перечисления в Ся 4 отличается от поня~на перечисления в языках типа Рааса(. Несмотря на это, примеры манипулирования бнтамп, требующие, чтобы значения вне набора элементов перечисления были корректно определены, имею~ долгую историю в С н С +. Размер (зсяео7) перечисления является размером некоторого интегрального типа, который в состоянии содержать весь диапазон значений перечисления. Результат не больше, чем всхеоЯспс) при условии, что элементы перечисления представилсы в виде Гасили сспзсдлес(спс.
Например, зсяео/(е1) может равнячься 1 плп 4, но не 8 ца машине, где зсгео/(спГ)==4, По умолчанию при выполнении арифметических операций перечисления преооразуются в целые (9 6.2). Перечисления являются типами, определяемыми пользователем, так что для них можно вводи~ь свои собственные операции, например +" пли «(9 11.2.3). 4.9. Объявления Прежде чем пмя (идентификатор) может быть использовано в программе на С оно должно быть объявлено.
То есть должен быть указан тип имени, чтобы компиляторр знал, на сущность какого вида ссылается имя. Приведем несколъко примеров, с члюстрирующнх различные объявления. сваг сЬ, зсгспа 3, сп1 саит = 1, сопл! йоош» и З С 41 З92О585897982485, ех1егп спс еггог ттсЬег, 4.9. Объявления сопкгсЬаг' лите = "Ьг?а!"; сон к1 сбаг" кеакоп!) = ( "весна", легло", "осень', 'зима" ); к1гис1 Ра1е(гас(, т, у; ); !п1<(агг (Ра1е" р) ( ге1игп р- г?, ) агоиЫе кдгг (с(оиЫе); гетр!а1е-с1акк?' Тпбк(Та)(ге1игп а<0?-а а;) гггрег?ег' совр!ех<кбогг> Рошй кггис1 ?гкег; епит Веег(Саг!вбегу, Тобаго, Тбог), патекрасеЖЯ( ш1а, ) Как видно из этих примеров, об ьявленпя могут делать нечто большее, чем просто связывание типа с именем. Большинство обьявлений являются еще и оггределениями, то есть они определяют некую сущность, которая соответствует имени.
Для переменной сЬ этой сущностью является подходящее количество памяти; память будет выделена. Для г?ау — это функция. Для константы р! — значение 3.1415926535897932385. Сущностью Ри!е является новый тпп. Для Рошг — тип сопгр!ех<кбогра так что Рош1 с<гаиовится синонимом сотр(ел<к бог(>. Из всех приведенных выше объявлений только г?оиб!е кдгг(г?оиЫе), ех1егп т1еггог питбег; кггис1 ??кег, не являются определениями.