Константы в C++

NovaInfo 76, с.74-77, скачать PDF
Опубликовано
Раздел: Технические науки
Просмотров за месяц: 134
CC BY-NC

Аннотация

В работе рассказывается о использовании констант в языке программирования С++. Приведённая теория соответствует базовому уровню, и может быть полезна для тех, кто начинает изучать данный язык программирования.

Ключевые слова

ЯЗЫК ПРОГРАММИРОВАНИЯ С++, УКАЗАТЕЛЬ НА КОНСТАНТУ, КОНСТАНТЫ, ПРОГРАММИРОВАНИЕ

Текст научной работы

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

В С++ предусмотрены два типа констант — литеральные и символьные. Литеральная константа — это значение, непосредственно задаваемое в программе; тип и значение такой константы определяется ее внешним видом. Различают следующие виды литеральных констант: числовые, символьные, строковые.

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

  • десятичные: -18, 0, 12, 345, …;
  • восьмеричные (начинаются с нуля): 00, 014, 045, 0777…;
  • шестнадцатеричные (начинаются с ): 0х0000, 0х1A27, 0х5FFF, FFF,…

По умолчанию целые десятичные константы имеют тип int.

Константам целого типа, используемым в программе, можно явно указать требуемый тип с помощью суффиксов L, l (long), U и u (unsigned). Например, константа 15L будет иметь тип long. Можно использовать суффиксы L и U одновременно, например, 24UL.

Константы вещественного типа имеют по умолчанию тип double. Примеры вещественных констант: -1.314, 3.98, 0.8765, … Также можно явно указать тип константы с помощью суффиксов F, f (float), L и l (long). Например, константа 1.57E+5L будет иметь тип long, а константа 3.22f — тип float.

Литеральные символьные константы задаются в апострофах, и их можно классифицировать на:

  • клавиатурные: '8', 'g', 'K',…;
  • кодовые (используются для задания управляющих и разделительных символов и пишутся в паре с символом обратной косой черты (обратный "слеш")): '\n', '\a', '\b', '\t', '\\', '\'',…; назначение таких констант представлено ниже в таблице 1.5.
  • числовые кодовые (используются для задания ASCII-кодов символов): '\xhhh' (h — шестнадцатеричная цифра), '\0ooo' (o — восьмеричная цифра). Например, комбинация клавиш "Ctrl+Z" имеет код ASCII, равный 26; ему соответствует 032 в восьмеричной системе и 0x1A в шестнадцатеричной.

Таблица 1. Коды управляющих последовательностей

Код С++

Назначение

Десятичный код ASCII

Шестнадцатеричный код ASCII

\n

Новая строка

10

0xA

\t

Горизонтальная табуляция

9

0x9

\v

Вертикальная табуляция

11

0xB

\b

Возврат на одну позицию

8

0x8

\r

Возврат каретки

13

0xD

\a

Звук предупреждения

7

0x7

\\

Обратная косая черта, \

92

0x5C

\'

Одинарная кавычка, '

39

0x27

\"

Двойная кавычка, "

34

0x22

Строковые константы представляют собой последовательности символов, заключенные в двойные кавычки: "Мир", "Ошибка", "Укажите номер элемента", "Press any key…", … Для хранения строковой константы требуется на 1 байт памяти больше, чем число символов между двойными кавычками в строковой константе. Этот дополнительный байт требуется для хранения кода-признака конца строки (000, или \0). Допускается использовать управляющие и разделительные символы внутри строковых констант, но в этом случае они указываются без апострофов: "\nНомер элемента", "Данные:\nвторая строка", и т.д.

Строковые константы типа wchar_t записываются с префиксом L, например: L"Year".

Символьные (не литеральные) константы (именные константы) — это константы, представленные именем; они объявляются так же, как и переменные соответствующих типов, но с указанием слова const (ключевое слово const иногда называют квалификатором или просто — спецификатором). Например:

const int a = 10;
const float x  = 1.75;
const double y = 1.54E+12;
const char s = 'A';
const char Ch[] = "строка символов";
const wchar_t a[ ] = L"Year";

Как было сказано выше, в отличие от переменной, значение инициализированной константы изменить нельзя.

Приведем еще примеры с указателями. При этом используются 2 объекта: указатель, и то, на что он указывает. Причем один или оба объекта, в свою очередь, могут быть константами:

const char* p1 = "number";       // указатель на константу
char const* p2 = "number";       // указатель на константу
char *const p3 = "number";       // константный указатель
const char *const p4 = "number"; // константный указатель
// на константу

Первые две строки в этом примере аналогичны друг другу (тип и слово const можно менять местами). Отмечу также, что в данном примере *const является оператором объявления указателя, наряду с символом *.

В некоторых случаях может получиться, что объект, не являющийся константой, выступает как константа при доступе к нему через указатель:

char s[] = "number";     // массив символов
const char* p = s;       // указатель на константу
s[0] = 'z';              // изменяем один из символов (ошибки нет)
p[0] = 'z';              // будет выдано сообщение об ошибке:
                         // попытка изменить константу

Символьные (не литеральные) константы можно задавать также средствами препроцессора, на основе использования директивы #define:

#define DT 0.00017           // определяем числовую константу
#define ST "Press any key…"  // определяем строковую константу

После этого в тексте программы можно будет использовать имена DT и ST. Препроцессор перед компиляцией программы везде заменит имена DT и ST на соответствующие им значения 0.00017 и "Press any key…".

Символьные (не литеральные) целочисленные константы можно задавать также с использованием типа enum.

Замечание. Ключевое слово const относится к одному из двух так называемых cv-спецификаторов. Второй спецификатор определяется ключевым словом volatile.

Спецификатор volatile указывает, что значение в ячейке памяти может быть изменено, даже если в программном коде нет ничего, что может приводить к модифицированию ее содержимого. Например, пусть имеется указатель на аппаратную область памяти, в которой хранятся какие-либо значения, поступающие из последовательного порта. В таком случае подключенное оборудование, а не программа, изменяет содержимое области памяти.

Если компилятор обнаруживает, что программа использует значение некоторой переменной несколько раз на протяжении выполнения нескольких операторов, то вместо того, чтобы заставить программу несколько раз предпринимать поиск такого значения, компилятор может поместить его в регистр. Это несколько оптимизирует время выполнения программы, однако такая оптимизация предполагает, что значение переменной не изменяется между несколькими случаями ее использования.

Если переменная не объявлена со спецификатором volatile, компилятор имеет право осуществлять описанную выше оптимизацию. Указание же спецификатора volatile говорит компилятору, что такая оптимизация не допускается.

Читайте также

Цитировать

Дмитриев, В.Л. Константы в C++ / В.Л. Дмитриев. — Текст : электронный // NovaInfo, 2017. — № 76. — С. 74-77. — URL: https://novainfo.ru/article/14477 (дата обращения: 07.10.2022).

Поделиться