Керниган и Ритчи - Язык программирования Си (793773), страница 63
Текст из файла (страница 63)
Перечень измененийС момента публикации первого издания этой книги определение языка Си претерпело изменения. Почти всенововведения — это расширения исходной версии языка, выполненные так, чтобы сохраниласьсовместимость с существующими программами; некоторые изменения касаются устранениядвусмысленностей первоначального описания, а некоторые представляют собой модификации,привнесенные существующей практикой. Многие из новых возможностей, впоследствии принятые другимиразработчиками Си-компиляторов, были первоначально объявлены в документах, прилагаемых ккомпиляторам. Комитет ANSI, подготавливая стандарт языка, включил большинство этих изменений, а такжеввел другие значительные модификации.
Некоторые коммерческие компиляторы реализовали их еще довыпуска официального Си-стандарта.В этом приложении сведены воедино различия между языком, определенным в первой его редакции, и тойего версии, которая принята в качестве стандарта. Здесь рассматривается только сам язык; вопросы,относящиеся к его окружению и библиотеке, не затрагиваются. Хотя последние и являются важной частьюстандарта, но, поскольку в первом издании не делалось попытки описать среду и библиотеку, ссоответствующими стандартными элементами сравнивать практически нечего.В стандарте более тщательно, по сравнению с первым изданием, определено и расширенопрепроцессирование: в его основу явно положены лексемы; введены новые операторы для"склеивания" лексем (##) и создания символьных строк (#), а также новые управляющие строки, такиекак #elif и #pragma; разрешено повторное определение макроса с той же последовательностьюлексем; отменена подстановка параметров внутри строк.
Разрешено "склеивание" строк с помощьюзнака \ в любом месте, не только в строках и макроопределениях (см. А12).Минимальное число значимых символов всех внутренних идентификаторов доведено до 31; дляидентификаторов с внешней связью оно остается равным 6; буквы нижнего и верхнего регистров неразличаются. (Многие реализации допускают большее число значимых символов.)Для знаков #, \, X, [, ], { , } , ! , 0, которых может не быть в некоторых наборах символов, введенытрехзнаковые последовательности, начинающиеся с ?? (см.
А12.1). Следует заметить, что введениетрехзнаковых последовательностей может повредить значения строк, в которых содержатся ??.Введены новые ключевые слова (void, const, volatile, signed, enum), а мертворожденноеслово entry из обращения изъято.Для символьных констант и строковых литералов определены новые эскейп-последовательности.Объявлено, что появление за \ символов не из принятых эскейп-последовательностей приводит кнепредсказуемому результату (см. А2.5.2.)Узаконено полюбившееся всем тривиальное изменение: 8 и 9 не являются восьмеричными цифрами.Введен расширенный набор суффиксов для явного указания типов констант: U и L — для целых и F и L— для типов с плавающей точкой.
Уточнены также правила определения типа для констант безсуффиксов (А2.5).Объявлено, что соседние строки конкатенируются.Предоставлены средства, позволяющие записывать строковые литералы и символьные константы израсширенного набора символов (А2.6).Объекты типа char (как и объекты другого типа) можно специфицировать явно со знаком или беззнака. Исключается использование словосочетания long float в смысле double, но вводится типlong double для чисел с плавающей точкой повышенной точности.С некоторых пор доступен тип unsigned char. Стандарт вводит ключевое слово signed дляявного указания, что объект типа char или другого целочисленного типа имеет знак.Уже несколько лет в большинстве реализаций доступен тип void.
Стандарт вводит void * в качестветипа обобщенного указателя; раньше для этой цели использовали char *. Одновременно вступают всилу правила, по которым запрещается без преобразования типа "смешивать" указатели и целые илиуказатели разных типов.Стандарт устанавливает минимальные пределы диапазонов арифметических типов, предусматриваетзаголовочные файлы <limits.h> и <float.h>, в которых помещаются эти характеристики длякаждой конкретной реализации.Перечисление — новый тип, которого не было в первой редакции.Стандарт заимствует из Си++ способ записи квалификатора типа, в частности квалификатора const(A8.2).Вводится запрет на модификацию строк; это значит, что их разрешается размещать в памяти,доступной только на чтение (ПЗУ).Изменены "обычные арифметические преобразования"; по существу, выполнен переход от принципа"для целых всегда превалирует unsigned; для плавающей точки всегда используется double" кпринципу "повышение до минимального достаточно вместительного типа" (см.
А6.5).Отменены старые операторы присваивания вроде =+. Каждый оператор присваивания теперьпредставляется одной отдельной лексемой. В первом издании оператор присваивания могизображаться парой символов, возможно, разделенных символами-разделителями.Компиляторам более не разрешается трактовать математическую ассоциативность операторов каквычислительную ассоциативность.Введен унарный оператор + для симметрии с унарным -.Разрешено использовать указатель на функцию в качестве ее именующего выражения без явногооператора * (см.
А7.3.2).Структурами разрешено оперировать, при присваиваниях, можно передавать структуры в качествеаргументов функциям и получать их в качестве результата от функций.Разрешено применять оператор получения адреса & к массиву; результатом является указатель намассив.В первой редакции результат операции sizeof имел тип int; во многих реализациях он заменен наunsigned. Стандарт официально объявляет его зависимым от реализации, но требует, чтобы он былопределен в заголовочном файле <stddef.h> под именем size_t.
Аналогичное изменение былосделано в отношении типа разности указателей, который теперь выступает под именем ptrdiff_t(см. А7.4.8 и А7.7).Запрещено применять оператор получения адреса & к объекту типа register даже тогда, когдаданный компилятор не располагает его на регистре.Типом результата операции сдвига является тип ее левого операнда; тип правого операнда наповышение типа результата влияния не оказывает (см. А7.8).Стандарт разрешает адресоваться с помощью указателей на место, лежащее сразу за последнимэлементом массива, и позволяет оперировать с такими указателями, как с обычными, см.
А7.7.Стандарт вводит (заимствованный из Си++) способ записи прототипа функции с включением в неготипов параметров и явного указания о возможности их изменения и формализует метод работы спеременным списком аргументов. (См. А7.3.2, А8.6.3, В7.) С некоторыми ограничениями доступен истарый способ записи.Стандартом запрещены пустые объявления, т. е. такие, в которых нет объявителей и не объявляетсяни одной структуры, объединения или перечисления.
Однако объявление с одним тегом структуры(или объединения) переобъявит ее даже в том случае, если она была объявлена во внешней областидействия.Запрещены объявления внешних данных, не имеющие спецификаторов и квалификаторов (т. е.объявления с одним "голым" объявителем).В некоторых реализациях, когда extern-объявление расположено во внутреннем блоке, его областьвидимости распространяется на остальную часть файла. Стандарт вносит ясность в эту ситуацию иобъявляет, что область видимости такого объявления ограничена блоком.Область видимости параметров "вставляется" в составную инструкцию, представляющую собой телофункции, так что объявления на верхнем уровне функции не могут их "затенить".Несколько изменены именные пространства идентификаторов.
Всем тегам структур, объединений иперечислений стандарт выделяет одно именное пространство; для меток инструкций вводитсяотдельное именное пространство (см. АИЛ). Кроме того, имена элементов связаны со структурой илиобъединением, частью которого они являются. (С некоторых пор это общепринятая практика.)Допускается инициализация объединения; инициализатор относится к первому элементуобъединения.Разрешается инициализация автоматических структур, объединений и массивов, хотя и с некоторымиограничениями.Разрешается инициализация массива символов с помощью строкового литерала по точномуколичеству указанных символов (без '\0').Управляющее выражение и case-метки в switch могут иметь любой целочисленный тип..














