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

Спецификатор-типа:
  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 константа идентификатор

у