Kernighan, B. W. and Ritchie, D. M. "The 'C' Programming Language"; Chapter 27
Сводка синтаксических правил.
Эта сводка синтаксиса языка "C" предназначена скорее для облегченияпонимания и не является точной формулировкой языка.
Выражения.
Основными выражениями являются следующие:
- Выражение:
- первичное-выражение
- * выражение
- & выражение
- - выражение
- ! выражение
- ~ выражение
- ++ l-значение
- -- l-значение
- l-значение ++
- l-значение --
- sizeof выражение
- (имя типа) выражение
- выражение бинарная-операция выражение
- выражение ? выражение : выражение
- l-значение операция-присваивания выражение
- выражение, выражение
- * выражение
- Первичное выражение:
- идентификатор
- константа
- строка
- (выражение)
- первичное-выражение (список выраженийнеоб)
- первичное-выражение [выражение]
- l-значение . идентификатор
- первичное-выражение -> идентификатор
- константа
- l-значение:
- идентификатор
- первичное-выражение [выражение]
- l-значение . идентификатор
- первичноe-выражение -> идентификатор
- * выражение
- (l-значение)
- первичное-выражение [выражение]
Операции первичных выражений
() [] . ->имеют самый высокий приоритет и группируются слева направо. Унарныеоперации
* & - ! ~ ++ -- sizeof(имя типа)имеют более низкий приоритет, чем операции первичных выражений, ноболее высокий, чем приоритет любой бинарной операции. Эти операциигруппируются справа налево. Все бинарные операции и условная операция(прим. Перевод.: условная операция группируется справа налево; этоизменение внесено в язык в 1978 г.) группируются слева направо и ихприоритет убывает в следующем порядке:
- бинарная операция:
- * / %
- + -
- >> <<
- < > <= >=
- == !=
- &
- ~
- |
- &&
- ||
- ?:
- + -
Все операции присваивания имеют одинаковый приоритет и группируютсясправа налево.
- Операции присваивания:
- = += -= *= ?= %= >>= <<= &= ~= |=
Операция запятая имеет самый низкий приоритет и группируется слеванаправо.
Описания.
- Описание:
- спецификаторы-описания список-инициализируемых-описателейнеоб;
- Спецификаторы-описания:
- спецификатор-типа спецификаторы-описаниянеоб
- спецификатор-класса-памяти спецификаторы-описаниянеоб
- Спецификатор-класса-памяти:
- auto
- static
- extern
- register
- typedef
- static
- Спецификатор-типа:
- char
- short
- int
- long
- unsigned
- float
- double
- спецификатор-структуры-или-об'единения
- определяющее-тип-имя
- short
- Список-инициализируемых-описателей:
- инициализируемый-описатель
- инициализируемый-описатель,
- список-инициализируемых-описателей
- инициализируемый-описатель,
- инициализируемый-описатель
- описатель-инициализаторнеоб
- Описатель:
- идентификатор
- (описатель)
- * описатель
- описатель ()
- описатель [константное выражениенеоб]
- (описатель)
- Спецификатор-структуры-или-об'единения:
- struct список-описателей-структуры
- struct идентификатор {список-описаний-структуры}
- struct идентификатор
- union {список-описаний-структуры}
- union идентификатор {список-описаний-структуры}
- union идентификатор
- struct идентификатор {список-описаний-структуры}
- Список-описаний-структуры:
- описани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 константа идентификатор
- #define идентификатор(идентификатор,...,идентификатор)строка-лексем