| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- \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}
|