apx_c.tex 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. \chapter{Перечень изменений}
  2. \label{apx:sum_of_changes}
  3. С момента публикации первого издания этой книги определение языка Си претерпело
  4. изменения. Почти все нововведения -- это расширения исходной версии языка,
  5. выполненные так, чтобы сохранилась совместимость с существующими программами;
  6. некоторые изменения касаются устранения двусмысленностей первоначального
  7. описания, а некоторые представляют собой модификации, привнесённые существующей
  8. практикой. Многие из новых возможностей‚ впоследствии принятые другими
  9. разработчиками Си-компиляторов, были первоначально объявлены в документах,
  10. прилагаемых к компиляторам. Комитет ANSI, подготавливая стандарт языка, включил
  11. большинство этих изменений, а также ввёл другие значительные модификации.
  12. Некоторые коммерческие компиляторы реализовали их ещё до выпуска официального
  13. Си-стандарта.
  14. В этом приложении сведены воедино различия между языком, определённым в первой
  15. его редакции, и той его версии, которая принята в качестве стандарта. Здесь
  16. рассматривается только сам язык, вопросы, относящиеся к его окружению и
  17. библиотеке, не затрагиваются. Хотя последние и являются важной частью стандарта,
  18. но, поскольку в первом издании не делалось попытки описать окружение и
  19. библиотеку, сравнить их с соответствующими стандартными элементами оказывается
  20. невозможным.
  21. \begin{itemize}
  22. \item В стандарте более тщательно, по сравнению с первым изданием, определено и
  23. расширено препроцессирование: в его основу явно положены лексемы; введены новые
  24. операторы для <<склеивания>> лексем (\verb|##|) и создания стрингов (\verb|#|),
  25. а также новые управляющие строки типа \verb|#elif| и \verb|#pragma|; разрешено
  26. повторное определение макроса с той же последовательностью лексем; отменена
  27. подстановка параметров внутри стрингов. Разрешено <<склеивание>> строк при
  28. помощи \verb|\| в любом месте, но только не в стрингах и макроопределениях.
  29. \item Минимальное число значимых литер всех внутренних идентификаторов доведено
  30. до 31; для идентификаторов с внешней связью оно остаётся равным 6 с
  31. неразличимостью букв на нижнем и верхнем регистрах. (Многие реализации
  32. допускают б\'{o}льшее число значимых литер.)
  33. \item Для знаков \verb+#\^[]{}|~+‚ которых может не быть в некоторых наборах
  34. литер, введены трёхзнаковые последовательности, начинающиеся с \verb|??|
  35. (См.~\ref{apx:subsec:trigraph_sequences}). Следует заметить, что введение
  36. трёхзнаковых последовательностей может <<испортить>> значения стрингов, в
  37. которых содержатся \verb|??|.
  38. \item Введены новые ключевые слова (\verb|void|, \verb|const|, \verb|volatile|,
  39. \verb|signed|, \verb|enum|), а мертворождённое слово \verb|entry| из обращения
  40. изъято.
  41. \item Для литеральных констант и стринговых литералов определены новые
  42. эскейп-последовательности. Объявлено, что появление за \verb|\|
  43. <<неправильных>> литер приводит к непредсказуемому результату.
  44. (См.~\ref{apx:subsubsec:character_constants}.)
  45. \item Узаконено полюбившееся всем тривиальное изменение: 8 и 9 не являются
  46. восьмеричными цифрами.
  47. \item Введён расширенный набор суффиксов для явного указания типов констант:
  48. \verb|U| и \verb|L| -- для целых и \verb|F| и \verb|L| -- для плавающих.
  49. Уточнены также правила определения типа для констант без
  50. суффиксов~(\ref{apx:subsec:constants}).
  51. \item Объявлено, что соседние стринги конкатенируются.
  52. \item Предоставлены средства, позволяющие записывать стринговые литералы и
  53. литерные константы из расширенного набора
  54. литер~(\ref{apx:subsec:string_literals}).
  55. \item Объект типа \verb|char| (как и объект другого типа) можно
  56. специфицировать явно со знаком или без знака. Исключается использование
  57. словосочетания \verb|long float| в смысле \verb|double|, но вводится тип
  58. \verb|long double| для чисел с плавающей точкой повышенной точности.
  59. \item С некоторых пор доступен тип \verb|unsigned char|. Стандарт вводит
  60. ключевое слово \verb|signed| для явного указания знаковости \verb|char| и
  61. других целочисленных объектов.
  62. \item Уже несколько лет в большинстве реализаций доступен тип \verb|void|.
  63. Стандарт вводит \verb|void *| в качестве типа обобщённого указателя; раньше для
  64. этой цели использовали \verb|char *|. Одновременно вступают в силу правила, по
  65. которым запрещается без преобразования типа <<смешивать>> указатели и целые или
  66. указатели разных типов.
  67. \item Стандарт устанавливает минимальные пределы диапазонов арифметических
  68. типов, предусматривает головные файлы \verb|<limits.h>| и \verb|<float.h>|‚ в
  69. которых помещаются эти характеристики для каждой конкретной реализации.
  70. \item Перечисление -- новый тип, которого не было в первой редакции.
  71. \item Стандарт заимствует из Си++ способ записи квалификатора типа, в частности
  72. квалификатора \verb|const|~(\ref{apx:subsec:type_specifiers}).
  73. \item Вводится запрет на модификацию стрингов; это значит, что их разрешается
  74. размещать в памяти, доступной только на чтение.
  75. \item Изменены <<обычные арифметические преобразования>>, по существу,
  76. осуществлён переход от <<для целых всегда превалирует \verb|unsigned|; для
  77. плавающей точки всегда используется \verb|double|>> к <<повышению до
  78. минимального достаточно вместимого типа>>.
  79. (См.~\ref{apx:subsec:arifmetic_conversion}.)
  80. \item Отменены старые операторы присваивания типа \verb|=+|. Каждый оператор
  81. присваивания теперь представляется одной отдельной лексемой. В первом издании
  82. оператор присваивания мог изображаться парой литер, возможно, разделённых
  83. пробельными литерами.
  84. \item Компиляторам более не разрешается трактовать математическую
  85. ассоциативность операторов как вычислительную ассоциативность.
  86. \item Введён унарный оператор \verb|+| для симметрии с унарным \verb|-|.
  87. \item Разрешено использовать указатель на функцию в качестве её именователя без
  88. явного оператора \verb|*|. (См.~\ref{apx:subsubsec:function_call}.)
  89. \item Со структурами разрешено оперировать как с целыми объектами при
  90. присваиваниях, передачах их в качестве аргументов функциям и получении их в
  91. качестве результата от функций.
  92. \item Разрешено применять оператор получения адреса \verb|&| к массиву;
  93. результатом будет указатель на массив.
  94. \item В первой редакции результат \verb|sizeof|-операции имел тип \verb|int|;
  95. во многих реализациях он заменён на \verb|unsigned|. Стандарт официально
  96. объявляет его реализационно-зависимым, но требует, чтобы он был определён в
  97. головном файле \verb|<stddef.h>| под именем \verb|size_t|. Аналогичное
  98. изменение было сделано в отношении типа разности указателей, который теперь
  99. выступает под именем \verb|ptrdiff_t|.
  100. (См.~\ref{apx:subsubsec:sizeof_operator}~и~\ref{apx:subsec:additive_operators})
  101. \item Запрещено применять оператор получения адреса \verb|&| к
  102. \verb|register|-объекту даже тогда, когда данный компилятор не располагает его
  103. на регистре.
  104. \item Типом результата операции сдвига является тип её левого операнда; тип
  105. правого операнда на повышение типа результата влияния не оказывает.
  106. (См.~\ref{apx:subsec:shift_operators}.)
  107. \item Стандарт разрешает адресоваться при помощи указателей на место, лежащее
  108. сразу за последним элементом массива, и позволяет оперировать с такими
  109. указателями, как с обычными, см.~\ref{apx:subsec:additive_operators}.
  110. \item Стандарт вводит (заимствованный из Си++) способ записи прототипа функции
  111. с включением в него типов параметров и явного указания о варьируемости их числа
  112. и формализует метод работы с переменным списком аргументов.
  113. (См.~\ref{apx:subsubsec:function_call}‚~\ref{apx:subsubsec:declarators_of_functions}‚~\ref{apx:sec:variable_argument_lists-stdarg.h}.) С некоторыми ограничениями
  114. доступен старый способ записи.
  115. \item Стандартом запрещены пустые декларации, т.е. такие, в которых нет
  116. деклараторов и не декларируется ни одной структуры, объединения или
  117. перечисления. Однако декларация с одним тегом структуры (или объединения)
  118. передекларирует её даже в том случае, если она была объявлена во внешней
  119. области действия.
  120. \item Запрещены декларации внешних данных, не имеющие спецификаторов и
  121. квалификаторов (т.е. декларации с одним <<голым>> декларатором).
  122. \item В некоторые реализациях, когда \verb|extern|-декларация расположена во
  123. внутреннем блоке, её действие распространяется на остальную часть файла.
  124. Стандарт вносит ясность в эту ситуацию и объявляет, что область действия такой
  125. декларации ограничена блоком.
  126. \item Область действия параметров <<вставляется>> в составную инструкцию,
  127. представляющую собой тело функции, так что декларации на верхнем уровне функции
  128. не могут их <<затенить>>.
  129. \item Несколько изменены именные пространства идентификаторов. Всем тегам
  130. структур, объединений и перечислений стандарт выделяет одно именное
  131. пространство; для меток инструкций вводится отдельное именное пространство;
  132. см.~\ref{apx:subsec:lexical_scope}. Кроме того, имена членов связаны со
  133. структурой или объединением, частью которой они являются. (С некоторых пор это
  134. общепринятая практика.)
  135. \item Допускается инициализация объединения; инициализатор относится к первому
  136. члену объединения.
  137. \item Разрешается инициализация автоматических структур, объединений и
  138. массивов, хотя и с некоторыми ограничениями.
  139. \item Разрешается инициализация массива литер при помощи стрингового литерала
  140. по точному количеству указанных литер (без \verb|\0|).
  141. \item Управляющее выражение и \verb|case|-метки в \verb|switch| могут иметь
  142. любой целочисленный тип.
  143. \end{itemize}