Лекции по C++
Лекции по C++
Астраханский государственный технический университет
Кафедра «Информационных
технологий и коммуникаций»
Конспект лекций по дисциплине
«Основы алгоритмического языка С++»
для специальности 220200.
Астрахань 2000 г.
1. Переменные и операции языка С++ 4
ИЗУЧАЕМЫЕ ПОНЯТИЯ 5
Буквы и цифры 6
Пробельные символы 6
Знаки пунктуации и специальные символы 6
ESC- последовательности 8
Операции 9
Константы 11
Целые константы 11
Константы с плавающей точкой 13
Константа-символ 14
Строковые литералы 14
Идентификаторы 15
Ключевые слова 15
Комментарии 16
Лексемы 17
ИСХОДНЫЕ ТЕКСТЫ ПРИМЕРОВ 17
2. Конструкции принятия решений и циклы 23
ВОПРОСЫ И ОТВЕТЫ 23
СТРУКТУРА ПРОГРАММЫ 26
Исходная программа 26
ОБЪЯВЛЕНИЯ 27
Спецификаторы типов 28
Деклараторы 30
Деклараторы массивов, функций и указателей 30
Составные деклараторы 31
Об"явления переменной 33
Объявление простой переменной 34
Объявление перечисления 34
Объявления структур 36
Битовые поля 37
Об"явление совмещений 38
Об"явление массива 39
Об"явление функций 42
Классы памяти 45
Об"явления переменной на внешнем уровне 45
Об"явление переменной на внутреннем уровне 48
Об"явление функции на внешнем и внутреннем уровнях 49
Инициализация 50
Базовые типы и типы указателей 50
Составные типы 51
Строковые инициализаторы 53
Об"явления типов 54
Типы структур, совмещений и перечислений 54
Об"явления typedef 55
Имена типов 56
КОНТРОЛЬНЫЕ ВОПРОСЫ: 57
Функции 57
Объявление и определение функций 58
ТИПОВЫЕ ВОПРОСЫ С ОТВЕТАМИ 62
ПРАКТИКУМ 62
Контрольные вопросы 62
Массивы 65
СОРТИРОВКА массива - ПРИМЕР в файле list6_4cpp. 67
- ПОИСК в массиве 67
БИБЛИОТЕЧНЫЕ ФУНКЦИИ ПОИСКА и СОРТИРОВКИ в непрерывных массивах: 68
Строки и управление вводом/выводом 69
Форматированный потоковый вывод 70
Листинг 1. Исходный текст программы OUT1.CPP 70
Функция printf 71
Функция printf 72
Таблица 1. Еsс - последовательности 72
Таблица 7.2. Значения флагов строки формата функции printf 72
Таблица 3. Символы типов данных строки формата функции printf 73
Листинг 3. Исходный текст программы OUT2.CPP в файле List7-3.CPP 74
Таблица 4. Результат действия спецификаций форматирования в функции
printf из строки 13 75
Ввод строк 76
Функция getline 76
Присвоение значений строкам 77
Инициализация строки 77
Функция strcpy 77
Функция strdup 77
Функция strncpy 78
Определение длины строки 78
Функция strlen 78
Функция strcat 78
Функция strncat 79
Сравнение строк 79
Функция strcmp 79
Пример 80
Функция stricmp 80
Пример 80
Функция strncmp 80
Пример 80
Пример 81
(см. List7_5.cpp - Исходный текст программы STRING2.CPP) 81
Преобразование строк 81
Функция strlwr 81
Пример 81
Функция strupr 81
Пример 81
Обращение строк 82
Функция strrev 82
Поиск символов 82
Функция strchr 82
Функция strrchr 82
Пример 83
Функция Strspn 83
Пример 83
Функция strcspn 83
Пример 83
Функция strpbrk 83
Пример 84
Поиск строк 84
Функция strstr 84
Пример 84
Функция strtok 84
Пример 84
Основы объектно-ориентированного программирования СИНТАКСИС ОСНОВНЫХ
КОНСТРУКЦИЙ 85
Объявление базовых классов 85
Конструкторы 88
Деструкторы 90
Объявление иерархии классов 91
Виртуальные функции 92
Дружественные функции 95
Операции и дружественные операции 96
Виртуальные функции 97
Правило виртуальной функции 99
Операции и дружественные операции 101
ИСХОДНЫЕ ТЕКСТЫ ПРИМЕРОВ 103
ВОПРОСЫ И ОТВЕТЫ 103
Контрольные вопросы 104
ФАЙЛОВЫЕ ОПЕРАЦИИ ВВОДА/ВЫВОДА 105
Stream-библиотека C++ 105
ОБЩИЕ ФУНКЦИИ ПОТОКОВОГО ВВОДА/ВЫВОДА 106
Функция-компонент open 106
Функция-компонент close 107
ПОСЛЕДОВАТЕЛЬНЫЙ ТЕКСТОВЫЙ ПОТОК ВВОДА/ВЫВОДА 107
Функция-элемент getline 108
ПОСЛЕДОВАТЕЛЬНЫЙ ДВОИЧНЫЙ ФАЙЛОВЫЙ ВВОД/ВЫВОД 109
Функция-элемент write 110
Функция-элемент read 110
Файловый ввод/вывод с прямым доступом 113
Функция-элемент seekg 113
Заключение 115
Вопросы и ответы 115
Практикум 116
Контрольные вопросы 116
Упражнение 116
Переменные и операции языка С++
Здесь представлены базовые компоненты программ на С++. В их число
входят типы данных, переменные, константы и выражения.
ИЗУЧАЕМЫЕ ПОНЯТИЯ
- Предопределенные типы данных в С++ включают в себя типы int, char,
float, double и void. В языке С++ гибкость типов данных увеличивается
благодаря применению модификаторов типов. Эти модификаторы изменяют
точность представления и диапазон значений переменных. Модификаторами
типа являются signed, unsigned, short и long.
- Идентификаторы в С++ могут иметь длину до 32 символов и
должны начинаться с буквы или подчеркивания. Последующие символы
идентификатора могут быть буквой, цифрой или подчеркиванием. Иден-
тификаторы С++ чувствительны к регистру. Ограничение на 32 символа
может быть, однако, изменено путем установки опций компилятора.
- Директива #include является специальной командой компилятора. Она
предписывает компилятору включить в программу содержимое опреде-
ленного файла, как если бы вы сами ввели его в текущий исходный
файл.
- Объявление констант предусматривает использование директивы #define
для объявления констант, определенных при помощи макросов, или ис-
пользование ключевого слова const для объявления формальных кон-
стант. Формальные константы требуют от вас определения их типа
(значением по умолчанию является int), имени и ассоциированного с
ними значения.
- Объявление переменной требует, чтобы вы задали ее тип и имя, С++
дает вам возможность инициализировать переменную при ее объявлении.
Вы можете объявить несколько переменных в одном операторе объявле-
ния.
- Арифметическими операциями являются +, -, *, / и % (деление по
модулю).
- Арифметические выражения различаются по сложности. Самое простое
выражение содержит единственный элемент данных (литерал, константу
или переменную). Сложные выражения включают набор операций, функ-
ции, литералы, константы и переменные.
- Операции инкремента и декремента используются в префиксной и пост-
фиксной формах. Язык С++ дает вам возможность применять эти опе-
рации к переменным, в которых хранятся символы, целые числа и даже
числа с плавающей точкой.
- Арифметические операции присваивания дают вам возможность записы-
вать более короткие арифметические выражения, в которых первый опе-
ранд является также переменной, принимающей результат вычислений.
- Оператор sizeof возвращает как для типов данных, так и для переменных
их размер в байтах.
- Механизм приведения типа дает вам возможность форсировать преобра-
зование типа выражения.
- Операции отношений и логические операции дают вам возможность стро-
ить логические выражения.
- Булевы выражения объединяют операции отношений и логические опе-
рации для формулирования нетривиальных условий. Эти выражения позволяют
программе принимать сложные решения.
- Условное выражение предлагает вам короткую форму для простого опе-
ратора if-else с двумя альтернативами.
- Операции манипулирования битами выполняют поразрядные операции
AND, OR, XOR и NOT. Кроме того, в С++ поддерживаются поразрядные
операции сдвига >.
- Операции манипулирования битами с присваиванием предлагают корот-
кие формы для простых операций манипулирования битами.
Буквы и цифры
Множество символов Си включает большие и малые буквы из английского
алфавита и 10 десятичных арабских цифр:
-большие английские буквы:
A B C D E F G H I J K L M N O P Q R T U V W X Y Z
-малые английские буквы:
a b c d e f g h i j k l m n o p q r t u v w x y z
-десятичные цифры:
0 1 2 3 4 5 6 7 8 9
Буквы и цифры используются при формировании констант, иден-
тификаторов и ключевых слов. Все эти конструкции описаны ниже. Компилятор
Си рассматривает одну и ту же малую и большую
буквы как отличные символы. Если в данной записи использованы малые буквы,
то замена малой буквы "a" на большую букву "A" сделает отличной данную
запись от предшествующей.
Пробельные символы
Пробел, табуляция, перевод строки, возврат каретки, новая
страница, вертикальная табуляция и новая строка- это сиволы, называемые
пробельными, поскольку они имеют то же самое назначение, как и пробелы
между словами и строками на печатной странице. Эти символы разделяют
об"екты, определенные пользователем, такие, как константы и идентификаторы,
от других об"ектов программы.
Символ CONTROL-Z рассматривается как индикатор конца файла.
Компилятор игнорирует любой текст, следующий за символом
CONTROL-Z.
Компилятор Си игнорирует пробельные символы, если они не
используются как разделители или как компоненты константы-символа или
строковых литералов. Это нужно иметь в виду, чтобы дополнительно
использовать пробельные символы для повышения наглядности программы
(например,для просмотра редактором текстов).
Знаки пунктуации и специальные символы
Знаки пунктуации и специальные символы из множества символов Си
используются для различных целей, от организации текста программы до
определения заданий, которые будут выполнены компилятором или
откомпилированной программой. В таблице 2.1 перечислены эти символы.
-----------------------------------------------------------
Символ Наименование Символ Наименование
-----------------------------------------------------------
, Запятая ! Восклицатель-
ный знак
. Точка | Вертикальная
черта
; Точка с за- / Наклонная чер-
пятой та вправо
: Двоеточие \ Наклонная чер-
та влево
? Знак вопроса ~ Тильда
' Одиночная ка _ Подчеркивание
вычка
( Левая круглая # Знак номера
скобка
) Правая круглая % Знак процента
скобка
{ Левая фигурная & Амперсанд
скобка
} Правая фигурная ^ Caret
скобка
< Левая угловая - Знак минус
скобка
> Правая угловая = Знак равно
скобка
[ Левая квадратная + Знак плюс
скобка
] Правая квадратная
скобка ---------------------------------------------------------
--
Табл. 2.1. Знаки пунктуации и специальные символы
Эти символы имеют специальный смысл для компилятора Си. Их
использование в языке Си описывается в дальнейшем содержании руководства.
Знаки пунктуации из множества представимых символов, которые не
представлены в данном списке, могут быть использованы только в строковых
литералах, константах-символах и комментариях.
ESC- последовательности
ESC- последовательности- это специальные символьные комбинации,
которые представляют пробельные символы и неграфические символы в
строках и символьных константах.
Их типичное использование связано со спецификацией таких
действий, как возврат каретки и табуляция , а также для задания
литеральных представлений символов, таких как символ двойная кавычка.
ESC-последовательность состоит из наклонной черты влево, за которой
следует буква, знаки пунктуации ' " \ или комбинация цифр. В таблице 2.2.
приведен список ESC- последовательностей языка Си.
-------------------------------------------------
ESC- последовательность Наименование
-------------------------------------------------
\n Новая строка
\t Горизонтальная табу-
ляция
\v Вертикальная табуля-
ция
\b Пробел
\r Возврат каретки
\f Новая страница
\a Звонок(сигнал)
\' Одиночная кавычка
\" Двойная кавычка
\\ Наклонная черта влево
\ddd ASCII символ в восьми-
ричном представлении
\xdd ASCII символ в шестнад-
цатиричном представлении
Табл. 2.2. ESC- последовательности
Если наклонная черта влево предшествует символу, не включенному в
этот список, то наклонная черта влево игнорируется, а символ
представляется как литеральный. Например, изображение \c
представляет символ "c" в литеральной строке или константе-символе.
Последовательности \ddd и \xdd позволяют задать любой символ в ASCII
(Американский стандартный код информационного интерфейса) как
последовательность трех восьмеричных цифр или двух шестнадцатеричных цифр.
Например, символ пробела может быть задан как \010 или \x08. Код ASCII
"нуль" может быть задан как \0 или \x0 . В восьмеричной ESC-
последовательности могут быть использованы от одной до трех восьмеричных
цифр.
Например, символ пробела может быть задан как \10 . Точно так же в
шестнадцатеричной ESC- последовательности могут быть использованы от одной
до двух шестнадцатеричных цифр. Так, шестнадцатеричная последовательность
для символа пробела может быть задана как \x08 или \x8 .
Замечание:
Когда используется восьмеричная или шестнадцатеричная
ESCпоследовательность в строках, то нужно полностью задавать все цифры
ESC- последовательности (три цифры для восьмеричной и две цифры для
шестнадцатеричной ESC- последовательностей). Иначе, если символ
непосредственно следующий за ESC- последовательностью, случайно окажется
восьмеричной или шестнадцатеричной цифрой, то он проинтерпретируется
как часть последовательности. Например, строка \x7Bell при выводе на
печать будет выглядеть как {ell , поскольку \x7B проинтерпретируется как
символ левой фигурной скобки({) . Строка \x07Bell будет правильным
представлением сим-
вола "звонок" с последующим словом Bell.
ESC- последовательности позволяют посылать неграфические управляющие
символы к внешним устройствам. Например, ESC- последовательность\033 часто
используется как первый символ команд управления терминалом и принтером.
Неграфические символы всегда должны представляться ESC-
последовательностями, поскольку, непосредственное использование в
программах на Си неграфических символов будет иметь непредсказуемый
результат.
Наклонная черта влево (\) помимо определения ESC-последовательностей
используется также, как символ продолжения строки в препроцессорных
определениях.
Если символ "новая строка" следует за наклонной чертой влево, то новая
строка игнорируется и следующая строка рассматривается, как часть
предыдущей строки.
Операции
Операции- это специальные комбинации символов, специфицирующие действия
по пробразованию различных величин. Компилятор интерпретирует каждую из
этих комбинаций как самостоятельную единицу, называемую лексемой (token).
В Табл. 2.3 представлен список операций. Операции должны
использоваться точно так, как они представлены в таблице: без пробельных
символов между символами в тех операциях, которые представлены несколькими
символами.
Операция sizeof не включена в эту таблицу. Она скорее представляет собой
ключевое слово, чем символ.
-------------------------------------------------
Операция Наименование ----------------------------------
---------------
! Логическое НЕ
~ Побитовое дополнение
+ Сложение
- Вычитание, арифмети-
ческое отрицание
* Умножение
/ Деление
% Остаток
> Сдвиг вправо
< Меньше
Больше
>= Больше или равно
== Равно
!= Не равно
& Побитовое И, адрес от
| Побитовое включающее ИЛИ
^ Побитовое исключающее ИЛИ
&& Логическое И
|| Логическое ИЛИ
' Последовательное выполне-
ние (запятая)
?: Операция условного вы-
ражения
++ Инкремент
-- Декремент
= Простое присваивание
+= Сложение с присваиванием
-= Вычитание с присваиванием
*= Умножение с присваиванием
/= Деление с присваиванием
%= Остаток с присваиванием
>>= Сдвиг вправо с присваива-
иванием
?:
Константы
Константа- это число, символ или строка символов. Константы
используются в программе как неизменяемые величины. В языке Си различают
четыре типа констант: целые константы, константы с плавающей точкой,
константы-символы и строчные литералы.
Целые константы
Целая константа- это десятичное, восьмеричное или шестнадцатеричное
число, которое представляет целую величину. Десятичная константа имеет
следующий формат представления:
,
где - это одна или более десятичных цифр от 0 до 9.
Восьмеричная константа имеет следующий формат представления:
0,
где - это одна или более восьмеричных цифр от 0 до 7.
Запись ведущего нуля необходима.
Шестнадцатеричная константа имеет один из следующих форматов
представления:
0x
0X,
где одна или более шестнадцатеричных цифр. Шестнадцатеричная
цифра может быть цифрой от 0 до 9 или
буквой (большой или малой) от A до F. В представлении константы
допускается "смесь" больших и малых букв. Запись ведущего нуля и
следующего за ним символа x или X необходима.
Пробельные символы не допускаются между цифрами целой константы. В
Табл. 2.4 иллюстрируются примеры целых констант.
-----------------------------------------------------------
Десятичные Восьмеричные Шестнадцатеричные
константы константы константы
-----------------------------------------------------------
10 012 0xa или 0xA
132 0204 0x84
32179 076663 0x7dB3 или 0x7DB3
-----------------------------------------------------------
Табл. 2.4 Примеры констант
Целые константы всегда специфицируют положительные величины. Если
требуется отрицательные величины, то необходимо сформировать константное
выражение из знака минус и следующей за ним
константы. Знак минус рассматривается как арифметическая операция.
Каждая целая константа специфицируется типом, определяющим ее
представление в памяти и область значений. Десятичные константы могут быть
типа int или long.
Восьмеричные и шестнадцатеричные константы в зависимости от размера
могут быть типа int, unsigned int, long или unsigned long. Если
константа может быть представлена как int, она специфицируется типом
int. Если ее величина больше, чем максимальная положительная величина,
которая может быть представлена типом int, но меньше величины,
которая представляется в том же самом числе бит как и int, она задается
типом unsigned int. Наконец, константа, величина которой больше чем
максимальная величина, представляемая типом unsigned int, задется
типом long или unsigned long, если это необходимо. В Табл. 2.5 показаны
диапазо-
ны величин восьмеричных и шестнадцатеричных констант, представимых
соответствующими типами на машине, где тип int имеет длину 16 бит.
-----------------------------------------------------------
Шестнадцатеричные Восьмеричные Тип
диапазоны диапазоны
-----------------------------------------------------------
0x0-0x7FFF 0-077777 int
0x8000-0xFFFF 0100000-0177777 unsigned int
0x10000-0x7FFFFFFF 0200000-017777777777 long
0x80000000-0xFFFFFFFF 020000000000-030000000000 unsigned long
-----------------------------------------------------------
Табл. 2.5 Диапазоны величин восьмеричных и
шестнадцатеричных констант
Важность рассмотренных выше правил состоит в том, что восьмеричные и
шестнадцатеричные константы не содержат "знаковых" расширений, когда
они преобразуются к более длинным типам (преобразование типов смотри в
разделе 5 "Выражения и присваивания").
Программист может определить для любой целой константы тип
long, приписав букву "l" или "L" в конец константы. В Табл. 2.6 показаны
примеры целых констант.
------------------------------------------------------------
Десятичные Восьмеричные Шестнадцатеричные
константы константы константы
------------------------------------------------------------
10L 012L 0xaL или 0xAL
79l 0115l 0x4fl или 0x4Fl
------------------------------------------------------------
Табл. 2.6 Примеры целых констант типа long
Константы с плавающей точкой
Константа с плавающей точкой- это действительное десятичное
положительное число. Величина действительного числа включает целую,
дробную части и зкспоненту. Константы с плавающей точкой имеют
следующий формат представления:
[][.][E[-]],
где - одна или более десятичных цифр (от 0 до 9),
а E или e -символ экспоненты. Целая или дробная части константы могут
быть опушены, но не обе сразу. Десятичная точка может быть опущена только
тогда, когда задана экспонента.
Экспонента состоит из символа экспоненты, за которым следует
целочисленная величина экспоненты, возможно отрицательная.
Пробельные символы не могут разделять цифры или символы
константы.
Константы с плавающей точкой всегда специфицируют положительные
величины. Если требуются отрицательные величины, то необходимо сформировать
константное выражение из знака минус и следующей за ним константы. Знак
минус рассматривается как арифметическая операция.
Примеры констант с плавающей точкой и константных выраже-
ний:
15.75
1.575E1
1575e-2
-0.0025
-2.5e-3
25e-4
Целая часть константы с плавающей точкой может быть опущена, например:
.75
.0075e2
-.125
-.175E-2
Все константы с плавающей точкой имеют тип double.
Константа-символ
Константа-символ- это буква, цифра, знак пунктуации или ESC- символ,
заключенные в одиночные кавычки. Величина константы-символа равна
значению представляющего ее кода символа.
Константа-символ имеет следующую форму представления:
'',
где может быть любым символом иэ множества представимых
символов, включая любой ESC- символ, исключая одиночную кавычку ('),
наклонную черту влево (\) и символ новой строки.
Чтобы использовать одиночную кавычку или наклонную черту влево в
качестве константы-символа, необходимо вставить перед этими знаками
наклонную черту влево. Чтобы представить символ новой строки, необходимо
использовать запись '\n'.
----------------------------------------------
Константа Название величины
----------------------------------------------
'a' Малая буква а
'?' Знак вопроса
'\b' Знак пробела
'0x1B' ASCII ESC- символ
'\'' Одиночная кавычка
'\\' Наклонная черта влево
-------------------------------------------------
Табл. 2.7 Примеры констант-символов.
Константы-символы имеют тип int.
Строковые литералы
Строковый литерал- это последовательность букв, цифр и символов,
заключенная в двойные кавычки. Строковый литерал рассматривается как
массив символов, каждый элемент которого представляет отдельный символ.
Строковый литерал имеет следующую форму представления:
"" ,
где - это нуль или более символов из множества представимых
символов, исключая двойную кавычку ("), наклонную черту влево (\) и
символ новой строки. Чтобы использовать символ новой строки в строковом
литерале, необходимо напечатать наклонную черту влево, а затем символ
новой строки.
Наклонная черта влево вместе с символом новой строки будут
проигнорированы компилятором , что позволяет формировать строковые
литералы, располагаемые более чем в одной строке. Например, строковый
литерал:
"Long strings can be bro\
cken into two pieces."
идентичен строке:
"Long strings can be brocken into two pieces."
Чтобы использовать двойные кавычки или наклонную черту влево внутри
строкового литерала, нужно представить их с предшествующей наклонной чертой
влево, как показано в следующем примере:
"This is a string literal"
"First \\ Second"
"\"Yes, I do,\" she said."
"The following line shows a null string:"
""
Заметим, что ESC- символы (такие как \\ и \") могут появляться в
строковых литералах. Каждый ESC- символ считается одним отдельным символом.
Символы строки запоминаются в отдельных байтах памяти. Символ null (\0)
является отметкой конца строки. Каждая строка в программе
рассматривается как отдельный об"ект. Если в программе содержатся две
идентичные строки, то каждая из них будет храниться в отдельном месте
памяти.
Строчные литералы имеют тип char[]. Под этим подразумевается, что
строка- это массив, элементы которого имеют тип char. Число элементов в
массиве равно числу символов в строчном литерале плюс один, поскольку
символ null (отметка конца строки) тоже считается элементом массива.
Идентификаторы
Идентификаторы- это имена переменных, функций и меток, используемых в
программе. Идентификатор создается об"явлением соот-
ветствующей ему переменной или функции.После этого его можно использовать
в последующих операторах программы. Идентификатор- это последовательность
из одной или более букв, цифр или подчерков(_), которая начинается с
буквы или подчерка. Допускается любое число символов в идентификаторе,
однако только первые 31 символ распознаются компилятором. (Программы,
использующие результат
работы компилятора, такие как, линкер, могут распознавать меньшее число
символов).
При использовании подчерков в идентификаторе нужно быть осторожным,
поскольку идентификаторы, начинающиеся с подчерка могут совпадать (войти в
конфликт) с именами "скрытых" системных программ.
Примеры идентификаторов:
temp1
toofpage
skip12
Компилятор Си рассматривает буквы верхнего и нижнего регистров как
различные символы. Поэтому можно создать отдельные независимые
идентификаторы, которые совпадают орфографически, но различаются большими и
малыми буквами. Например, каждый из следующих идентификаторов является
уникальным:
add
ADD
Add
aDD
Компилятор Си не допускает идентификаторов, которые имеют ту же самую
орфографию, что и ключевые слова. Ключевые слова описаны в следующем
раздела
Замечание:
По сравнению с компилятором, сборщик может в большей степени
ограничивать количество и тип символов для глобальных идентификаторов, и в
отличие от компилятора не делать различия между большими и малыми
буквами. (Подробнее смотри руководство по пакету MSC).
Ключевые слова
Ключевые слова- это предопределенные идентификаторы, которые имеют
специальное значение для компилятора Си. Их можно использовать только так
как они определены. Имена об"ектов программы не могут совпадать с
названиями ключевых слов.
Список ключевых слов:
auto double int struct
break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof while
do if static volatile
Ключевые слова не могут быть переопределены. Тем не менее, они могут
быть названы другим текстом, но тогда перед компиляцией они должны быть
заменены посредством препроцессора на соответствующие ключевые слова.
Ключевые слова const и volatile зарезервированы для будущего
использования.
Следующие идентификаторы могут быть ключевыми словами для некоторых
приложений:
cdecl
far
fortran
huge
near
pascal
Комментарии
Комментарий- это последовательность символов, которая воспринимается
компилятором как отдельный пробельный символ или, другими словами,
игнорируется.
Комментарий имеет следующую форму представления:
/**/,
где может быть любой комбинацией символов из множества
представимых символов, включая символы новой строки, но исключая комбинацию
*/. Это означает, что комментарии могут занимать более одной строки, но не
могут быть вложенными.
Комментарии допускаются везде, где разрешены пробельные символы.
Компилятор игнорирует символы комментария, в частности, в комментариях
допускается запись ключевых слов и зто не приведет к ошибке. Так как
компилятор рассматривает комментарий как символ пробела, то комментарии не
могут появляться внутри лексем.
Следующие примеры иллюстрируют некоторые комментарии:
/* Comments can separate and document
lines of a program. */
/* Comments can contain keywords such as for
and while */
/*******************************************
Comments can occupy several lines.
*******************************************/
Так как комментарии не могут содержать вложенных комментариев, то
следующий пример будет ошибочным:
/* You cannot/* nest */ comments */
Компилятор распознает первую комбинацию */ после слова nest как конец
комментария. Затем, компилятор попытается обрабатывать оставшийся текст и
выработает сообщение об ошибке. Чтобы обойти
компиляцию комментариев больших размеров, нужно использовать директиву #if
препроцессора.
Лексемы
Когда компилятор обрабатывает программу, он разбивает программу на
группы символов, называемых лексемами. Лексема- это единица текста
программы, которая имеет определенный смысл для компилятора и которая не
может быть разбита в дальнейшем. Операции, константы, идентификаторы и
ключевые слова, описанные в этом разделе,являются примерами лексем. Знаки
пунктуации, такие как квадратные скобки ([]), фигурные скобки ({}),
угловые скобки (<>), круглые скобки и запятые, также являются лексемами.
Границы лексем определяются пробельными символами и другими лексемами,
такими как операции и знаки пунктуации. Чтобы предупредить неправильную
работу компилятора, запрещаются пробельные символы между символами
идентификаторов, операциями, состоящими из нескольких символов и символами
ключевых слов.
Когда компилятор выделяет отдельную лексему, он последовательно
об"единяет столько символов, сколько возможно, прежде чем перейти к
обработке следующей лексемы. Поэтому лексемы, не разделенные пробельными
символами, могут быть проинтерпретированы неверно.
Например, рассмотрим следующее выражение:
i+++j
В этом примере компилятор вначале создает из трех знаков плюс самую
длинную из возможных операций (++), а затем обработает оставшийся знак +,
как операцию сложения (+). Выражение проинтерпретируется как (i++)+(j), а
не как (i)+(++j). В таких случаях необходимо использовать пробельные
символы или круглые скобки, чтобы однозначно определить ситуацию.
ИСХОДНЫЕ ТЕКСТЫ ПРИМЕРОВ
// Программа VAR.CPP, иллюстрирующая простые переменные
#include
int main()
{
int i, j = 2;
double x, y = 355.0 / 113;
i = 3 * j;
cout
#define SEC_IN_MIN 60
#define MIN_IN_HOUR 60
int main()
{
long hours, minutes, seconds;
long totalSec;
cout > hours;
cout > minutes;
cout > seconds;
totalSec = ((hours * MIN_IN_HOUR + minutes) *
SEC_IN_MIN) + seconds;
cout
const int SEC_IN_MIN = 60; // глобальная константа
int main()
{
const int MIN_IN_HOUR = 60; // локальная константа
long hours, minutes, seconds;
long totalSec;
cout > hours;
cout > minutes;
cout > seconds;
totalSec = ((hours * MIN_IN_HOUR + minutes) *
SEC_IN_MIN) + seconds;
cout
int main()
{
int int1, int2;
long long1, long2, long3, long4, long5;
float x, y, real1, real2, real3, real4;
cout > int1;
cout > int2;
cout > x;
cout > y;
cout
int main()
{
short int aShort;
int anInt;
long aLong;
char aChar;
float aReal;
cout
int main()
{
short shortInt1, shortInt2;
unsigned short aByte;
int anInt;
long aLong;
char aChar;
float aReal;
// присваиваются значения
shortInt1 = 10;
shortInt2 = 6;
// действия выполняются без приведения типа
aByte = shortInt1 + shortInt2;
anInt = shortInt1 - shortInt2;
aLong = shortInt1 * shortInt2;
aChar = aLong + 5; // автоматическое преобразование
// в символьный тип
aReal = shortInt1 * shortInt2 + 0.5;
cout = lowVal && i 0 )
j = i * 1;
else
j = 10 - i;
Сравните этот листинг и его вариант с отступами
if ( i > 0 )
j = i * i;
else
j = 10 - i;
Последний вариант читается много легче; легко указать, где операторы if
и else. Более того, если вы будете работать с вложенными циклами, отступы
еще более значимы в отношении удобочитаемости кода.
Каковы правила написания условий в операторе if-else?
Здесь существуют два подхода. Первый рекомендует писать условия так,
что true будет чаще, чем false. Второй подход рекомендует избегать
отрицательных выражений (тех, которые используют операции сравнения != и
булевы операции !).
Программисты из последнего лагеря преобразуют такой оператор if:
if ( i != 0 )
j = 100/i;
else
j = 1;
в следующую эквивалентную форму:
if ( i == 0 )
j = 1;
else
Страницы: 1, 2, 3, 4, 5
|