![]() |
2 лет назад | |
---|---|---|
.. | ||
README.md | 2 лет назад |
Если вы когда-нибудь программировали на C, C++, Java или C#, то с основными типами данных и выражениями D у вас не будет никаких затруднений. Операции со значениями основных типов – неотъемлемая часть решений многих задач программирования. Эти средства языка, в зависимости от ваших предпочтений, могут сильно облегчать либо отравлять вам жизнь. Совершенного подхода не существует; нередко поставленные цели противоречат друг другу, заставляя руководствоваться собственным субъективным мнением. Это, в свою очередь, лишает язык возможности угодить всем до единого. Слишком строгая система обременяет программиста своими запретами: он вынужден бороться с компилятором, чтобы тот принял простейшие выражения. А сделай систему типизации чересчур снисходительной – и не заметишь, как окажешься по ту сторону корректности, эффективности или того и другого вместе.
Система основных типов D творит маленькие чудеса в границах, задаваемых его принадлежностью к семейству статически типизированных компилируемых языков. Определение типа по контексту, распространение интервала значений, всевозможные стратегии перегрузки операторов и тщательно спроектированная сеть автоматических преобразований вместе делают систему типизации D дотошным, но сдержанным помощником, который если и придирается, требуя внимания, то обычно не зря.
Основные типы данных можно распределить по следующим категориям:
void
, используется во всех случаях, когда формально требуется указать тип, но никакое осмысленное значение не порождается.typeof(null)
– тип константы null
, используется в основном в шаблонах, неявно приводится к указателям, массивам, ассоциативным массивам и объектным типам.bool
с двумя возможными значениями true
и false
.byte
, short
, int
и long
, а также их эквиваленты без знака ubyte
, ushort
, uint
и ulong
.float
, double
и real
.char
, wchar
и dchar
, которые на самом деле содержат числа, предназначенные для кодирования знаков Юникода.В табл. 2.1 вкратце описаны основные типы данных D с указанием их размеров и начальных значений по умолчанию. В языке D переменная инициализируется автоматически, если вы просто определили ее, не указав начального значения. Значение по умолчанию доступно для любого типа как <тип>.init
; например int.init
– это ноль.
Таблица 2.1. Основные типы данных D
|Тип данных|Описание|Начальное значение по умолчанию|
|-|-|-|
|void
|Без значения|n/a
|
|typeof(null)
|Тип константы null
|n/a
|
|bool
|Логическое (булево) значение|false
|
|byte
|Со знаком, 8 бит|0
|
|ubyte
|Без знака, 8 бит|0
|
|short
|Со знаком, 16 бит|0
|
|ushort
|Без знака, 16 бит|0
|
|int
|Со знаком, 32 бита|0
|
|uint
|Без знака, 32 бита|0
|
|long
|Со знаком, 64 бита|0
|
|ulong
|Без знака, 64 бита|0
|
|float
|32 бита, с плавающей запятой|float.nan
|
|double
|64 бита, с плавающей запятой|double.nan
|
|real
|Наибольшее, какое только может позволить аппаратное обеспечение|real.nan
|
|char
|Без знака, 8 бит, в UTF-8|0xFF
|
|wchar
|Без знака, 16 бит, в UTF-16|0xFFFF
|
|dchar
|Без знака, 32 бита, в UTF-32|0x0000FFFF
|
Идентификатор, или символ – это чувствительная к регистру строка знаков, начинающаяся с буквы или знака подчеркивания, после чего следует любое количество букв, знаков подчеркивания или цифр. Единственное исключение из этого правила: идентификаторы, начинающиеся с двух знаков подчеркивания, зарезервированы под ключевые слова самого D. Идентификаторы, начинающиеся с одного знака подчеркивания, разрешены, и в настоящее время даже принято именовать поля классов таким способом.
Интересная особенность идентификаторов D – их интернациональность: «буква» в определении выше – это не только буква латинского алфавита (от A до Z и от a до z), но и знак из универсального набора[^1], определенного в стандарте C99[^2].
Например, abc
, α5
, _
, Γ_1
, _AbC
, Ab9C
и _9x
– допустимые идентификаторы, а 9abc
и __abc
– нет.
Если перед идентификатором стоит точка (.какЗдесь
), то компилятор ищет его в пространстве имен модуля, а не в текущем лексически близком пространстве имен. Этот префиксный оператор-точка имеет тот же приоритет, что и обычный идентификатор.
[^1]: Впрочем, использование нелатинских букв является дурным тоном. – Прим. науч. ред. [^2]: С99 – обновленная спецификация C, в том числе добавляющая поддержку знаков Юникода. – Прим. пер.