Опубликован: 10.10.2006 | Уровень: специалист | Доступ: платный
Лекция 2:

Описания и константы

2.4 Литералы

В С++ можно задавать значения всех основных типов: символьные константы, целые константы и константы с плавающей точкой. Кроме того, нуль (0) можно использовать как значение указателя произвольного типа, а символьные строки являются константами типа char[]. Есть возможность определить символические константы. Символическая константа - это имя, значение которого в его области видимости изменять нельзя. В С++ символические константы можно задать тремя способами:

  1. добавив служебное слово const в определении, можно связать с именем любое значение произвольного типа;
  2. множество целых констант можно определить как перечисление;
  3. константой является имя массива или функции.

2.4.1 Целые константы

Целые константы могут появляться в четырех обличьях: десятичные, восьмеричные, шестнадцатеричные и символьные константы. Десятичные константы используются чаще всего и выглядят естественно:

0    1234    976    12345678901234567890

Десятичная константа имеет тип int, если она умещается в память, отводимую для int, в противном случае ее тип long. Транслятор должен предупреждать о константах, величина которых превышает выбранный формат представления чисел. Константа, начинающаяся с нуля, за которым следует x (0x), является шестнадцатеричным числом (с основанием 16), а константа, которая начинается с нуля, за которым следует цифра, является восьмеричным числом (с основанием 8). Приведем примеры восьмеричных констант:

0        02        077        0123

Их десятичные эквиваленты равны соответственно: 0, 2, 63, 83. В шестнадцатеричной записи эти константы выглядят так:

0x0      0x2       0x3f       0x53

Буквы a, b, c, d, e и f или эквивалентные им заглавные буквы используются для представления чисел 10, 11, 12, 13, 14 и 15, соответственно. Восьмеричная и шестнадцатеричная формы записи наиболее подходят для задания набора разрядов, а использование их для обычных чисел может дать неожиданный эффект. Например, на машине, в которой int представляется как 16-разрядное число в дополнительном коде, 0xffff есть отрицательное десятичное число -1. Если бы для представления целого использовалось большее число разрядов, то это было бы числом 65535.

Окончание U может использоваться для явного задания констант типа unsigned. Аналогично, окончание L явно задает константу типа long. Например:

void f(int);
void f(unsigned int);
void f(long int);

void g()
{
  f(3);      // вызов f(int)
  f(3U);     // вызов f(unsigned int)
  f(3L);     // вызов f(long int)
}

2.4.2 Константы с плавающей точкой

Константы с плавающей точкой имеют тип double. Транслятор должен предупреждать о таких константах, значение которых не укладывается в формат, выбранный для представления чисел с плавающей точкой. Приведем примеры констант с плавающей точкой:

1.23    .23      0.23     1.    1.0     1.2e10    1.23e-15

Отметим, что внутри константы с плавающей точкой не должно быть пробелов. Например, 65.43 e-21 не является константой с плавающей точкой, транслятор распознает это как четыре отдельные лексемы:

65.43    e    -    21

что вызовет синтаксическую ошибку.

Если нужна константа с плавающей точкой типа float, то ее можно получить, используя окончание f:

3.14159265f     2.0f     2.997925f

2.4.3 Символьные константы

Символьной константой является символ, заключенный в одиночные кавычки, например, 'a' или '0'. Символьные константы можно считать константами, которые дают имена целым значениям символов из набора, принятого на машине, на которой выполняется программа. Это необязательно тот же набор символов, который есть на машине, где программа транслировалась. Таким образом, если вы запускаете программу на машине, использующей набор символов ASCII, то значение '0' равно 48, а если машина использует код EBCDIC, то оно будет равно 240. Использование символьных констант вместо их десятичного целого эквивалента повышает переносимость программ. Некоторые специальные комбинации символов, начинающиеся с обратной дробной черты, имеют стандартные названия:

Конец строки                NL(LF)    \n
Горизонтальная табуляция    HT        \t
Вертикальная табуляция      VT        \v
Возврат                     BS        \b
Возврат каретки             CR        \r
Перевод формата             FF        \f
Сигнал                      BEL       \a
Обратная дробная черта      \         \\
Знак вопроса                ?         \?
Одиночная кавычка           '         \'
Двойная кавычка             "         \"
Нулевой символ              NUL       \0
Восьмеричное число          ooo       \ooo
Шестнадцатеричное число     hhh       \xhhh

