|
@@ -1,10 +1,10 @@
|
|
|
# 2. Основные типы данных. Выражения
|
|
|
|
|
|
-- [2.1. Идентификаторы]()
|
|
|
- - [2.1.1. Ключевые слова]()
|
|
|
-- [2.2. Литералы]()
|
|
|
- - [2.2.1. Логические литералы]()
|
|
|
- - [2.2.2. Целые литералы]()
|
|
|
+- [2.1. Идентификаторы](#2-1-идентификаторы)
|
|
|
+ - [2.1.1. Ключевые слова](#2-1-1-ключевые-слова)
|
|
|
+- [2.2. Литералы](#2-2-литералы)
|
|
|
+ - [2.2.1. Логические литералы](#2-2-1-логические-литералы)
|
|
|
+ - [2.2.2. Целые литералы](#2-2-2-целые-литералы)
|
|
|
- [2.2.3. Литералы с плавающей запятой]()
|
|
|
- [2.2.4. Знаковые литералы]()
|
|
|
- [2.2.5. Строковые литералы]()
|
|
@@ -52,7 +52,7 @@
|
|
|
- [2.3.16. Тернарная условная операция]()
|
|
|
- [2.3.17. Присваивание]()
|
|
|
- [2.3.18. Выражения с запятой]()
|
|
|
-- [2.4. Справочник]()
|
|
|
+- [2.4. Итоги и справочник]()
|
|
|
|
|
|
Если вы когда-нибудь программировали на C, C++, Java или C#, то с основными типами данных и выражениями D у вас не будет никаких затруднений. Операции со значениями основных типов – неотъемлемая часть решений многих задач программирования. Эти средства языка, в зависимости от ваших предпочтений, могут сильно облегчать либо отравлять вам жизнь. Совершенного подхода не существует; нередко поставленные цели противоречат друг другу, заставляя руководствоваться собственным субъективным мнением. Это, в свою очередь, лишает язык возможности угодить всем до единого. Слишком строгая система обременяет программиста своими запретами: он вынужден бороться с компилятором, чтобы тот принял простейшие выражения. А сделай систему типизации чересчур снисходительной – и не заметишь, как окажешься по ту сторону корректности, эффективности или того и другого вместе.
|
|
|
|
|
@@ -104,5 +104,93 @@
|
|
|
|
|
|
[В начало ⮍](#2-1-идентификаторы) [Наверх ⮍](#2-основные-типы-данных-выражения)
|
|
|
|
|
|
+### 2.1.1. Ключевые слова
|
|
|
+
|
|
|
+Приведенные в табл. 2.2 идентификаторы – это ключевые слова, зарезервированные языком для специального использования. Пользовательский код не может переопределять их ни при каких условиях.
|
|
|
+
|
|
|
+*Таблица 2.2. Ключевые слова языка D*
|
|
|
+
|
|
|
+```d
|
|
|
+abstract else macro switch
|
|
|
+alias enum mixin synchronized
|
|
|
+align export module
|
|
|
+asm extern template
|
|
|
+assert new this
|
|
|
+auto false nothrow throw
|
|
|
+ final null true
|
|
|
+body finally try
|
|
|
+bool float out typeid
|
|
|
+break for override typeof
|
|
|
+byte foreach
|
|
|
+ function package ubyte
|
|
|
+case pragma uint
|
|
|
+cast goto private ulong
|
|
|
+catch protected union
|
|
|
+char ifIf public unittest
|
|
|
+class immutable pure ushort
|
|
|
+const import
|
|
|
+continue in real version
|
|
|
+ inout ref void
|
|
|
+dchar int return
|
|
|
+debug interface wchar
|
|
|
+default invariant scope while
|
|
|
+delegate isIs short with
|
|
|
+deprecated static
|
|
|
+do long struct
|
|
|
+double lazy super
|
|
|
+```
|
|
|
+
|
|
|
+Некоторые из ключевых слов распознаются как первичные выражения. Например, ключевое слово `this` внутри определения метода означает текущий объект, а ключевое слово `super` как статически, так и динамически заставляет компилятор обратиться к классу-родителю текущего класса (см. главу 6). Идентификатор `$` разрешен только внутри индексного выражения или выражения получения среза и обозначает длину индексируемого массива. Идентификатор `null` обозначает пустой объект, массив или указатель.
|
|
|
+
|
|
|
+Первичное выражение `typeid(T)` возвращает информацию о типе `T` (за дополнительной информацией обращайтесь к документации для вашей реализации компилятора).
|
|
|
+
|
|
|
+[В начало ⮍](#2-1-1-ключевые-слова) [Наверх ⮍](#2-основные-типы-данных-выражения)
|
|
|
+
|
|
|
+## 2.2. Литералы
|
|
|
+
|
|
|
+### 2.2.1. Логические литералы
|
|
|
+
|
|
|
+Логические (булевы) литералы – это `true` («истина») и `false` («ложь»).
|
|
|
+
|
|
|
+[В начало ⮍](#2-2-1-логические-литералы) [Наверх ⮍](#2-основные-типы-данных-выражения)
|
|
|
+
|
|
|
+### 2.2.2. Целые литералы
|
|
|
+
|
|
|
+D работает с десятичными, восьмеричными[^3], шестнадцатеричными и двоичными целыми литералами. Десятичная константа - это последовательность цифр, возможно, с суффиксом `L`, `U`, `u`, `LU`, `Lu`, `UL` или `ul`. Вывод о типе десятичного литерала делается исходя из следующих правил:
|
|
|
+- *нет суффикса*: если значение «помещается» в `int`, то `int`, иначе `long`;
|
|
|
+- *только* `U`/`u`: если значение «помещается» в `uint`, то `uint`, иначе `ulong`.
|
|
|
+- *только* `L`: тип константы - `long`.
|
|
|
+- `U`/`u` *и* `L` *совместно*: тип константы - `ulong`.
|
|
|
+
|
|
|
+Например:
|
|
|
+
|
|
|
+```d
|
|
|
+auto
|
|
|
+ a = 42, // a имеет тип int
|
|
|
+ b = 42u, // b имеет тип uint
|
|
|
+ c = 42UL, // c имеет тип ulong
|
|
|
+ d = 4_000_000_000, // long; в int не поместится
|
|
|
+ e = 4_000_000_000u, // uint; в uint не поместится
|
|
|
+ f = 5_000_000_000u; // ulong; в uint не поместится
|
|
|
+```
|
|
|
+
|
|
|
+Вы можете свободно вставлять в числа знаки подчеркивания (только не ставьте их в начало, иначе вы на самом деле создадите идентификатор). Знаки подчеркивания помогают сделать большое число более наглядным:
|
|
|
+
|
|
|
+```d
|
|
|
+auto targetSalary = 15_000_000;
|
|
|
+```
|
|
|
+
|
|
|
+Чтобы написать шестнадцатеричное число, используйте префикс `0x` или `0X`, за которым следует последовательность знаков `0–9`, `a–f`, `A–F` или `_`. Двоичный литерал создается с помощью префикса `0b` или `0B`, за которым идет последовательность из `0`, `1` и тех же знаков подчеркивания. Как и у десятичных чисел, у всех этих литералов может быть суффикс. Правила, с помощью которых их типы определяются по контексту, идентичны правилам для десятичных чисел.
|
|
|
+
|
|
|
+Рисунок 2.1, заменяющий 1024 слова, кратко и точно определяет синтаксис целых литералов. Правила интерпретации автомата таковы: 1) каждое ребро «поглощает» знаки, соответствующие его ребру, 2) автомат пытается «расходовать» как можно больше знаков из входной последовательности[^4]. Достижение конечного состояния (двойной кружок) означает, что число успешно распознано.
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+***Рис. 2.1.*** *Распознавание целых литералов в языке D. Автомат пытается сделать ряд последовательных шагов (поглощая знаки, соответствующие данному ребру), пока не остановится. Останов в конечном состоянии (двойной кружок) означает, что число успешно распознано. s обозначает суффикс вида U|u|L|UL|uL|Lu|LU*
|
|
|
+
|
|
|
+[В начало ⮍](#2-2-2-целые-литералы) [Наверх ⮍](#2-основные-типы-данных-выражения)
|
|
|
+
|
|
|
[^1]: Впрочем, использование нелатинских букв является дурным тоном. – *Прим. науч. ред.*
|
|
|
[^2]: С99 – обновленная спецификация C, в том числе добавляющая поддержку знаков Юникода. – *Прим. пер.*
|
|
|
+[^3]: Сам язык не поддерживает восьмеричные литералы, но поскольку они присутствуют в некоторых C-подобных языках, в стандартную библиотеку был добавлен соответствующий шаблон. Теперь запись `std.conv.octal!777` аналогична записи `0777` в C. – *Прим. науч. ред.*
|
|
|
+[^4]: Для тех, кто готов воспринимать теорию: автоматы на рис. 2.1 и 2.2 – это детерминированные конечные автоматы (ДКА).
|