From 6a8c5f341c455757117a458252ec5f2d0948faff Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 22 Jan 2023 16:17:12 +0300 Subject: [PATCH] 2, 2.1 --- 01-знакомство-с-языком-d/README.md | 2 +- 02-основные-типы-данных-выражения/README.md | 108 ++++++++++++++++++++ README.md | 2 +- 3 files changed, 110 insertions(+), 2 deletions(-) diff --git a/01-знакомство-с-языком-d/README.md b/01-знакомство-с-языком-d/README.md index 5188f14..3955763 100644 --- a/01-знакомство-с-языком-d/README.md +++ b/01-знакомство-с-языком-d/README.md @@ -202,7 +202,7 @@ double pow(double base, int exponent) } ``` -Каждый параметр функции (`base` и `exponent` в данном примере) кроме типа может иметь необязательный ***класс памяти*** (***storage class***), определяющий способ передачи аргумента в функцию при ее вызове[^2]. +Каждый параметр функции (`base` и `exponent` в данном примере) кроме типа может иметь необязательный *класс памяти* (*storage class*), определяющий способ передачи аргумента в функцию при ее вызове[^2]. По умолчанию аргументы передаются в `pow` по значению. Если перед типом параметра указан класс памяти `ref`, то параметр привязывается напрямую к входному аргументу, так что изменение параметра непосредственно отражается на значении, полученном извне. Например: diff --git a/02-основные-типы-данных-выражения/README.md b/02-основные-типы-данных-выражения/README.md index e69de29..ddec3e0 100644 --- a/02-основные-типы-данных-выражения/README.md +++ b/02-основные-типы-данных-выражения/README.md @@ -0,0 +1,108 @@ +# 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-основные-типы-данных-выражения) + +## 2.1. Идентификаторы + +Идентификатор, или символ – это чувствительная к регистру строка знаков, начинающаяся с буквы или знака подчеркивания, после чего следует любое количество букв, знаков подчеркивания или цифр. Единственное исключение из этого правила: идентификаторы, начинающиеся с двух знаков подчеркивания, зарезервированы под ключевые слова самого D. Идентификаторы, начинающиеся с одного знака подчеркивания, разрешены, и в настоящее время даже принято именовать поля классов таким способом. + +Интересная особенность идентификаторов D – их интернациональность: «буква» в определении выше – это не только буква латинского алфавита (от A до Z и от a до z), но и знак из универсального набора[^1], определенного в стандарте C99[^2]. + +Например, `abc`, `α5`, `_`, `Γ_1`, `_AbC`, `Ab9C` и `_9x` – допустимые идентификаторы, а `9abc` и `__abc` – нет. + +Если перед идентификатором стоит точка (`.какЗдесь`), то компилятор ищет его в пространстве имен модуля, а не в текущем лексически близком пространстве имен. Этот префиксный оператор-точка имеет тот же приоритет, что и обычный идентификатор. + +[В начало ⮍](#2-1-идентификаторы) [Наверх ⮍](#2-основные-типы-данных-выражения) + +[^1]: Впрочем, использование нелатинских букв является дурным тоном. – *Прим. науч. ред.* +[^2]: С99 – обновленная спецификация C, в том числе добавляющая поддержку знаков Юникода. – *Прим. пер.* diff --git a/README.md b/README.md index ba414a0..bf99d92 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ - [Введение](00-введение) - [1. Знакомство с языком D](01-знакомство-с-языком-d) - [2. Основные типы данных. Выражения](02-основные-типы-данных-выражения) -- [3. Инструкция](03-инструкция) +- [3. Инструкции](03-инструкция) - [4. Массивы, ассоциативные массивы и строки](04-массивы-ассоциативные-массивы-и-строки) - [5. Данные и функции. Функциональный стиль](05-данные-и-функции-функциональный-стиль) - [6. Классы. Объектно-ориентированный стиль](06-классы-объектно-ориентированный-стиль)