
- •1. Порядок выполнения работы
- •2. Предмашинная подготовка задачи
- •2.1. Алфавит
- •2.2. Простейшие конструкции
- •2.2.1. Ключевые слова
- •2.2.2. Переменные
- •2.2.4. Вызов функций
- •2.3. Выражения
- •2.3.1. Арифметические операции
- •2.4. Операторы
- •2.5.1. Комментарии
- •2.5.2. Директивы препроцессора
- •2.5.3. Глобальные переменные
- •2.5.4. Тело программы.
2.5.1. Комментарии
При создании программного продукта разработчик всегда ясно представляет, что будет выполнять та или иная часть программы. Однако, если программа довольно сложная, через какое-то время бывает трудно вспомнить всю цепь логических рассуждений, предшествовавших написанию программы. Особенно сложно бывает разобраться в текстах программ других разработчиков.
Чтобы избежать подобных неприятностей, в процессе составления программного кода используются так называемые комментарии. Тест комментариев всегда игнорируется компилятором, но позволяет программисту описывать назначение программы или какой-либо её части.
В С++ используется две разновидности комментариев.
Первый, традиционный (заимствованный из С) многострочный комментарий, представляет собой блок, начинающийся с последовательности символов 'слеш со звёздочкой' (/*) и заканчивается символами 'звёздочка слеш' (*/). Как следует из названия, данный вид комментария может располагаться на нескольких строках. Комментарии этого вида не могут быть вложенными друг в друга.
Второй вид – однострочный комментарий – следует за 'двойным слешем' (//) до конца текущей строки. Этот тип комментария может быть вложенным в многострочный комментарий и используется только в языке С++.
Кроме пояснений текста программы комментарии можно использовать для временного исключения из программы некоторой её части. Этот приём обычно используется при отладке.
Например:
// примеры комментария
int a=0; // int d;
/* int b=15 */
int c=7;
/* <– начало комментария
a=c;
конец комментария ->*/
В приведённом примере компилятор проигнорирует объявление переменных b и d, а также присвоение переменной а значения переменной с.
2.5.2. Директивы препроцессора
Препроцессор – специализированная программа предназначенная для первичной (до компиляции) обработки файлов исходных модулей программ С/С++. Использование препроцессора позволяет облегчить написание программ, делает их мобильными, легко читаемыми и удобными для отладки.
Директивы препроцессора – команды, предписывающие препроцессору выполнения тех или иных действий.
Все директивы начинаются с символа #. Перед начальным символом # и вслед за ним могут располагаться пробелы.
Директива #include позволяет включить в текст файла с искомым кодом текст, содержащийся в другом файле. Синтаксис её использования следующий:
#include <header_name>
#include "header_name"
#include macro_identifier
Здесь header_name должно быть именем файла с расширением. Традиционно используется расширение h или hpp. Кроме того, в header_name может указываться путь к файлу. Препроцессор удаляет директиву #include из текста файла с исходным кодом и направляет содержимое указанного в ней файла для обработки компилятором. Если указан путь к файлу, компилятор ищет его в указанном каталоге. Первая и вторая форма синтаксиса различаются используемым компилятором алгоритмом поиска файла, если полный путь к нему не задан. Форма <header_name>, в которой имя заголовочного файла задаётся в угловых скобках, указывает компилятору, что заголовочный файл следует искать в подкаталоге \INCLUDE компилятора. Форма "header_name", в которой имя заголовочного файла задаётся в кавычках, указывает, что заголовочный файл следует искать в текущем каталоге, затем – в подкаталоге \INCLUDE компилятора. Если препроцессор не обнаружит указанный в директиве файл, выдаётся сообщение об ошибке. Количество файлов, подлежащих включению в программу, не ограничено.
В третьей версии предполагается, что существует макроопределение, которое раскрывается в допустимое имя заголовочного файла.
Основные включаемые файлы:
stdio.h – файл, содержащий описание функций стандартного
ввода-вывода С/С++. В частности функций
scanf – форматный ввод-вывод с клавиатуры;
printf – форматный вывод на экран;
conio.h – файл, содержащий описание функций ввода-вывода
для консоли и порта С/С++. К ним относятся:
getch – ввод с клавиатуры одиночного символа;
clrscr – функция очистки экрана;
iostream.h – файл, содержащий описание операций потокового
ввода-вывода С++;
math.h – файл, содержащий описание стандартных
математических функций С/С++.
Директива #define позволяет определить некоторый идентификатор, а так же связать его с последовательностью символов, представляющих собой некоторую конструкцию (лексему) языка С/С++. В последнем случае он служит для определения макроса.
Рассмотрим сначала вариант использования директивы #define для определения некоторого идентификатора или символической константы. Например, директива
#define DEBUG
определяет идентификатор DEBUG. После того, как идентификатор определён в данном файле, он может быть использован в других директивах препроцессора. Отменить определение идентификатора можно с помощью директивы #undef. Например:
#undef DEBUG
Директива #ifdef позволяет проверить, определена ли символическая константа и, если – да, следующие за ней строки будут направлены для обработки компилятором. Она относится к так называемым условным директивам, поскольку проверяет выполнение некоторого условия и в зависимости от результата проверки изменяет процесс компиляции. Используемая совместно с данной (и другими условными директивами), директива #endif сообщает препроцессору о конце условного блока кода.
Приведём пример использования этих директив:
#ifdef DEBUG
//Какая-то часть исходного кода,
//которая должна выполняться в отладочной
//версии программы
#endif
Сходной с директивой #ifdef является директива #ifndef. Эта директива также поверяет существование указанного в ней идентификатора, однако следующие за ней строки передаются компилятору, если этот идентификатор не определён.
Приведём пример её использования:
#ifndef WINVER
#define WINVER 0x400
#endif
Часто директива используется при необходимости замены поименованной величины, её конкретным значением. Например, директива
#define PI 3.1416
предписывает замену в тексте программы идентификатора PI последовательностью символов: 3.1416, которая при обработке будет определена компилятором как числовая константа.
Макросы
Макрос – это фрагмент кода, который выглядит и работает так же, как функция. Однако функцией он не является. Имеется несколько различий между макросами и функциями:
макрос заменяется своим определением во время работы препроцессора, т. е. ещё до компиляции программы. Поэтому макросы не вызывают дополнительных затрат времени, как при вызове функции;
использование макросов приводит к разрастанию исходного кода и увеличению размера исполняемой программы. Функции являются в некотором смысле антиподом макросов. Код, который они представляют, встраивается в программу только один раз, что приводит к сокращению кода программы. С другой стороны, при выполнении программы требуется дополнительное время для организации вызова функции;
компилятор не выполняет никаких проверок типов в макросе. Поэтому при передаче макросу аргумента, не соответствующего подразумеваемому типу, или неверного числа аргументов, никаких сообщений об ошибке не будет;
поскольку макрос является средством для встраивания фрагмента кода, не существует единого адреса, связанного с ним. Поэтому нельзя определить указатель на макрос или использовать его адрес.
Для определения макросов используется директива
#define. Как и функция макросы могут иметь параметры. Например,
#define MULTIPLY(x,y) ((x)*(y))
В этом случае фрагмент кода
int a=2,b=3;
int c= MULTIPLY(a,b);
будет заменён кодом
int a=2,b=3;
int c= ((a)*(b));
Внешне использование макроса похоже не использование функции (из-за чего их иногда называют псевдофункциями). Поскольку, как отмечено выше, это всё-таки разные объекты, принято имена макросов записывать прописными буквами. Кроме того, рекомендуется в макроопределении заключать в скобки всё тело макроса и каждый из его параметров. Если определение макроса не умещается на одной строке, оно может быть продолжено в последующих строках. Для продолжения макроопределения в следующей строке достаточно в конце текущей строки поставить знак '\'. Макрос может быть аннулирован в любом месте программы с помощью директивы #undef.