Сводка синтаксических правил.

Эта сводка синтаксиса языка "C" предназначена скорее для облегчения понимания и не является точной формулировкой языка.


Выражения.

Основными выражениями являются следующие:

Выражение:
первичное-выражение
* выражение
& выражение
- выражение
! выражение
~ выражение
++ l-значение
-- l-значение
l-значение ++
l-значение --
sizeof выражение
(имя типа) выражение
выражение бинарная-операция выражение
выражение ? выражение : выражение
l-значение операция-присваивания выражение
выражение, выражение

Первичное выражение:
идентификатор
константа
строка
(выражение)
первичное-выражение (список выраженийнеоб)
первичное-выражение [выражение]
l-значение . идентификатор
первичное-выражение -> идентификатор

l-значение:
идентификатор
первичное-выражение [выражение]
l-значение . идентификатор
первичноe-выражение -> идентификатор
* выражение
(l-значение)

Операции первичных выражений


 () [] . ->
имеют самый высокий приоритет и группируются слева направо. Унарные операции

 * & - ! ~ ++ -- sizeof(имя типа)
имеют более низкий приоритет, чем операции первичных выражений, но более высокий, чем приоритет любой бинарной операции. Эти операции группируются справа налево. Все бинарные операции и условная операция (прим. Перевод.: условная операция группируется справа налево; это изменение внесено в язык в 1978 г.) группируются слева направо и их приоритет убывает в следующем порядке:
бинарная операция:
* / %
+ -
>> <<
< > <= >=
== !=
&
~
|
&&
||
?:

Все операции присваивания имеют одинаковый приоритет и группируются справа налево.

Операции присваивания:
= += -= *= ?= %= >>= <<= &= ~= |=

Операция запятая имеет самый низкий приоритет и группируется слева направо.


Описания.

Описание:
спецификаторы-описания список-инициализируемых-описателейнеоб;

Спецификаторы-описания:
спецификатор-типа спецификаторы-описаниянеоб
спецификатор-класса-памяти спецификаторы-описаниянеоб

Спецификатор-класса-памяти:
auto
static
extern
register
typedef

Спецификатор-типа:
char
short
int
long
unsigned
float
double
спецификатор-структуры-или-об'единения
определяющее-тип-имя

Список-инициализируемых-описателей:
инициализируемый-описатель
инициализируемый-описатель,
список-инициализируемых-описателей

инициализируемый-описатель
описатель-инициализаторнеоб

Описатель:
идентификатор
(описатель)
* описатель
описатель ()
описатель [константное выражениенеоб]

Спецификатор-структуры-или-об'единения:
struct список-описателей-структуры
struct идентификатор {список-описаний-структуры}
struct идентификатор
union {список-описаний-структуры}
union идентификатор {список-описаний-структуры}
union идентификатор

Список-описаний-структуры:
описаниe-структуры
описаниe-структуры список-описаний-структуры

Описание структуры:
спецификатор-типа список-описателей-структуры:

Список-описателей-структуры:
описатель-структуры
описатель-структуры, список-описателей-структуры

Описатель-структуры:
описатель
описатель: константное выражение
:константноe-выражение

Инициализатор:
= выражение
= {список-инициализатора}
= {список-инициализатора,}

Список инициализатора:
выражение
список-инициализатора, список-инициализатора
{список-инициализатора}

Имя-типа:
спецификатор-типа абстрактный-описатель

Абстрактный-описатель:
пусто
{абстрактный-описатель}
* абстрактный-описатель
абстрактный-описатель ()
абстрактный-описатель [константноe-выражениенеоб]

Определяющее-тип-имя:
идентификатор


Операторы

Составной-оператор:
{список-описанийнеоб список-операторовнеоб}

Список-описаний:
описание
описание список-описаний

Список-операторов:
оператор
оператор список-операторов

Оператор:
составной оператор
выражение;
if (выражение) оператор
if (выражение) оператор else оператор
while (выражение) оператор
do оператор while (выражение);
for ( выражениe-1необ; выражениe-2необ; выражениe-3необ) оператор
switch (выражение) оператор
case константноe-выражение : оператор
default: оператор
break;
continue;
return;
return выражение;
goto идентификатор;
идентификатор : оператор
;


Внешние определения

Программа:
внешнее-определение
внешнее-определение программа

Внешнеe-определение:
определениe-функции
определениe-данных

Определениe-функции:
спецификатор-типанеоб описатель-функции тело-функции

Описатель-функции:
описатель (список-параметровнеоб)

Список-параметров:
идетификатор
идентификатор, список-параметров

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

Оператор-функции:
{список описанийнеоб список-операторов}

Определение данных:
externнеоб спецификатор-типанеоб список-инициализируемых-описателейнеоб;
staticнеоб спецификатор-типанеоб список-инициализируемых-описателейнеоб;


Препроцессор

#define идентификатор строка-лексем

#define идентификатор(идентификатор,...,идентификатор)строка-лексем
#undef идентификатор
#include "имя-файла"
#include <имя-файла>
#if константноe-выражение
#ifdef идентификатор
#ifndef идентификатор
#else
#endif
#line константа идентификатор