Несмотря на их вид, все эти комбинации задают один символ. Тип символьной константы - char. Можно также задавать символ с помощью восьмеричного числа, представленного одной, двумя или тремя восьмеричными цифрами (перед цифрами идет \) или с помощью шестнадцатеричного числа (перед шестнадцатеричными цифрами идет \x ). Число шестнадцатеричных цифр в такой последовательности неограничено. Последовательность восьмеричных или шестнадцатеричных цифр завершается первым символом, не являющимся такой цифрой. Приведем примеры:

'\6'      '\x6'        6        ASCII ack
'\60'     '\x30'       48       ASCII '0'
'\137'    '\x05f'      95       ASCII '_'

Этим способом можно представить любой символ из набора символов машины. В частности, задаваемые таким образом символы можно включать в символьные строки (см. следующий раздел). Заметим, что если для символов используется числовая форма задания, то нарушается переносимость программы между машинами с различными наборами символов.

2.4.4 Строки

Строка - это последовательность символов, заключенная в двойные кавычки:

"это строка"

Каждая строка содержит на один символ больше, чем явно задано: все строки оканчиваются нулевым символом ('\0'), имеющим значение 0. Поэтому

sizeof("asdf")==5;

Типом строки считается "массив из соответствующего числа символов", поэтому тип "asdf" есть char[5]. Пустая строка записывается как "" и имеет тип char[1]. Отметим, что для любой строки s выполняется strlen(s)==sizeof(s)-1, поскольку функция strlen() не учитывает завершающий символ '\0'.

Внутри строки можно использовать для представления невидимых символов специальные комбинации с \. В частности, в строке можно задать сам символ двойной кавычки " или символ \. Чаще всего из таких символов оказывается нужным символ конца строки '\n', например:

cout << "звуковой сигнал в конце сообщения\007\n"

Здесь 7 - это значение в ASCII символа BEL (сигнал), который в переносимом виде обозначается как \a.

Нет возможности задать в строке "настоящий" символ конца строки:

"это не строка,
а синтаксическая ошибка"

Для большей наглядности программы длинные строки можно разбивать пробелами, например:

char alpha[] = "abcdefghijklmnopqrstuvwxyz"
      "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

Подобные, подряд идущие, строки будут объединяться в одну, поэтому массив alpha можно эквивалентным образом инициализировать с помощью одной строки:

"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

В строке можно задавать символ '\0', но большинство программ не ожидает после него встречи с какими-либо еще символами. Например, строку "asdf\000hjkl" стандартные функции strcpy() и strlen() будут рассматривать как строку "asdf".

Если вы задаете в строке последовательностью восьмеричных цифр числовую константу, то разумно указать все три цифры. Запись этой строки и так не слишком проста, чтобы еще и раздумывать, относится ли цифра к числу или является отдельным символом. Для шестнадцатеричных констант используйте два разряда. Рассмотрим следующие примеры:

char v1[] = "a\x0fah\0129";    // 'a' '\xfa' 'h' '\12' '9'
char v2[] = "a\xfah\129";      // 'a' '\xfa' 'h' '\12' '9'
char v3[] = "a\xfad\127";      // 'a' '\xfad' '\127'

2.4.5 Нуль

Нуль (0) имеет тип int. Благодаря стандартным преобразованиям 0 можно использовать как константу целого типа, или типа с плавающей точкой, или типа указателя. Нельзя разместить никакой объект, если вместо адреса указан 0. Какой из типов нуля использовать, определяется контекстом. Обычно (но необязательно) нуль представляется последовательностью разрядов "все нули" подходящей длины.

Равиль Ярупов
Равиль Ярупов
Федор Антонов
Федор Антонов

Здравствуйте!

Записался на ваш курс, но не понимаю как произвести оплату.

Надо ли писать заявление и, если да, то куда отправлять?

как я получу диплом о профессиональной переподготовке?

Данила Некрасов
Данила Некрасов
Россия, Пермь, ПНИПУ
Сергей Федоров
Сергей Федоров
Россия