2.2.1, 2.2.2

This commit is contained in:
Alexander Zhirov 2023-01-22 16:41:56 +03:00
parent 6a8c5f341c
commit 871eb75c78
2 changed files with 94 additions and 6 deletions

View File

@ -1,10 +1,10 @@
# 2. Основные типы данных. Выражения # 2. Основные типы данных. Выражения
- [2.1. Идентификаторы]() - [2.1. Идентификаторы](#2-1-идентификаторы)
- [2.1.1. Ключевые слова]() - [2.1.1. Ключевые слова](#2-1-1-ключевые-слова)
- [2.2. Литералы]() - [2.2. Литералы](#2-2-литералы)
- [2.2.1. Логические литералы]() - [2.2.1. Логические литералы](#2-2-1-логические-литералы)
- [2.2.2. Целые литералы]() - [2.2.2. Целые литералы](#2-2-2-целые-литералы)
- [2.2.3. Литералы с плавающей запятой]() - [2.2.3. Литералы с плавающей запятой]()
- [2.2.4. Знаковые литералы]() - [2.2.4. Знаковые литералы]()
- [2.2.5. Строковые литералы]() - [2.2.5. Строковые литералы]()
@ -52,7 +52,7 @@
- [2.3.16. Тернарная условная операция]() - [2.3.16. Тернарная условная операция]()
- [2.3.17. Присваивание]() - [2.3.17. Присваивание]()
- [2.3.18. Выражения с запятой]() - [2.3.18. Выражения с запятой]()
- [2.4. Справочник]() - [2.4. Итоги и справочник]()
Если вы когда-нибудь программировали на C, C++, Java или C#, то с основными типами данных и выражениями D у вас не будет никаких затруднений. Операции со значениями основных типов неотъемлемая часть решений многих задач программирования. Эти средства языка, в зависимости от ваших предпочтений, могут сильно облегчать либо отравлять вам жизнь. Совершенного подхода не существует; нередко поставленные цели противоречат друг другу, заставляя руководствоваться собственным субъективным мнением. Это, в свою очередь, лишает язык возможности угодить всем до единого. Слишком строгая система обременяет программиста своими запретами: он вынужден бороться с компилятором, чтобы тот принял простейшие выражения. А сделай систему типизации чересчур снисходительной и не заметишь, как окажешься по ту сторону корректности, эффективности или того и другого вместе. Если вы когда-нибудь программировали на C, C++, Java или C#, то с основными типами данных и выражениями D у вас не будет никаких затруднений. Операции со значениями основных типов неотъемлемая часть решений многих задач программирования. Эти средства языка, в зависимости от ваших предпочтений, могут сильно облегчать либо отравлять вам жизнь. Совершенного подхода не существует; нередко поставленные цели противоречат друг другу, заставляя руководствоваться собственным субъективным мнением. Это, в свою очередь, лишает язык возможности угодить всем до единого. Слишком строгая система обременяет программиста своими запретами: он вынужден бороться с компилятором, чтобы тот принял простейшие выражения. А сделай систему типизации чересчур снисходительной и не заметишь, как окажешься по ту сторону корректности, эффективности или того и другого вместе.
@ -104,5 +104,93 @@
[В начало ⮍](#2-1-идентификаторы) [Наверх ⮍](#2-основные-типы-данных-выражения) [В начало ⮍](#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`, за которым следует последовательность знаков `09`, `af`, `AF` или `_`. Двоичный литерал создается с помощью префикса `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]: Впрочем, использование нелатинских букв является дурным тоном. *Прим. науч. ред.* [^1]: Впрочем, использование нелатинских букв является дурным тоном. *Прим. науч. ред.*
[^2]: С99 обновленная спецификация C, в том числе добавляющая поддержку знаков Юникода. *Прим. пер.* [^2]: С99 обновленная спецификация C, в том числе добавляющая поддержку знаков Юникода. *Прим. пер.*
[^3]: Сам язык не поддерживает восьмеричные литералы, но поскольку они присутствуют в некоторых C-подобных языках, в стандартную библиотеку был добавлен соответствующий шаблон. Теперь запись `std.conv.octal!777` аналогична записи `0777` в C. *Прим. науч. ред.*
[^4]: Для тех, кто готов воспринимать теорию: автоматы на рис. 2.1 и 2.2 это детерминированные конечные автоматы (ДКА).

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB