Константные значения, которые присутствуют в программе в виде части исходного кода, называются литералами.
Литералы могут быть любым из базовых типов данных, и их можно классифицировать как целые числа, числа с плавающей точкой, символы, строки и логические значения.
Опять же, литералы можно использовать так же, как и обычные переменные, за исключением того, что их значения нельзя изменять после их определения.
Целочисленный литерал может быть одним из следующих типов:
Десятичный (Decimal) использует обычное число представление с учетом того, что первой цифрой не может быть 0, так как эта цифра зарезервирована для указания восьмеричной системы. Это правило не распространяется на сам 0: 0 равен нулю.
Восьмеричный (Octal) использует 0 как префикс числа.
В современных версиях компилятора восьмеричные литералы не поддерживаются
(их можно применять с помощью шаблона std.conv.octal стандартной библиотеки).
Использование числовых литералов, начинающихся с 0, вызывает ошибку компилятора – прим. пер.
Двоичный (Binary) использует 0b или 0B как префикс.
Шестнадцатиричный (Hexadecimal) использует 0x или 0X как префикс.
Целочисленный литерал также может иметь суффикс, представляющий собой комбинацию букв U и L, для беззнакового и длинного, соответственно. Суффикс может быть прописным или строчным, и составляющие его буквы могут идти в любом порядке.
Когда вы не используете суффикс, компилятор сам выбирает между int, uint, long и ulong в зависимости от размера значения.
Вот несколько примеров целочисленных литералов:
212 // Допустимо 215u // Допустимо 0xFeeL // Допустимо 078 // Недопустимо: 8 не является цифрой восьмеричной системы 032UU // Недопустимо: нельзя повторять суффикс
Ниже приведены другие примеры различных типов целочисленных литералов:
85 // десятичный int 0x4b // шестнадцатиричный 30 // int 30u // unsigned int (беззнаковый) 30l // long 30ul // unsigned long (беззнаковый) 0b001 // двоичный
Литералы с плавающей точкой можно указывать либо в десятичной системе, как в 1.568, либо в шестнадцатеричной системе, как в 0x91.bc.
В десятичной системе порядок может быть представлен путем добавления символа e или E и числа после него. Например, 2.3e4 означает «2.3 умножить на 10 в степени 4». Символ «+» можно указывать до значения порядка, но он не даст эффекта. Например, 2.3e4 и 2.3e + 4 означают одно и то же.
Символ «-», добавленный до значения порядка, придаёт значение «делится на 10 в степени». Например, 2.3e-2 означает «2.3, делённое на 10 в степени 2».
В шестнадцатеричной системе значение начинается с 0x или 0X. Порядок записывается через p или P вместо e или E. Порядок означает не «10 в степени», а «2 в степени». Например, P4 в 0xabc.defP4 означает «abc.de умножить на 2 в степени 4».
Вот несколько примеров литералов с плавающей точкой:
3.14159 // Допустимо 314159E-5L // Допустимо 510E // Недопустимо: неполный порядок 210f // Допустимо (В оригинале было "Illegal", но у меня компиляция с этим значением ошибок не выдаёт - прим. пер.) .e55 // Недопустимо: отсутствует целая или дробная часть 0xabc.defP4 // Допустимо: Hexa decimal with exponent 0xabc.defe4 // Допустимо: Hexa decimal without exponent.
По умолчанию тип литерала с плавающей точкой устанавливается в double. Суффикс f или F означает float, а спецификатор L означает real.
Существует два логических (булевых) литерала, и они входят в список ключевых слов D:
Значение true представляет истину.
Значение false представляет ложь.
Вы не должны считать значение true равным 1, а значение false равным 0.
Литералы символов заключаются в одинарные кавычки.
Литерал символа может быть простым символом (например, 'x'), escape-последовательностью (например, '\t'),
символом ASCII (например, '\x21'), символом Unicode (например, '\u011e'),
или в виде именованного символа (например, '\©','\♥', '\€').
Не очень я понял про эти "именованные символы" – прим.пер.
В D существуют определённые символы, когда им предшествует обратная косая черта, они будут иметь особый смысл, и они используются для представления таких вещей, как новая строка (\n) или табуляция (\t). Здесь приведён список некоторых из таких кодов escape-последовательностей:
escape-последовательность | Означает |
---|---|
\\ | символ \ |
\' | символ ' |
\" | символ " |
\? | символ ? |
\a | Предупреждение или звонок |
\b | Backspace |
\f | Form feed |
\n | Новая строка |
\r | Возврат каретки |
\t | Горизонтальная табуляция |
\v | Вертикальная табуляция |
В следующем примере показаны несколько символов escape-последовательностей:
import std.stdio; int main(string[] args) { writefln("Привет\tМир%c\n",'\x21'); writefln("Хорошего дня%c",'\x21'); return 0; }
Когда вы скомпилируете и выполните эту программу, она возвратит следующий результат:
Привет Мир! Хорошего дня!
Строковые литералы заключаются в двойные кавычки. Строка содержит символы, похожие на литералы символов: простые символы, escape-последовательности и универсальные символы.
Вы можете разбить длинную строку на несколько строк с использованием строковых литералов
и разделить их, используя пробельные символы.
В современных версиях компилятора это работает, но выдаётся предупреждение "Deprecation" (устарело) и предлагается
использовать конкатенацию с помощью оператора "~" – прим.пер.
Вот несколько примеров строковых литералов:
import std.stdio; void main(string[] args) { writeln(q"MY_DELIMITER Hello World Have a good day MY_DELIMITER"); writefln("Хорошего дня%c",'\x21'); auto str = q{int value = 20; ++value;}; writeln(str); }
В приведенном выше примере вы можете найти q"MY_DELIMITER
MY_DELIMITER" для представления многострочных символов.
Кроме того, вы можете увидеть, что q{} представляет собой инструкцию языка D.
К сожалению, у меня не получилось простым образом использовать русские буквы
внутри этих q"MY_DELIMITER MY_DELIMITER" – часто на выходе вместо буквы появлялся её код в виде '\u041f' – прим. пер.