Раздел 6
Константы и
литералы
Собственно говоря, в С++ под константами и литералами, как правило,
подразумевает одно и то же: это такие значения, предназначенные для
восприятия пользователем, которые не могут быть изменены в ходе
выполнения программы. Приведенное определение относится большей частью
к литералу.
Под константами здесь и далее
будем подразумевать именованные ячейки памяти, значения которых
фиксируются на начальном этапе выполнения программы и затем в процессе
выполнения программы не могут быть изменены.
В этом смысле константы - это те же переменные, но только с
фиксированным, определённым единожды, значением.
Для превращения переменной в постоянное запоминающее устройство, то
есть в константу, используют идентификатор const. Идентификатор
указывается перед типом переменной и гарантирует неизменность значения
переменной. Само значение переменной присваивается либо при объявлении,
либо позже в программе, но только один раз и до первого использования
переменной в программе.
Например, инструкцией const int m=5
инициализируется целочисленная
переменная m со значением 5. После этого переменную можно
использовать в выражениях, однако изменить значение переменной не
удастся.
Представление литералов в программном коде существенно зависит от типа,
к которому относится литерал. Так, отдельные символы - литералы типа char указывается в
одиночных кавычках, например 'a' или 'd'. Для литералов типа wchar_t (напомним,
это
расширенный 16-битовый символьный тип) перед непосредственным значением
указывается префикс L.
Примеры литералов типа
wchar_t:L'a',L'A',L'd',L'D'.
Несмотря на то, что в С++ нет определённого типа для
строчных(текстовых) переменных, в С++ существую литералы типа текстовой
строки. Соответствующие значения указываются в двойных кавычках.
Примером текстового литерала, например, может быть фраза "Hello,
World!".
Подробнее о работе с текстовыми
выражениями рассказывается в Главе 5.
Числовые литералы, как и положено, задаются в стандартном виде с
помощью арабских цифр. Однако здесь есть один важный момент. Связан он
с тем, что в С++ есть несколько числовых типов, поэтому не всегда
очевидно, к какому именно числовому типу относится литерал.
Здесь действует общее правило:
литерал интерпретируется в пределах минимально необходимого типа.
Это правило, кстати, относится не только к числовым литералам.
Исключение составляет тип double: литералы в формате числа с плавающей
точкой интерпретируются как значения этого типа(а не типа float, как
можно было бы ожидать). Тем не менее, в некоторых случаях необходимо в
явном виде указать принадлежность литерала к определённому типу. Обычно
это делается с помощью специальных суффиксов. Суффикс F после числа в
формате с плавающей точкой означает принадлежность литерала к типу
float(например 5.3F) Чтобы литерал относился к типу long double,
используется суффикс L(например, 5.3L). Этот же суффикс, но у
целочисленного литерала означает принадлежность последнего к типу long
int(например, 123L). Суффикс U используется с целочисленными литералами
для отнесения их к типу unsigned int(например, 123U).
В С++ также существует возможность работать с восьмеричными и
шестнадцатеричными литералами(то есть с целочисленными значениями,
записанными в восьмеричной и шестнадцатеричной системах счисления
соответственно). Напомним, что в восьмеричной системе счисления число в
позиционном представлении записывается с помощью цифр от 0 до 7. Если в
восьмеричной системе счисления число записано как bnbn-1...b2b1b0,
то
в
десятичной
системе
это
же
число
определяется
суммой b080
+ b181 + b282 + ... + bn-18n-1
+ bn8n.
В шестнадцатеричной системе в позиционной записи числа используются
цифры от 0 до 9 и буквы от A(в десятичной системе соответствует
числу 10) до F(в десятичной системе соответствует числу 15). По
структуре числа bnbn-1...b2b1b0
в шестнадцатеричной системе перевод в десятичную осуществляется как b0160
+ b1161 + b2162 + ... + bn-116n-1
+ bn16n. При этом параметры bn
принимают значения в диапазоне от 0 до 15(символы от A до F заменяются
соответствующими числовыми значениями).
В С++ восьмеричные литералы вводятся с помощью арабских цифр, но каждый
восьмеричный литерал должен начинаться с нуля. Поэтому хотя с
математической точки зрения первый нуль и является незначащим, в С++
литералы 10 и 010 не эквивалентны. Первый является десятичным значением
10, в то время как второй литерал - восьмеричный и в десятичной системе
счисления соответствует числу 8.
Шестнадцатеричные литералы начинаются с последовательности 0х или 0Х.
Примеры шестнадцатеричных литералов: 0х10(десятичное число 16),
0Х309(десятичное число 777), 0х1FA(десятичное число 506)
|