A7.2. Первичные выражения
Первичные выражения это идентификаторы, константы, строки и выражения в скобках.
первичное - выражение :
идентификатор
константа
строка
( выражение )
Идентификатор, если он был должным образом объявлен (о том, как это делается, речь пойдет ниже), - первичное выражение. Тип идентификатора специфицируется в его объявлении. Идентификатор есть lvalue , если он обозначает объект (A5) арифметического типа, либо объект типа "структура", "объединение" или "указатель".
Константа - первичное выражение. Ее тип зависит от формы записи, которая была рассмотрена в A2.5.
Строковый литерал - первичное выражение. Изначально его тип - "массив из char " ("массив из wchar_t " для строки символов расширенного набора), но в соответствии с правилом, приведенным в A7.1, указанный тип обычно превращается в "указатель на char " ("указатель на wchar_t ") с результирующим значением "указатель на первый символ строки". Для некоторых инициализаторов такая замена типа не делается. (см. A8.7)
Выражение в скобках - первичное выражение, тип и значение которого идентичны типу и значению этого же выражения без скобок. Наличие или отсутствие скобок не влияет на то, является ли данное выражение lvalue или нет.
A7.3. Постфиксные выражения
В постфиксных выражениях операторы выполняются слева направо.
постфиксное-выражение :
первичное-выражение
постфиксное-выражение [ выражение ]
постфиксное-выражение ( список-аргументов-выражений необ )
постфиксное-выражение.идентификатор
постфиксное-выражение->идентификатор
постфиксное-выражение ++
постфиксное-выражение --
список-аргументов-выражений :
выражение-присваивание
список-аргументов-выражений , выражение-присваивание
A7.3.1. Обращение к элементам массива
Постфиксное выражение, за которым следует выражение в квадратных скобках, есть постфиксное выражение, обозначающее обращение к индексируемому массиву. Одно из этих двух выражений должно принадлежать типу "указатель на T", где T - некоторый тип, а другое - целочисленному типу; тип результата индексирования есть T. Выражение E1[E2] по определению идентично выражению *((E1)+(E2)). Подробности см. в A8.6.
Вызов функции есть постфиксное выражение (оно называется именующим выражением функции - function designator ), за которым следуют скобки, содержащие (возможно пустой) список разделенных запятыми выражений-присваиваний (A7.17), представляющих собой аргументы этой функции. Если постфиксное выражение - идентификатор, не объявленный в текущей области видимости, то считается, что этот идентификатор как бы неявно описан объявлением
extern int identifier ();
помещенным в самом внутреннем блоке, содержащем вызов соответствующей функции. Постфиксное выражение (после, возможно неявного, описания и генерации указателя, см. A7.1) должно иметь тип "указатель на функцию, возвращающую T ", где T - тип возвращаемого значения.
В первой версии языка для именующего выражения функции допускался только тип "функция", и чтобы вызвать функцию через указатель, требовался явный оператор *. ANSI-стандарт поощряет практику некоторых существующих компиляторов, разрешающих иметь одинаковый синтаксис для обращения просто к функции и обращения к функции, специфицированной указателем. Возможность применения старого синтаксиса остается.
Термин аргумент используется для выражения, задаваемого в вызове функции; термин параметр - для обозначения получаемого ею объекта (или его идентификатора) в определении или объявлении функции. Вместо этих понятий иногда встречаются термины "фактический аргумент (параметр)" и "формальный аргумент (параметр)", имеющие те же смысловые различия.
При вызове функции каждый ее аргумент копируется; передача аргументов осуществляется строго через их значения. Функции разрешается изменять значения своих параметров, которые являются лишь копиями аргументов- выражений, но эти изменения не могут повлиять на значения самих аргументов. Однако можно передать указатель, чтобы позволить функции изменить значение объекта, на который указывает этот указатель.
Имеются два способа объявления функции. В новом способе типы параметров задаются явно и являются частью типа функции; такое объявление называется прототипом функции. При старом способе типы параметров не указываются. Способы объявления функций обсуждаются в A8.6.3 и A10.1.
Читать дальше