Описания

Описания имеют вид

		описания:
		спецификация-типа список-описателей;
		определение-функции
	

Описатели в списке-описателей содержат описываемые идентификаторы.

Описание происходит в определенной области видимости.

Спецификация типа

К спецификации типа относятся:

		спецификация-типа:
		имя-простого-типа
		спецификация-сложного-типа
		имя-простого-типа:
		unsigned opt char
		unsigned opt short
		unsigned opt int
		unsigned opt long
		unsigned
		float
		double
		var
		спецификация-сложного-типа:
		struct имя-класса
	

Описатели

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

		список-описателей:
		описатель-с-инициализатором
		список-описаний , описатель-с-инициализатором
		описатель-с-инициализатором:
		описатель инициализатор opt
	

Описание состоит из двух частей: спецификации-типа и описателей (список-описателей). Спецификация задает основной тип описываемых объектов. Описатели задают имена этих объектов, а также, возможно, изменяют тип с помощью таких операции [] (массив). В описателе также можно задать начальные значения.

Описатели имеют такой синтаксис:

		описатель:
		имя
		описатель [ выражение ]
	

Смысл описателей

Список описателей следует после списка спецификаций типа. Каждый описатель содержит в точности одно имя, которое задает описываемый идентификатор. Тип каждого имени определяется как спецификацией-типа, так и его описателем.

Таким образом, описание некоторого идентификатора имеет вид

		T D
	

где T обозначает тип, а D — описатель.

Определения функций

Определения функций имеют вид

		определение-функции:
		имя ( список-описаний-параметров ) тело-функции
		тело-функции:
		составной-оператор
		список-описаний-параметров:
		описание-параметра opt
		список-описаний-параметров , описание-параметра
		описание-параметра:
		& opt имя
	

Формальные параметры относятся к области видимости самого большого блока тела-функции.

Параметр, предваренный в описании символом &, принимается по ссылке. Это означает, что изменение его в теле функции в действительности есть изменение фактического параметра. Остальные параметры принимаются по значению. Это означает, что при передаче фактического параметра создаётся его копия, с которой и ведётся работа в теле функции (возможные изменения не затрагивают фактический параметр).

Приведем пример определения функции.

		max(a,b,c)
		{
		int m=(a > b) ? a : b;
		return (m > c) ? m : c;
		}