оящее время компилятор на PDP-11 не инициализирует структуры, которые содержат поля битов, и не допускает некоторые операции присваивания в оп- ределенных контекстах, связанных с использованием значения присваивания. 25. Анахронизмы Так как язык "C" является развивающимся языком, в старых программах можно встретить некоторые устаревшие конструкции. Хотя большинство версий компилятора поддерживает такие анах- ронизмы, они в конце концов исчезнут, оставив за собой толь- ко проблемы переносимости. В ранних версиях "C" для проблем присваивания использо- валась форма =ON, а не ON=, приводя к двусмысленностям, ти- пичным примером которых является X = -1 где X фактически уменьшается, поскольку операции = и - при- мыкают друг к другу, но что вполне могло рассматриваться и как присваивание -1 к X. Синтаксис инициализаторов изменился: раньше знак равенс- тва, с которого начинается инициализатор, отсутствовал, так что вместо INT X = 1; использовалось INT X 1; изменение было внесено из-за инициализации INT F (1+2) которая достаточно сильно напоминает определение функции, чтобы смутить компиляторы. 26. Сводка синтаксических правил Эта сводка синтаксиса языка "C" предназначена скорее для облегчения понимания и не является точной формулировкой язы- ка. 26.1. Выражения Основными выражениями являются следующие: выражение: первичное-выражение * выражение & выражение - выражение ! Выражение \^ выражение ++ L-значение -- L-значение L-значение ++ L-значение -- SIZEOF выражение (имя типа) выражение выражение бинарная-операция выражение выражение ? Выражение : выражение L-значение операция-присваивания выражение выражение , выражение первичное выражение: идентификатор константа строка (выражение) первичное-выражение (список выражений необ) первичное-выражение [выражение] L-значение . Идентификатор первичное выражение -> идентификатор L-значение: идентификатор первичное-выражение [выражение] L-значение . Идентификатор первичное-выражение -> идентификатор * выражение (L-значение) Операции первичных выражений () [] . -> имеют самый высокий приоритет и группируются слева направо. Унарные операции * & - ! \^ ++ -- SIZEOF(Имя типа) имеют более низкий приоритет, чем операции первичных выраже- ний, но более высокий, чем приоритет любой бинарной опера- ции. Эти операции группируются справа налево. Все бинарные операции и условная операция (прим. Перевод.: условная опе- рация группируется справа налево; это изменение внесено в язык в 1978 г.) группируются слева направо и их приоритет убывает в следующем порядке: Бинарные операции: * / % + - >> << < > <= >= == != & \^ \! && \!\! ?: Все операции присваивания имеют одинаковый приоритет и груп- пируются справа налево. Операции присваивания: = += -= *= ?= %= >>= <<= &= \^= \!= Операция запятая имеет самый низкий приоритет и группируется слева направо. 26.2. Описания Описание: спецификаторы-описания список-инициализируемых-описателей необ; --------------------------------------------------------- спецификаторы-описания: спецификатор-типа спецификаторы-описания необ спецификатор-класса-памяти спецификаторы-описания необ спецификатор-класса-памяти: AUTO STATIC EXTERN REGISTER TYPEDEF спецификатор-типа: CHAR SHORT INT LONG UNSIGNED FLOAT DOUBLE спецификатор-структуры-или-объединения определяющее-тип-имя список-инициализируемых-описателей: инициализируемый-описатель инициализируемый-описатель, список-инициализируемых-описателей инициализируемый-описатель описатель-инициализатор необ описатель: идентификатор (описатель) * описатель описатель () описатель [константное выражение необ] спецификатор-структуры-или-объединения: STRUCT список-описателей-структуры STRUCT идентификатор \(список-описаний-структуры\) STRUCT идентификатор UNION \(список-описаний-структуры\) UNION идентификатор \(список-описаний-структуры\) UNION идентификатор список-описаний-структцры: описание-структуры описание-структуры список-описаний-структуры описание структуры: спецификатор-типа список-описателей-структуры: список-описателей-структуры описатель-структуры описатель-структуры,список-описателей-структуры описатель-структуры: описатель описатель: константное выражение :константное-выражение инициализатор: = выражение = \(список-инициализатора\) = \(список-инициализатора\) список инициализатора: выражение список-инициализатора,список-инициализатора \(список-инициализатора\) имя-типа: спецификатор-типа абстрактный-описатель абстрактный-описатель: пусто \(абстрактный-описатель\) * абстрактный-описатель абстрактный-описатель () абстрактный-описатель [константное-выражение необ] определяющее-тип-имя: идентификатор 26.3. Операторы составной-оператор: \(список-описаний список-операторов необ необ\) список-описаний: описание описание список-описаний список-операторов: оператор оператор список-операторов оператор: составной оператор выражение; IF (выражение) оператор IF (выражение) оператор ELSE оператор WHILE (выражение) оператор DO оператор WHILE (выражение); FOR(выражение-1 ;выражение-2 ;выражение-3 ) необ необ необ оператор SWITCH (выражение) оператор CASE константное-выражение : оператор DEFAULT: оператор BREAK; CONTINUE; RETURN; RETURN выражение; GOTO идентификатор; идентификатор : оператор ; 26.4. Внешние определения Программа: внешнее-определение внешнее-определение программа внешнее-определение: определение-функции определение-данных определение-функции: спецификатор-типа описатель-функции тело-функции необ описатель-функции: описатель (список-параметров ) необ список-параметров: идетификатор идентификатор , список-параметров тело-функции: список-описаний-типа оператор-функции оператор-функции: \(список описаний список-операторов\) необ определение данных: EXTERN спецификатор типа список необ необ инициализируемых описателей ; необ STATIC спецификатор типа список необ необ инициализируемых описателей необ; 26.5. Препроцессор #DEFINE идентификатор строка-лексем #DEFINE #DEFINE идентификатор(идентификатор,...,идентификатор)стр #UNDEF идентификатор #INCLUDE "имя-файла" #INCLUDE <имя-файла> #IF константное-выражение #IFDEF идентификатор #IFNDEF идентификатор #ELSE #ENDIF #LINE константа идентификатор Последние изменения языка "C" (15 ноября 1978 г.) 27. Присваивание структуры Структуры могут быть присвоены, переданы функциям в ка- честве аргументов и возвращены функциям. Типы участвующих операндов должны оставаться теми же самыми. Другие правдопо- добные операторы, такие как сравнение на равенство, не были реализованы. В реализации возвращения структур функциями на PDP-11 имеется коварный дефект: если во время возврата происходит прерывание и та же самая функция пеентерабельно вызывается во время этого прерывания, то значение возвращаемое из пер- вого вызова, может быть испорчено. Эта трудность может воз- никнуть только при наличии истинного прерывания, как из опе- рационной системы, так и из программы пользователя, прерыва- ния, которое существенно для использования сигналов; обычные рекурсивные вызовы совершенно безопасны. 28. Тип перечисления Введен новый тип данных,аналогичный скалярным типам язы- ка паскаль. К спецификатору-типа в его синтаксическом описа- нии в разделе 8.2. Приложения а следует добавить спецификатор-перечисления ------------------------- с синтаксисом пецификатор-перечисления: ------------------------- ENUM список-перечисления ------------------- ENUM идентификатор список-перечисления ------------- ------------------- ENUM идентификатор ------------- cписок-перечисления: ------------------- перечисляемое ------------- список-перечисления, перечисляемое ------------------- ------------- перечисляемое: -------------- идентификатор ------------- идентификатор = константное выражение ------------- --------------------- Роль идентификатора в спецификаторе-перечисления пол- ностью аналогична роли ярлыка структуры в спецификато- ре-структуры; идентификатор обозначает определенное перечис- ление. Например, описание ENUM COLOR \(RED, WHITE, BLACK, BLUE \); . . . ENUM COLOR *CP, COL; Объявляет идентификатор COLOR ярлыком перечисления типа, описывающего различные цвета и затем объявляет CP указателем на объект этого типа, а COL - объектом этого типа. Идентификаторы в списке-перечисления описываются как константы и могут появиться там, где требуются (по контекс- ту) константы. Если не используется вторая форма перечисляе- мого (с равеством =), то величины констант начинаются с 0 и возрастают на 1 в соответствии с прочтением их описания сле- ва на право. Перечисляемое с присвоением = придает соответс- твующему идентификатору указанную величину; последующие идентификаторы продолжают прогрессию от приписанной величи- ны. Все ярлыки перечисления и константы могут быть различны- ми и непохожими на ярлыки и члены структур даже при условии использования одного и того же множества идентификаторов. Объекты данного типа перечисления рассматриваются как объекты, имеющие тип, отличный от любых типов и контролирую- щая программа LINT сообщает об ошибках несоответствия типов. В реализации на PDP-11 со всеми перечисляемыми переменными оперируют так, как если бы они имели тип INT. 29. Таблица изображений непечатных символов языка "C". В данной таблице приведены изображения некоторых симво- лов (фигурные скобки и т.д.) языка "C", которых может не оказаться в знаковом наборе дисплея или печатающего устройс- тва. ------------------------------------------------- ! Значение ! Изображение ** ! ! ! В тексте ! ------------------------------------------------- ! Фигурная открывающаяся ! ! ! Скобка ! \( ! ! ! ! ------------------------------------------------- ! Фигурная закрывающаяся ! ! ! Скобка ! \) ! ! ! ! ------------------------------------------------- ! Вертикальная ! ! ! Черта ! \! ! ! ! ! ------------------------------------------------- ! ! ! ! Апостороф ! \' ! ! ! ! ------------------------------------------------- ! Волнистая ! ! ! Черта ! \^ ! ! ! ! ------------------------------------------------- ** П_р_и_м_е_ч_а_н_и_е: Изображения приведены для операционой системы UNIX. При работе компилятора "C" под управлением любой другой операци- онной системы, необходимо воспользоваться соответствующим руководством для данной системы.