Описания имеют вид
описания: спецификация-типа список-описателей; определение-функции
Описатели в списке-описателей содержат описываемые идентификаторы.
Описание происходит в определенной области видимости.
Спецификация типа
К спецификации типа относятся:
спецификация-типа: имя-простого-типа спецификация-сложного-типа имя-простого-типа: unsigned opt char unsigned opt short unsigned opt int unsigned opt long unsigned float double var спецификация-сложного-типа: struct имя-класса
Описатели
Список-описателей, фигурирующий в описании, — это последовательность через запятую описателей, каждый из которых может иметь инициализатор.
список-описателей: описатель-с-инициализатором список-описаний , описатель-с-инициализатором описатель-с-инициализатором: описатель инициализатор opt
Описание состоит из двух частей: спецификации-типа и описателей (список-описателей). Спецификация задает основной тип описываемых объектов. Описатели задают имена этих объектов, а также, возможно, изменяют тип с помощью таких операции [] (массив). В описателе также можно задать начальные значения.
Описатели имеют такой синтаксис:
описатель: имя описатель [ выражение ]
Смысл описателей
Список описателей следует после списка спецификаций типа. Каждый описатель содержит в точности одно имя, которое задает описываемый идентификатор. Тип каждого имени определяется как спецификацией-типа, так и его описателем.
Таким образом, описание некоторого идентификатора имеет вид
T D
где T обозначает тип, а D — описатель.
Массивы
В описании T D, в котором D имеет вид
D1 [ выражение ]
описывается идентификатор типа «... массив T». Выражение должно иметь целочисленный тип и значение, большее 0. Это выражение задает число элементов массива. Если значение выражения есть N, то массив имеет N элементов с индексами от 0 до N-1.
Массив можно образовывать из: одного из основных типов, класса или из другого массива.
Если подряд идут несколько спецификаций «массив ...», образуется многомерный массив.
В описании
float fa[17];
описан массив чисел типа float, а в описании
int x3d[3][5][7];
описан статический трехмерный массив целых размера 3 x 5 x 7.
За описателем может идти начальное значение описываемого идентификатора.
инициализатор: = выражение-присваивания
Переменные можно инициализировать произвольными выражениями, содержащими константы, функции и описанные ранее переменные.
int a=2; int b=f(a); int c=b+a;
Гарантируется, что переменные статического класса памяти, которые не были инициализированы, в качестве начального значения получат 0, приведенный к нужному типу. Начальные значения локальных переменных, которые не были инициализированы, не определены.
определение-функции: имя ( список-описаний-параметров ) тело-функции тело-функции: составной-оператор список-описаний-параметров: описание-параметра opt список-описаний-параметров , описание-параметра описание-параметра: & opt имя
Формальные параметры относятся к области видимости самого большого блока тела-функции.
Параметр, предваренный в описании символом &, принимается по ссылке. Это означает, что изменение его в теле функции в действительности есть изменение фактического параметра. Остальные параметры принимаются по значению. Это означает, что при передаче фактического параметра создаётся его копия, с которой и ведётся работа в теле функции (возможные изменения не затрагивают фактический параметр).
Приведем пример определения функции.
max(a,b,c) { int m=(a > b) ? a : b; return (m > c) ? m : c; }