
\chapter{Перечень изменений}
\label{apx:sum_of_changes}

С момента публикации первого издания этой книги определение языка Си претерпело
изменения. Почти все нововведения -- это расширения исходной версии языка,
выполненные так, чтобы сохранилась совместимость с существующими программами;
некоторые изменения касаются устранения двусмысленностей первоначального
описания, а некоторые представляют собой модификации, привнесённые существующей
практикой. Многие из новых возможностей‚ впоследствии принятые другими
разработчиками Си-компиляторов, были первоначально объявлены в документах,
прилагаемых к компиляторам. Комитет ANSI, подготавливая стандарт языка, включил
большинство этих изменений, а также ввёл другие значительные модификации.
Некоторые коммерческие компиляторы реализовали их ещё до выпуска официального
Си-стандарта.

В этом приложении сведены воедино различия между языком, определённым в первой
его редакции, и той его версии, которая принята в качестве стандарта. Здесь
рассматривается только сам язык, вопросы, относящиеся к его окружению и
библиотеке, не затрагиваются. Хотя последние и являются важной частью стандарта,
но, поскольку в первом издании не делалось попытки описать окружение и
библиотеку, сравнить их с соответствующими стандартными элементами оказывается
невозможным.

\begin{itemize}
 \item В стандарте более тщательно, по сравнению с первым изданием, определено и
 расширено препроцессирование: в его основу явно положены лексемы; введены новые
 операторы для <<склеивания>> лексем (\verb|##|) и создания стрингов (\verb|#|),
 а также новые управляющие строки типа \verb|#elif| и \verb|#pragma|; разрешено
 повторное определение макроса с той же последовательностью лексем; отменена
 подстановка параметров внутри стрингов. Разрешено <<склеивание>> строк при
 помощи \verb|\| в любом месте, но только не в стрингах и макроопределениях.
 \item Минимальное число значимых литер всех внутренних идентификаторов доведено
 до 31; для идентификаторов с внешней связью оно остаётся равным 6 с
 неразличимостью букв на нижнем и верхнем регистрах. (Многие реализации
 допускают б\'{o}льшее число значимых литер.)
 \item Для знаков \verb+#\^[]{}|~+‚ которых может не быть в некоторых наборах
 литер, введены трёхзнаковые последовательности, начинающиеся с \verb|??|
 (См.~\ref{apx:subsec:trigraph_sequences}). Следует заметить, что введение
 трёхзнаковых последовательностей может <<испортить>> значения стрингов, в
 которых содержатся \verb|??|.
 \item Введены новые ключевые слова (\verb|void|, \verb|const|, \verb|volatile|,
 \verb|signed|, \verb|enum|), а мертворождённое слово \verb|entry| из обращения
 изъято.
 \item Для литеральных констант и стринговых литералов определены новые
 эскейп-последовательности. Объявлено, что появление за \verb|\|
 <<неправильных>> литер приводит к непредсказуемому результату.
 (См.~\ref{apx:subsubsec:character_constants}.)
 \item Узаконено полюбившееся всем тривиальное изменение: 8 и 9 не являются
 восьмеричными цифрами.
 \item Введён расширенный набор суффиксов для явного указания типов констант:
 \verb|U| и \verb|L| -- для целых и \verb|F| и \verb|L| -- для плавающих.
 Уточнены также правила определения типа для констант без
 суффиксов~(\ref{apx:subsec:constants}).
 \item Объявлено, что соседние стринги конкатенируются.
 \item Предоставлены средства, позволяющие записывать стринговые литералы и
 литерные константы из расширенного набора
 литер~(\ref{apx:subsec:string_literals}).
 \item Объект типа \verb|char| (как и объект другого типа) можно
 специфицировать явно со знаком или без знака. Исключается использование
 словосочетания \verb|long float| в смысле \verb|double|, но вводится тип
 \verb|long double| для чисел с плавающей точкой повышенной точности.
 \item С некоторых пор доступен тип \verb|unsigned char|. Стандарт вводит
 ключевое слово \verb|signed| для явного указания знаковости \verb|char| и
 других целочисленных объектов.
 \item Уже несколько лет в большинстве реализаций доступен тип \verb|void|.
 Стандарт вводит \verb|void *| в качестве типа обобщённого указателя; раньше для
 этой цели использовали \verb|char *|. Одновременно вступают в силу правила, по
 которым запрещается без преобразования типа <<смешивать>> указатели и целые или
 указатели разных типов.
 \item Стандарт устанавливает минимальные пределы диапазонов арифметических
 типов, предусматривает головные файлы \verb|<limits.h>| и \verb|<float.h>|‚ в
 которых помещаются эти характеристики для каждой конкретной реализации.
 \item Перечисление -- новый тип, которого не было в первой редакции.
 \item Стандарт заимствует из Си++ способ записи квалификатора типа, в частности
 квалификатора \verb|const|~(\ref{apx:subsec:type_specifiers}).
 \item Вводится запрет на модификацию стрингов; это значит, что их разрешается
 размещать в памяти, доступной только на чтение.
 \item Изменены <<обычные арифметические преобразования>>, по существу,
 осуществлён переход от <<для целых всегда превалирует \verb|unsigned|; для
 плавающей точки всегда используется \verb|double|>> к <<повышению до
 минимального достаточно вместимого типа>>.
 (См.~\ref{apx:subsec:arifmetic_conversion}.)
 \item Отменены старые операторы присваивания типа \verb|=+|. Каждый оператор
 присваивания теперь представляется одной отдельной лексемой. В первом издании
 оператор присваивания мог изображаться парой литер, возможно, разделённых
 пробельными литерами.
 \item Компиляторам более не разрешается трактовать математическую
 ассоциативность операторов как вычислительную ассоциативность.
 \item Введён унарный оператор \verb|+| для симметрии с унарным \verb|-|.
 \item Разрешено использовать указатель на функцию в качестве её именователя без
 явного оператора \verb|*|. (См.~\ref{apx:subsubsec:function_call}.)
 \item Со структурами разрешено оперировать как с целыми объектами при
 присваиваниях, передачах их в качестве аргументов функциям и получении их в
 качестве результата от функций.
 \item Разрешено применять оператор получения адреса \verb|&| к массиву;
 результатом будет указатель на массив.
 \item В первой редакции результат \verb|sizeof|-операции имел тип \verb|int|;
 во многих реализациях он заменён на \verb|unsigned|. Стандарт официально
 объявляет его реализационно-зависимым, но требует, чтобы он был определён в
 головном файле \verb|<stddef.h>| под именем \verb|size_t|. Аналогичное
 изменение было сделано в отношении типа разности указателей, который теперь
 выступает под именем \verb|ptrdiff_t|.
 (См.~\ref{apx:subsubsec:sizeof_operator}~и~\ref{apx:subsec:additive_operators})
 \item Запрещено применять оператор получения адреса \verb|&| к
 \verb|register|-объекту даже тогда, когда данный компилятор не располагает его
 на регистре.
 \item Типом результата операции сдвига является тип её левого операнда; тип
 правого операнда на повышение типа результата влияния не оказывает.
 (См.~\ref{apx:subsec:shift_operators}.)
 \item Стандарт разрешает адресоваться при помощи указателей на место, лежащее
 сразу за последним элементом массива, и позволяет оперировать с такими
 указателями, как с обычными, см.~\ref{apx:subsec:additive_operators}.
 \item Стандарт вводит (заимствованный из Си++) способ записи прототипа функции
 с включением в него типов параметров и явного указания о варьируемости их числа
 и формализует метод работы с переменным списком аргументов.
 (См.~\ref{apx:subsubsec:function_call}‚~\ref{apx:subsubsec:declarators_of_functions}‚~\ref{apx:sec:variable_argument_lists-stdarg.h}.) С некоторыми ограничениями
 доступен старый способ записи.
 \item Стандартом запрещены пустые декларации, т.е. такие, в которых нет
 деклараторов и не декларируется ни одной структуры, объединения или
 перечисления. Однако декларация с одним тегом структуры (или объединения)
 передекларирует её даже в том случае, если она была объявлена во внешней
 области действия.
 \item Запрещены декларации внешних данных, не имеющие спецификаторов и
 квалификаторов (т.е. декларации с одним <<голым>> декларатором).
 \item В некоторые реализациях, когда \verb|extern|-декларация расположена во
 внутреннем блоке, её действие распространяется на остальную часть файла.
 Стандарт вносит ясность в эту ситуацию и объявляет, что область действия такой
 декларации ограничена блоком.
 \item Область действия параметров <<вставляется>> в составную инструкцию,
 представляющую собой тело функции, так что декларации на верхнем уровне функции
 не могут их <<затенить>>.
 \item Несколько изменены именные пространства идентификаторов. Всем тегам
 структур, объединений и перечислений стандарт выделяет одно именное
 пространство; для меток инструкций вводится отдельное именное пространство;
 см.~\ref{apx:subsec:lexical_scope}. Кроме того, имена членов связаны со
 структурой или объединением, частью которой они являются. (С некоторых пор это
 общепринятая практика.)
 \item Допускается инициализация объединения; инициализатор относится к первому
 члену объединения.
 \item Разрешается инициализация автоматических структур, объединений и
 массивов, хотя и с некоторыми ограничениями.
 \item Разрешается инициализация массива литер при помощи стрингового литерала
 по точному количеству указанных литер (без \verb|\0|).
 \item Управляющее выражение и \verb|case|-метки в \verb|switch| могут иметь
 любой целочисленный тип.
\end{itemize}