Во второй синтаксической форме в директиве #define присутствует список формальных параметров, которы может включать в себя один или несколько идентифика торов, которые разделены запятыми. Формальные пара метры в тексте макроопределения отмечают позиции на которые должны быть подставлены фактические ар гументы макровызова. Любой формальный параметр способен появиться в тексте макроопределения несколь ко раз.
При макровызове за идентификатором следует спи сок фактических аргументов, количество которых сле дует сделать совпадающим с количеством формальны параметров.
Пример:
#define MAX(x,y) ((x) (y))?(x): (y)
Приведенная директива заменит фрагмент t = = MAX(i,s[i]) на выражение t = ((i) (s[i])?(i): (s[i]).
Как и в ранее приведенном примере, круглые скобки, в которые заключены формальные параметры макроопределения, дают возможность избежать ошибок, связанных с неправильным порядком осуществления, если фактические аргументы являются выражениями.
Например, если есть скобки, фрагмент
t = MAX(ij, s[i]||j) будет заменен выражением
t = ((ij) (s[i]||j)?(ij): (s[i]||j); а если скобок нет – фрагментом
t = (ijs[i]||j)?ij: s[i]||j;
где условное выражение вычисляется в другом порядке.
Директива #undef применяется для отмены действия директивы #define. Синтаксис данной директивы следующий: #undef идентификатор.
Директива отменяет операцию текущего определения #define для определенного идентификатора.
19. Рекурсия
Функция является рекурсивной, когда во время обработки появляется ее повторный вызов непосредственно или косвенно, через цепочку вызовов других функций.
Прямая (непосредственная) рекурсия – это вызов функции внутри тела этой функции.
int a
{…..a…..}
Косвенная рекурсия – это рекурсия, которая осуществляет рекурсивный вызов функции через цепочку вызова других функций. Все функции, которые входят в цепочку, тоже являются рекурсивными. Рассмотрим пример:
a{…..b…..}
b{…..c…..}
c{…..a…..}.
Все представленные функции a, b, c считаются рекурсивными, так как в случае вызова одной из них производится вызов других и самой себя.
Последовательность вызовов процедуры tn, если m = 3, можно проиллюстрировать древовидной структурой (рис. 2). Всякий раз при вызове процедуры tn под параметры n, i, j, w определяется память и запоминается место возврата. В случае возврата из процедуры tn память, которая выделяется под параметры n, i, j, w, освобождается и становится доступной память, которая выделена под параметры n, i, j, w предыдущим вызовом, а управление передается в место возврата.
Рис. Последовательность вызовов процедуры tn
Очень часто рекурсивные функции можно заменить нерекурсивными функциями или фрагментами. Это производится путем использования стеков для хранения точек вызова и вспомогательных переменных.
20. Знакомство с языком СИ++
Рассмотрим ряд программ и частей программ на C++.
Прежде всего, рассмотрим программу, которая выводит строку выдачи:
#include
main
cout «Hello, world\n»; }
Строка #include дает знать компилятору, что он включил обычные возможности потока ввода и вывода, которые находятся в файле stream.h. Без таких описаний выражение cout «Hello, world\n» не имело бы смысла. Операция («поместить в») следует написать первый аргумент во второй (в нашем случае строку «Hello, world\n» в стандартный поток вывода cout). Строка представляет собой последовательность символов, которые заключены в двойные кавычки. В строке символ обратной косой \, после которого идет другой символ, обозначает один специальный символ; в рассмотренном случае \n служит символом новой строки. Получаем, что выводимые символы состоят из Hello, world и перевода строки. Остальная часть программы
main {… }
задает функцию, названную main. Любая программа должна включать в себя функцию с именем main, и действие программы начинается с выполнения этой функции.
Откуда появились выходной поток cout и код, который реализует операцию вывода, были показаны в stream.h, т. е. были определены их типы, но не было дано каких-либо подробностей относительно их реализации. В стандартную библиотеку входит спецификация пространства и инициализирующий код для cout. Команда компиляции в C++ чаще всего называется CC. Она применяется так же, как команда cc для программ на C. Пусть программа с «Hello, world» находится в файле с именем hello.c, тогда можно ее скомпилировать и запустить приблизительно так ($ – системное приглашение):
$ CC hello.c $ a.out Hello,world
$
a. out является принимаемым по умолчанию именем исполняемого результата компиляции. Если необходимо назвать программу, можно осуществить это с помощью опции – o:
$ CC hello.c – o hello
$ hello Hello,world
$
21. Комментарии в СИ++