• Введен расширенный набор суффиксов для явного указания типов констант: U
и L - для целых и F и L - для типов с плавающей точкой. Уточнены также правила определения типа для констант без суффиксов (A2.5).• Объявлено, что соседние строки конкатенируются.
• Предоставлены средства, позволяющие записывать строковые литералы и символьные константы из расширенного набора символов (A2.6).
• Объекты типа char
(как и объекты другого типа) можно специфицировать явно со знаком или без знака. Исключается использование словосочетания long float в смысле double, но вводится тип long double для чисел с плавающей точкой повышенной точности.• С некоторых пор доступен тип unsigned char
. Стандарт вводит ключевое слово signed для явного указания, что объект типа char или другого целочисленного типа имеет знак.• Уже несколько лет в большинстве реализаций доступен тип void
. Стандарт вводит void * в качестве типа обобщенного указателя; раньше для этой цели использовали char *. Одновременно вступают в силу правила, по которым запрещается без преобразования типа "смешивать" указатели и целые или указатели разных типов.• Стандарт устанавливает минимальные пределы диапазонов арифметических типов, предусматривает заголовочные файлы
• Перечисление
- новый тип, которого не было в первой редакции.• Стандарт заимствует из C++ способ записи квалификатора типа, в частности квалификатора const
(A8.2).• Вводится запрет на модификацию строк: это значит, что их разрешается размещать в памяти, доступной только на чтение (ПЗУ).
• Изменены "обычные арифметические преобразования"; по существу, выполнен переход от принципа "для целых всегда превалирует unsigned
; для плавающей точки всегда используется double" к принципу "повышение до минимального достаточно вместительного типа" (см. A6.5).• Отменены старые операторы присваивания вроде =+
. Каждый оператор присваивания теперь представляется одной отдельной лексемой. В первом издании оператор присваивания мог изображаться парой символов, возможно, разделенных символами-разделителями.• Компиляторам более не разрешается трактовать математическую ассоциативность операторов как вычислительную ассоциативность.
• Введен унарный оператор +
для симметрии с унарным -.• Разрешено использовать указатель на функцию в качестве ее именующего выражения без явного оператора *
(см. A7.3.2).• Структурами разрешено оперировать при присваиваниях, можно передавать структуры в качестве аргументов функциям и получать их в качестве результата от функций.
• Разрешено применять оператор получения адреса &
к массиву; результатом является указатель на массив.• В первой редакции результат операции sizeof
имел тип int; во многих реализациях он заменен на unsigned. Стандарт официально объявляет его зависимым от реализации, но требует, чтобы он был определен в заголовочном файле• Запрещено применять оператор получения адреса &
к объекту типа register даже тогда, когда данный компилятор не располагает его на регистре.• Типом результата операции сдвига является тип ее левого операнда; тип правого операнда на повышение типа результата влияния не оказывает (см. A7.8).
• Стандарт разрешает адресоваться с помощью указателей на место, лежащее сразу за последним элементом массива, и позволяет оперировать с такими указателями, как с обычными, см. A7.7.
• Стандарт вводит (заимствованный из C++) способ записи прототипа функции с включением в него типов параметров и явного указания о возможности их изменения и формализует метод работы с переменным списком аргументов. (см. A7.3.2, A8.6.3, B7.) С некоторыми ограничениями доступен и старый способ записи.
• Стандартом запрещены пустые объявления, т. е. такие, в которых нет объявителей и не объявляется ни одной структуры, объединения или перечисления. Однако объявление с одним тегом структуры (или объединения) переобъявит ее даже в том случае, если она была объявлена во внешней области действия.
• Запрещены объявления внешних данных, не имеющие спецификаторов и квалификаторов (т. е. объявления с одним "голым" объявителем).
• В некоторых реализациях, когда extern
-объявление расположено во внутреннем блоке, его область видимости распространяется на остальную часть файла. Стандарт вносит ясность в эту ситуацию и объявляет, что область видимости такого объявления ограничена блоком.• Область видимости параметров "вставляется" в составную инструкцию, представляющую собой тело функции, так что объявления на верхнем уровне функции не могут их "затенить".