- •Лекция 2
- •Упрощенная модель компиляции
- •Лексический анализ программы
- •Категории лексем
- •Идентификаторы
- •Ключевые слова
- •Зарезервированные идентификаторы
- •Стандартные идетификаторы
- •Идентификатор пользователя
- •Константы
- •Литералы
- •Целые константы
- •Вещественные константы
- •Булевские (логические) константы
- •Символьные константы
- •Строковые константы
- •Именованные константы
- •Перечисляемые константы
- •Препроцессорные константы
- •Знаки операций
- •Знаки пунктуации
- •Разделители
- •Пробельные разделители
Перечисляемые константы
Константы перечисляемого типа вводятся с помощью ключевого слова enum. Это обычные целочисленные константы, которым приписаны уникальные и удобные для использования обозначения (идентификаторы, отражающие назначение, смысл константы):
enum {one=1, two=2, three=3}; // one, two, three – условные имена, //введенные для обозначения констант
enum color {red, yellow, green}; //значения приписываются по умолчанию: red=0, yellow=1,… // color – название перечисляемого типа enum {red=10, yellow=3, green=4}; // приписываются указанные значения: red=10 и т.д.
enum {red=10, yellow=3, green=10}; // приписываются указанные значения: OK!!!
enum {red=10, yellow=3, green=red*10}; // приписываются указанные значения: OK!!!
enum {red=-2, yellow, green}; // приписываются указанные значения: OK!!!
Препроцессорные константы
Препроцессорные константы – также возможный способ определения констант в С++. Для этого используется директива препроцессора #define :
#define IDENTIFICATOR ZAMENA
Эта директива вызывает замену в тексте программы каждого появления имени IDENTIFICATOR на текст ZAMENA.
Например:
#define MAX_LEN 100 //в программе имя MAX_LEN заменится на 100
С помощью директивы #define можно выполнять «настройку» программы. Например, если в программе предполагается работать с массивом, то его размер можно явно определить на этапе препроцессорной обработки заданием именованного литерала:
исходный текст |
результат препроцессорной обработки |
#define K 40 void main () {int M[K] [K]; float A[K], B[K] [K]; ……. |
void main () {int M[40] [40]; float A[40], B[40] [40];
|
При таком описании легко изменять предельные размеры сразу всех массивов, изменив только одно значение в команде #define. В то же время сегодня такой способ определения именованных констант в С++ используется редко.
Обратите внимание на особенности работы с константами:
1.
const int i = 7; // целая константа
// i = 9; неверно, значение константы не должно изменяться
// const int j; неверно, отсутствует начальное значение константы
const int k(4); // верно, целая константа
2. Примеры определений символьной константы:
const char c='1';
const char d=49; // 49 – это код ‘1’ в 10-ичной с/с
const char dd=061; // 61 – это код ‘1’ в 8-ичной с/с
const char ddd=0x31; // 31 – это код ‘1’ в 16-ичной с/с
const char ed='\0x31'; //задание символьной константы ESC-последовательностью в 16 с/с
const char edd='\61'; //задание символьной константы ESC-последовательностью в 8 с/с
3. Примеры определений вещественной константы:
const float f = 1.5f;
const double df = 1.5;
const long double d = -3.7L;
const double expf = 5.55e-12;
4. Для уточнения типа константы можно использовать суффикc:
123 //тип signed int
11234L или 11234l //тип signed long int
123U или 123u, //тип unsigned int
2.78F или 2.78f //тип float
2.78 //тип double
2.78L или 2.78l //тип long double
5. Следующие объявления констант не эквивалентны:
const int k = 7;
#define k 7
В первой строке определяется именованная типизированная константа – переменная, занимающая некоторую область памяти, а во второй – препроцессорная константа.