\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|| и \verb||‚ в которых помещаются эти характеристики для каждой конкретной реализации. \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|| под именем \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}