diff --git a/02-основные-типы-данных-выражения/README.md b/02-основные-типы-данных-выражения/README.md index ddec3e0..955e606 100644 --- a/02-основные-типы-данных-выражения/README.md +++ b/02-основные-типы-данных-выражения/README.md @@ -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]. Достижение конечного состояния (двойной кружок) означает, что число успешно распознано. + +![image-2-1](images/image-2-1.png) + +***Рис. 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 – это детерминированные конечные автоматы (ДКА). diff --git a/02-основные-типы-данных-выражения/images/image-2-1.png b/02-основные-типы-данных-выражения/images/image-2-1.png new file mode 100644 index 0000000..afcb5ac Binary files /dev/null and b/02-основные-типы-данных-выражения/images/image-2-1.png differ