Язык программирования Си. Издание 3-е, исправленное - Брайан Керниган
Шрифт:
Интервал:
Закладка:
• Компиляторам более не разрешается трактовать математическую ассоциативность операторов как вычислительную ассоциативность.
• Введен унарный оператор + для симметрии с унарным -.
• Разрешено использовать указатель на функцию в качестве ее именующего выражения без явного оператора * (см. A7.3.2).
• Структурами разрешено оперировать при присваиваниях, можно передавать структуры в качестве аргументов функциям и получать их в качестве результата от функций.
• Разрешено применять оператор получения адреса & к массиву; результатом является указатель на массив.
• В первой редакции результат операции sizeof имел тип int; во многих реализациях он заменен на unsigned. Стандарт официально объявляет его зависимым от реализации, но требует, чтобы он был определен в заголовочном файле <stddef.h> под именем size_t. Аналогичное изменение было сделано в отношении типа разности указателей) который теперь выступает под именем ptrdiff_t (см. A7.4.8 и A7.7).
• Запрещено применять оператор получения адреса & к объекту типа register даже тогда, когда данный компилятор не располагает его на регистре.
• Типом результата операции сдвига является тип ее левого операнда; тип правого операнда на повышение типа результата влияния не оказывает (см. A7.8).
• Стандарт разрешает адресоваться с помощью указателей на место, лежащее сразу за последним элементом массива, и позволяет оперировать с такими указателями, как с обычными, см. A7.7.
• Стандарт вводит (заимствованный из C++) способ записи прототипа функции с включением в него типов параметров и явного указания о возможности их изменения и формализует метод работы с переменным списком аргументов. (см. A7.3.2, A8.6.3, B7.) С некоторыми ограничениями доступен и старый способ записи.
• Стандартом запрещены пустые объявления, т. е. такие, в которых нет объявителей и не объявляется ни одной структуры, объединения или перечисления. Однако объявление с одним тегом структуры (или объединения) переобъявит ее даже в том случае, если она была объявлена во внешней области действия.
• Запрещены объявления внешних данных, не имеющие спецификаторов и квалификаторов (т. е. объявления с одним "голым" объявителем).
• В некоторых реализациях, когда extern-объявление расположено во внутреннем блоке, его область видимости распространяется на остальную часть файла. Стандарт вносит ясность в эту ситуацию и объявляет, что область видимости такого объявления ограничена блоком.
• Область видимости параметров "вставляется" в составную инструкцию, представляющую собой тело функции, так что объявления на верхнем уровне функции не могут их "затенить".
• Несколько изменены именные пространства идентификаторов. Всем тегам структур, объединений и перечислений стандарт выделяет одно именное пространство; для меток инструкций вводится отдельное именное пространство (см. A11.1). Кроме того, имена элементов связаны со структурой или объединением, частью которого они являются. (С некоторых пор это общепринятая практика.)
• Допускается инициализация объединения; инициализатор относится к первому элементу объединения.
• Разрешается инициализация автоматических структур, объединений и массивов, хотя и с некоторыми ограничениями.
• Разрешается инициализация массива символов с помощью строкового литерала по точному количеству указанных символов (без ' ').
• Управляющее выражение и case-метки в switch могут иметь любой целочисленный тип.
Предметный указатель
0... константа восьмеричная 2.3, A2.5.1
0x... константа шестнадцатеричная 2.3, A2.5.1
... многоточие 7.3, A7.3.2
>= оператор больше или равно 2.6, A7.9
> оператор больше чем 2.6, A7.9
- оператор вычитания 2.5, A7.7
-- оператор декремента 1.5.2, 2.8, 5.5, A7.3.4, A7.4.1
/ оператор деления 1.2, 2.5, A7.6
% оператор деления по модулю 2.5, A7.6
. оператор доступа к элементу структуры 6.1, A7.3, A7.3.3
-> оператор доступа к элементу структуры через указатель 6.2, A7.3, A7.3.3
, оператор запятая 3.5, A7.18
++ оператор инкремента 1.5.2, 2.8, 5.5, A7.4, A7.4.1
* оператор косвенного доступа 5.1, A7.4.3
&& оператор логического И 1.5.4, 2.6, 2.9, A7.14
|| оператор логического ИЛИ 1.5.4, 2.6, 2.9, A7.15
! оператор логического отрицания 2.6, A7.4, A7.4.7
<= оператор меньше или равно 2.6, A7.9
< оператор меньше чем 2.6, A7.9
!= оператор неравенства 1.5.1, 2.6, A7.10
& оператор побитового И 2.9, A7.11
| оператор побитового ИЛИ 2.9, A7.13
^ оператор побитового исключающего ИЛИ 2.9, A7.12
~ оператор побитового отрицания 2.9, A7.4.6
& оператор получения адреса 5.1, A7.4.2
# оператор препроцессора 4.11.2, A12.3
## оператор препроцессора 4.11.2, A12.3
= оператор присваивания 1.5.1, 2.6, A7.17
+= оператор присваивания 2.10
== оператор равенства 1.5.3, 2.6, A7.10
<< оператор сдвига влево 2.9, A7.8
>> оператор сдвига вправо 2.9, A7.8
+ оператор сложения 2.5, A7.7
* оператор умножения 2.5, A7.6
- оператор унарный минус A7.4.5
+ оператор унарный плюс A7.4.4
" символ двойная кавычка 1.1, 1.5.3, 2.3, A2.5.2, A2.6
' символ кавычка 1.5.3, 2.3, A2.5.2