В 11. Зависящие от реализации пределы
и
331
%х местное представление даты
%Х местное представление времени
%у год без указания века (00-99)
%Y год с указанием века
%Z название временной зоны, если она есть
В
Зависящие от реализации пределы:
и
Заголовочный файл определяет константы для размеров целочисленных типов. Ниже перечислены минимальные приемлемые ве- личины, но в конкретных реализациях могут использоваться и большие значения.
CHAR_BIT 8 битов в значении
SCHAR_MAX UCHAR_MAX или
SCHAR_MAX максимальное значение r
CHAR_MIN 0
минимальное значение r
+32767 максимальное int
INT_MIN -32767 минимальное значение int
+2147463647 максимальное значение long
LONG_MIN -2147483647 минимальное значение long
SCHAR_MAX +127 максимальное значение signed r
-127 минимальное значение signed
+32767 максимальное значение short
SHRT_MIN -32767 минимальное значение short
UCHAR_MAX 255 максимальное значение char
UINT_MAX 65535 максимальное значение unsigned int
ULONG_MAX 4294967295 максимальное значение unsigned long
USHRT_MAX 65535 максимальное значение unsigned short
Имена, приведенные в следующей таблице, взяты из h> и явля- ются константами, имеющими отношение к арифметике с плавающей точкой. Значения (если они есть) представляют собой минимальные зна- чения для соответствующих величин. В каждой реализации устанавли- ваются свои значения.
2 основание для представления порядка,
например: 2, 16
FLT_ROUNDS способ округления при сложении чисел с плавающей точкой
332Приложение В. Стандартная библиотека 6
FLT_EPSILON 1E-5
FLT_MANT_DIG
1Е+37 1E-37
FLT
EXP
DBL DIG
DBL MAX
DBL MAX EXP
DBL MIN
DBL MIN EXP
10
DBL EPSILON 1E-9
DBL MANT DIG
1E+37 1E-37
количество верных десятичных цифр минимальное
х, такое, что 1.0 +
х 1.0
количество цифр по основанию
FLT_RADIX в мантиссе максимальное число с плавающей точкой максимальное
п, такое, что
- 1
представимо минимальное
нормализованное число с плавающей точкой минимальное п, такое, что 10" предста- вимо в виде нормализованного числа количество верных десятичных цифр для типа double минимальное
х, такое, что 1.0 +
х 1.0,
где
х принадлежит типу double количество цифр по основанию
FLT_RADIX в мантиссе для чисел типа double максимальное число с плавающей точ- кой типа double максимальное
п, такое, что
-1
представимо в виде числа типа double минимальное нормализованное число с плавающей точкой типа минимальное
п, такое, что предста- вимо в виде нормализованного числа типа double
Приложение СПеречень измененийС момента публикации первого издания этой книги определение язы- ка Си претерпело изменения. Почти все нововведения - это расширения исходной версии языка, выполненные так, чтобы сохранилась совмести- мость с существующими программами; некоторые изменения касаются устранения двусмысленностей первоначального описания, а некоторые представляют собой модификации, привнесенные существующей прак- тикой. Многие из новых возможностей, впоследствии принятые другими разработчиками Си-компиляторов, были первоначально объявлены в до- кументах, прилагаемых к компиляторам. Комитет ANSI, подготавливая стандарт языка, включил большинство этих изменений, а также ввел дру- гие значительные модификации. Некоторые коммерческие компилято- ры реализовали их еще до выпуска официального Си-стандарта.
В этом приложении сведены воедино различия между языком, опреде- ленным в первой его редакции, и той его версии, которая принята в каче- стве стандарта.
Здесь рассматривается только сам язык; вопросы, относя- щиеся к его окружению и библиотеке, не затрагиваются. Хотя последние и являются важной частью стандарта, но, поскольку в первом издании не делалось попытки описать среду и библиотеку, с соответствующими стандартными элементами сравнивать практически нечего.
• В стандарте более тщательно, по сравнению с первым изданием, опре- делено и расширено препроцессирование: в его основу явно положены лексемы; введены новые операторы для "склеивания" лексем и создания символьных строк а также новые управляющие строки, такие как ttelif и
разрешено повторное определение макроса с той же последо- вательностью лексем; отменена подстановка параметров внутри строк.
Разрешено "склеивание" строк с помощью знака \ в любом месте, не толь- ко в строках и макроопределениях (см. А12).
334 Приложение С• Минимальное число значимых символов всех внутренних идентифи- каторов доведено до 31; для идентификаторов с внешней связью оно остается равным 6; буквы нижнего и верхнего регистров не различают- ся. (Многие реализации допускают большее число значимых символов.)
• Для знаков
\, X,
которых может не быть в некоторых наборах символов, введены последовательности, начина- ющиеся с ?? (см. А12.1). Следует заметить, что введение последовательностей может повредить значения строк, в которых со- держатся ??.
• Введены новые ключевые слова (void, const, volatile, signed,
а мертворожденное слово гу из обращения изъято.
• Для символьных констант и строковых литералов определены новые эскейп-последовательности. Объявлено, что появление за \ символов не из принятых эскейп-последовательностей приводит к непредсказуе- мому результату (см.
• Узаконено полюбившееся всем тривиальное изменение: 8 и 9 не явля- ются восьмеричными цифрами.
• Введен расширенный набор суффиксов для явного указания типов кон- стант:
для целых и F и L - для типов с плавающей точкой. Уточне- ны также правила определения типа для констант без суффиксов
• Объявлено, что соседние строки конкатенируются.
• Предоставлены средства, позволяющие записывать строковые литера- лы и символьные константы из расширенного набора символов
• Объекты типа
(как и объекты другого типа) можно специфициро- вать явно со знаком или без знака. Исключается использование слово- сочетания long в смысле double, но вводится тип long double для чисел с плавающей точкой повышенной точности.
• С некоторых пор доступен тип u n s i g n e d
Стандарт вводит ключе- вое слово signed для явного указания, что объект типа cha
r или другого целочисленного типа имеет знак.
• Уже несколько лет в большинстве реализаций доступен тип
Стан- дарт вводит void * в
качестве типа обобщенного указателя; раньше для
Перечень изменений этой цели использовали c h a r *. Одновременно вступают в силу прави- ла, по которым запрещается без преобразования типа "смешивать" ука- затели и целые или указатели разных типов.
• Стандарт устанавливает минимальные пределы диапазонов арифме- тических типов, предусматривает заголовочные и
в которых помещаются эти характеристики для каждой кон- кретной реализации.
• Перечисление - новый тип, которого не было в первой редакции.
• Стандарт заимствует из Си++ способ записи типа, в ча- стности const (A8.2).
• Вводится запрет на модификацию строк; это значит, что их разрешает- ся размещать в памяти, доступной только на чтение (ПЗУ).
• Изменены "обычные арифметические преобразования"; по существу,
выполнен переход от принципа "для целых всегда превалирует unsigned;
для плавающей точки всегда используется double" к принципу "повы- шение до минимального достаточно вместительного типа" (см. А6.5).
• Отменены старые операторы присваивания вроде =+. Каждый оператор присваивания теперь представляется одной отдельной лексемой. В пер- вом издании оператор присваивания мог изображаться парой симво- лов, возможно, разделенных символами-разделителями.
• Компиляторам более не разрешается трактовать математическую ассо- циативность операторов как вычислительную ассоциативность.
• Введен унарный оператор + для симметрии с унарным -.
• Разрешено использовать указатель на функцию в качестве ее имену- ющего выражения без явного оператора * (см.
• Структурами разрешено при присваиваниях, можно пере- давать структуры в качестве аргументов функциям и получать их в ка- честве результата от функций.
• Разрешено применять оператор получения адреса & к массиву; резуль- татом является указатель на массив.
336 Приложение С
• В первой редакции результат операции sizeof имел тип во многих реализациях он заменен на unsigned. Стандарт официально объявляет его зависимым от но требует, чтобы он был определен в заголовочном файле h> под именем size_t. Аналогичное из- менение было сделано в отношении типа разности указателей, который теперь выступает под именем f_t (см. А7.4.8 и А7.7).
• Запрещено применять оператор получения адреса & к объекту типа даже тогда, когда данный компилятор не располагает его на ре- гистре.
• Типом результата операции сдвига является тип ее левого операнда; тип правого операнда на повышение типа результата влияния не оказывает
(см. А7.8).
• Стандарт разрешает адресоваться с помощью указателей на место, ле- жащее сразу за последним элементом массива, и
позволяет оперировать с такими указателями, как с обычными, см. А7.7.
Стандарт вводит (заимствованный из Си++) способ записи прототипа функции с включением в него типов параметров и явного указания о воз- можности их изменения и формализует метод работы с переменным списком аргументов. (См. А7.3.2, А8.6.3, В7.) С некоторыми ограниче- ниями доступен и старый способ записи.
Стандартом запрещены пустые объявления, т. е. такие, в которых нет объявителей и не объявляется ни одной структуры, объединения или перечисления. Однако объявление с одним тегом структуры (или объе- динения) переобъявит ее даже в том случае, если она была объявлена во внешней области действия.
Запрещены объявления внешних данных, не имеющие спецификато- ров и
(т. е. объявления с одним "голым" объявителем).
В некоторых реализациях, когда расположено во внутреннем блоке, его область видимости распространяется на ос- тальную часть файла. Стандарт вносит ясность в эту ситуацию и объяв- ляет, что область видимости такого объявления ограничена блоком.
Область видимости параметров "вставляется" в составную инструкцию,
представляющую собой тело функции, так что объявления на верхнем уровне функции не могут их "затенить".
Перечень изменений 337
• Несколько изменены именные пространства идентификаторов. Всем те- гам структур, объединений и перечислений стандарт выделяет одно имен- ное пространство; для меток инструкций вводится отдельное именное пространство (см. АИЛ). Кроме того, имена элементов связаны со струк- турой или объединением, частью которого они являются.
некоторых пор это общепринятая практика.)
• Допускается инициализация объединения; инициализатор относится к первому элементу объединения.
•
Разрешается инициализация автоматических структур, объединений и массивов, хотя и с некоторыми ограничениями.
• Разрешается инициализация массива символов с помощью строкового литерала по точному количеству указанных символов (без
• Управляющее выражение и case-метки в switch могут иметь любой цело- численный тип.
Предметный указатель константа восьмеричная 57, 243
константа
57,243
многоточие
>= оператор больше или равно
> оператор больше чем
- оператор вычитания
— оператор декремента
/ оператор деления
% оператор деления по модулю 61, 261
. оператор доступа к элементу структуры
-> оператор доступа к элементу структуры через указатель
, оператор запятая
++ оператор инкремента
» оператор косвенного доступа 125,
259
&& оператор логического
И 37, 62,
71,264
оператор логического
ИЛИ 37, 62,
71,265
! оператор логического отрицания
<= оператор меньше или равно
< оператор меньше чем 62, 263
!= оператор неравенства
&
оператор побитового И 70, 264
I оператор побитового
ИЛИ 70, 264
оператор побитового исключающего
ИЛИ 70, 264
оператор побитового отрицания 71,
260
& оператор получения адреса 125, 259
оператор препроцессора оператор препроцессора 121,
296-298
= оператор присваивания 31-32,
265-266
+= оператор присваивания 72
== оператор равенства оператор сдвига влево сдвига вправо
+ оператор сложения 61,
* оператор умножения 61-62, 261
- оператор унарный минус 259
+ оператор унарный плюс 259
символ двойная кавычка
58,
' символ кавычка
\0 символ нулевой 48, 58, 244
\\ символ обратная наклонная черта
20,57
символ подчеркивания
309
условное выражение 74, 265
аргументы командной строки
150-155
бесконечный цикл
; ) 84, 120
библиотечная функция 20, 96, 108,
309
Предметный указатель
339
abort 325
abs 326
acos 322 330
asin 322
atari, atan2
atof 323
atoi 323 324 325 324
ceil 323
clearerr 319
clock 329
cos
215, 322
cosh 323 330 329 326
exit
325 323
close 208,
ferror 319
flush fgetc 317
fgetpos 318
filecopy 209 323 323 206, 310
fprintf 207, 312
read 318 325
f reopen 311
fscanf 207, 314 318
fsetpos 318 317
getenv 325 317 330 319
iscntrl 319 319
isgraph 319 319
isprint 319
ispunct 319 320 320
isxdigit 320
labs 326 323 330
log,
323 328 322 322 322 322 322 329 323
perror 319 323
printf 313 317
qsort 326
raise 328
rand 324
remove rename rewind 318
scanf
327
340
Предметный указатель signal 328
sin 215,322
sprintf srand 324
sscanf 315
strchr 213, 321 321 321
strcspn 321
strerror 321 330 321 321 321
strtol 324
system 325
tan 322
tanh 323
time 329
tolower 213, 320 320
vfprintf 222,
vprintf 222, 313
vsprintf 222, 313
бинарное дерево 197
бинарный поток 205,
битовое поле выравнивание объявление 192, 273
биты, образцы манипулиро- вания блок см. также составная инструкция структура инициализация в
буферизация см.
буферизованный getchar 219
быстрая сортировка
В
ввод без буферизации 218
возврат символа на 107
с буферизацией 218
с клавиатуры
217
форматный см. scanf ввод-вывод символов ошибки перенаправление с терминала 30
високосный год, вычисление вывод на экран
217
перенаправление 195
форматный см. printf вызов по значению по указателю 45
выравнивание битового поля 132
с помощью union 236
ограничения по выражение 254-267
в скобках 255
константное логическое, численное значе- ние 65
очередность вычисления 75, 254
первичное 255
присваивания
266
выражение-инструкция
285
порядок 37, 71,
вычитание из указателя 136, 177-178,
252
Предметный указатель
341
грамматический разбор методом
, рекурсивного спуска граничные условия деление целых дерево бинарное 179
разбора 161
дескриптор файла 216
длина имени переменной 242
строки 59
единица трансляции завершение программы загадочные числа 29
знак, размножение
И
идентификатор 242
имени затенение имен пространство 292
именующее выражение функции 256
имя 242
индекс отрицательный 132
индексирование массива 39, 130,
256,277-278
и указатели инициализатор инициализация в
двумерных массивов 146, 282
массива массивов структур 172-173
объединения 281
переменных автоматических внешних статических по умолчанию
280
строковой константой структуры указателя 134
инструкции 284-289
выбора 286
перехода 288
присваивания вложенные
74
последовательность выполне- ния 285-286
инструкция окончание помеченная 285
пустая исключительные ситуации
К
типа ключевые слова 242-243
командная строка аргументов 150-155
комментарий компиляция нескольких файлов 97
раздельная
Си-программ конец файла см. EOF
конкатенация лексем строк константа восьмеричная 0... 57, 243
из расширенного набора 245
перечисления
275
символьная 35, 57, 244-245
с плавающей точкой 26, 56-57, 245
строковая
245-246
суффикс 56, 243
тип
О х . . . 57, 243
342
Предметный указатель константное выражение 58, 82, 122,
267
Л
лексема конкатенация подстановка 295
лексика, соглашения лексикографическая сортировка лексическая область видимости
292-293
литерал строковый
см. константа строковая макро-процессор
см. также препроцессор макрос расширение 296
с
120 225
getc 225 225
массив анеуказатель двумерный 145-148,282
имя в роли аргумента индексирование в
256
многомерный объявитель 277
объявление
277
порядок элементов в памяти
277-278
преобразование имени
254-255
размер по умолчанию символов ссылки на элементы 256
структур инициализация 171-173
указателей масштабирование целых в арифме- тике с указателями
262
метка область видимости
285, 293 82, 285
default 82, 285
многопутевое ветвление многоточие множественное присваивание 37
модульность
142
небуферизованный
219
незавершенный тип 272
неоднозначность
79, 286,
301-302
неправильная арифметика с указа- телями несоответствие типов объявлений
99-100
нотация синтаксиса 246
нуль, опущенная проверка на нуль область видимости 246, 292
автоматических переменных 109,
293
внешних объектов лексическая 292
меток правила определения 109, 292
обобщенный указатель см. void *,
указатель обратная польская запись 102
объединение, тег 271-272
объект объявитель 275-279
абстрактный 283
массива 277
функции 278
объявление
268-284
а не определение 52,
Предметный указатель
343
битового поля 192, 271
внешнее 289,291
внешней переменной класса памяти 268
массива структуры типа 276
указателя функции 278
неявное
256
новым способом 257
старым способом typedef 187, 268, 283
оператор
> 62,263
больше или равно >=
вычитания- 61,261-262
деления/
деления по модулю %
доступа к элементу структуры через указатель ->
запятая ,
инкремента ++
косвенного доступа *
логический отрицания !
логического И
ИЛИ
265
<
меньше или равно <=
неравенства ! = 31,
побитового отрицания
280
получения адреса &
приведения к типу
252,260-261,283
присваивания =
присваивания
72
равенства 34-35, 62, 263
сдвига влево сдвига вправо
70, 262
сложения +
умножения *
унарного минуса - 259
унарного плюса + 259
sizeof
260
операторы аддитивные 261
арифметические 61
ассоциативность мультипликативные 261
отношения побитовые присваивания равенства операции над объединениями 190
указателями определение аргумента внешней переменной макроса 295
памяти 268
параметра пробное удаление см. tfundef функции опущенный спецификатор класса памяти 269
типа 270
отбрасывание значения с плавающей точкой 66,
250
при делении
261
отрицательные индексы 132
отступы в тексте программы 23, 34,
40,80
П
память автоматическая класс 247
объявление класса 269
определение 269
распределитель 182, 235-240
резервирование 269
спецификатор класса 268