Alexander Zhirov 6a8c5f341c | ||
---|---|---|
.. | ||
README.md |
README.md
2. Основные типы данных. Выражения
- 2.1. Идентификаторы
- 2.1.1. Ключевые слова
- 2.2. Литералы
- 2.2.1. Логические литералы
- 2.2.2. Целые литералы
- 2.2.3. Литералы с плавающей запятой
- 2.2.4. Знаковые литералы
- 2.2.5. Строковые литералы
- 2.2.5.1. Строковые литералы: WYSIWYG, с разделителями, строки токенов и импортированные
- 2.2.5.2. Тип строкового литерала
- 2.2.6. Литералы массивов и ассоциативных массивов
- 2.2.7. Функциональные литералы (лямбда-функция)
- 2.3. Операции
- 2.3.1. l-значения и r-значения
- 2.3.2. Неявные преобразования чисел
- 2.3.2.1. Распространение интервала значений
- 2.3.3. Типы числовых операций
- 2.3.4. Первичные выражения
- 2.3.4.1. Выражение assert
- 2.3.4.2. Выражение mixin
- 2.3.4.3. Выражения is
- 2.3.4.4. Выражения в круглых скобках
- 2.3.5. Постфиксные операции
- 2.3.5.1. Доступ ко внутренним элементам
- 2.3.5.2. Увеличение и уменьшение на единицу
- 2.3.5.3. Вызов функции
- 2.3.5.4. Индексация
- 2.3.5.5. Срезы массивов
- 2.3.5.6. Создание вложенного класса
- 2.3.6. Унарные операции
- 2.3.6.1. Выражение new
- 2.3.6.2. Получение адреса и разыменование
- 2.3.6.3. Увеличение и уменьшение на единицу (префиксный вариант)
- 2.3.6.4. Поразрядное отрицание
- 2.3.6.5. Унарный плюс и унарный минус
- 2.3.6.6. Отрицание
- 2.3.6.7. Приведение типов
- 2.3.7. Возведение в степень
- 2.3.8. Мультипликативные операции
- 2.3.9. Аддитивные операции
- 2.3.10. Сдвиг
- 2.3.11. Выражения in
- 2.3.12. Сравнение
- 2.3.12.1. Проверка на равенство
- 2.3.12.2. Сравнение для упорядочивания
- 2.3.12.3. Неассоциативность
- 2.3.13. Поразрядные ИЛИ, ИСКЛЮЧАЮЩЕЕ ИЛИ и И
- 2.3.14. Логическое И
- 2.3.15. Логическое ИЛИ
- 2.3.16. Тернарная условная операция
- 2.3.17. Присваивание
- 2.3.18. Выражения с запятой
- 2.4. Справочник
Если вы когда-нибудь программировали на C, C++, Java или C#, то с основными типами данных и выражениями D у вас не будет никаких затруднений. Операции со значениями основных типов – неотъемлемая часть решений многих задач программирования. Эти средства языка, в зависимости от ваших предпочтений, могут сильно облегчать либо отравлять вам жизнь. Совершенного подхода не существует; нередко поставленные цели противоречат друг другу, заставляя руководствоваться собственным субъективным мнением. Это, в свою очередь, лишает язык возможности угодить всем до единого. Слишком строгая система обременяет программиста своими запретами: он вынужден бороться с компилятором, чтобы тот принял простейшие выражения. А сделай систему типизации чересчур снисходительной – и не заметишь, как окажешься по ту сторону корректности, эффективности или того и другого вместе.
Система основных типов D творит маленькие чудеса в границах, задаваемых его принадлежностью к семейству статически типизированных компилируемых языков. Определение типа по контексту, распространение интервала значений, всевозможные стратегии перегрузки операторов и тщательно спроектированная сеть автоматических преобразований вместе делают систему типизации D дотошным, но сдержанным помощником, который если и придирается, требуя внимания, то обычно не зря.
Основные типы данных можно распределить по следующим категориям:
- Тип без значения:
void
, используется во всех случаях, когда формально требуется указать тип, но никакое осмысленное значение не порождается. - Тип null:
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 |
2.1. Идентификаторы
Идентификатор, или символ – это чувствительная к регистру строка знаков, начинающаяся с буквы или знака подчеркивания, после чего следует любое количество букв, знаков подчеркивания или цифр. Единственное исключение из этого правила: идентификаторы, начинающиеся с двух знаков подчеркивания, зарезервированы под ключевые слова самого D. Идентификаторы, начинающиеся с одного знака подчеркивания, разрешены, и в настоящее время даже принято именовать поля классов таким способом.
Интересная особенность идентификаторов D – их интернациональность: «буква» в определении выше – это не только буква латинского алфавита (от A до Z и от a до z), но и знак из универсального набора1, определенного в стандарте C992.
Например, abc
, α5
, _
, Γ_1
, _AbC
, Ab9C
и _9x
– допустимые идентификаторы, а 9abc
и __abc
– нет.
Если перед идентификатором стоит точка (.какЗдесь
), то компилятор ищет его в пространстве имен модуля, а не в текущем лексически близком пространстве имен. Этот префиксный оператор-точка имеет тот же приоритет, что и обычный идентификатор.