Главная страница
qrcode

Б. Керниган, Д. РитчиЯзык программирования Си


НазваниеБ. Керниган, Д. РитчиЯзык программирования Си
АнкорB Kernigan D Ritchi Yazyk programmirovania C.pdf
Дата30.01.2018
Размер1,65 Mb.
Формат файлаpdf
Имя файлаB_Kernigan_D_Ritchi_Yazyk_programmirovania_C.pdf
оригинальный pdf просмотр
ТипКнига
#62273
страница24 из 24
Каталог
1   ...   16   17   18   19   20   21   22   23   24
strtoul работает так же, как и strtol, с той лишь разницей, что возвращает результат типа
unsigned long, а в случае переполнения - ULONG_MAX. int rand(void)
rand выдает псевдослучайное число в диапазоне от 0 до RAND_MAX; RAND_MAX не меньше
32767. void srand(unsigned int seed)
srand использует seed в качестве семени для новой последовательности псевдослучайных чисел. Изначально параметр seed равен 1. void *calloc(size_t nobj, size_t size)
calloc возвращает указатель на место в памяти, отведенное для массива nobj объектов, каждый из которых размера size, или, если памяти запрашиваемого объема нет, NULL. Выделенная область памяти обнуляется. void *malloc(size_t size)
malloc возвращает указатель на место в памяти для объекта размера size или, если памяти запрашиваемого объема нет, NULL. Выделенная область памяти не инициализируется. void *realloc(void *p, size_t size)
267

realloc заменяет на size размер объекта, на который указывает p. Для части, размер которой равен наименьшему из старого и нового размеров, содержимое не изменяется. Если новый размер больше старого, дополнительное пространство не инициализируется, realloc возвращает указатель на новое место памяти или, если требования не могут быть удовлетворены, NULL (*p при этом не изменяется). void free(void *р)
free освобождает область памяти, на которую указывает p; эта функция ничего не делает, если p
равно NULL. В p должен стоять указатель на область памяти, ранее выделенную одной из функций: calloc, malloc или realloc. void abort(void *р)
abort вызывает аварийное завершение программы, ее действия эквивалентны вызову
raise(SIGABRT). void exit(int status)
exit вызывает нормальное завершение программы. Функции, зарегистрированные с помощью
atexit, выполняются в порядке, обратном их регистрации. Производится опорожнение буферов открытых файлов, открытые потоки закрываются, и управление возвращается в среду, из которой был произведен запуск программы. Значение status, передаваемое в среду, зависит от реализации, однако при успешном завершении программы принято передавать нуль. Можно также использовать значения EXIT_SUCCESS (в случае успешного завершения) и
EXIT_FAILURE (в случае ошибки). int atexit(void (*fcn)(void))
atexit регистрирует fcn в качестве функции, которая будет вызываться при нормальном завершении программы; возвращает ненулевое значение, если регистрация не может быть выполнена. int system(const char *s)
system пepeдaeт cтpoку s oпepaциoннoй cpeдe для выпoлнeния. Если s есть NULL и существует командный процессор, то system возвращает ненулевое значение. Если s не NULL, то возвращаемое значение зависит от реализации. char *getenv(const char *name)
getenv возвращает строку среды, связанную с name, или, если никакой строки не существует,
NULL. Детали зависят от реализации. void *bsearch(const void *key, const void *base,
size_t n, size_t size,
int (*cmp)(const void *keyval, const void *datum))
bsearch ищет среди base[0]...base[n-1] элемент с подходящим ключом *key. Функция cmp должна сравнивать первый аргумент (ключ поиска) со своим вторым аргументом (значением ключа в таблице) и в зависимости от результата сравнения выдавать отрицательное число, нуль или положительное значение. Элементы массива base должны быть упорядочены в
268
возрастающем порядке, bsearch возвращает указатель на элемент с подходящим ключом или, если такого не оказалось, NULL. void qsort(void *base, size_t n, size_t size,
int (*cmp)(const void *, const void *))
qsort сортирует массив base[0]...base[n-1] объектов размера size в возрастающем порядке.
Функция сравнения cmp - такая же, как и в bsearch. int abs(int n)
abs возвращает абсолютное значение аргумента типа int. long labs(long n)
labs возвращает абсолютное значение аргумента типа long. div_t div(int num, int denom)
div вычисляет частное и остаток от деления num на denom. Результаты типа int запоминаются в элементах quot и rem структуры div_t. ldiv_t ldiv(long num, long denom)
ldiv вычисляет частное и остаток от деления num на denom. Результаты типа long запоминаются в элементах quot и rem структуры ldiv_t.
B6. Диагностика:
Макрос assert используется для включения в программу диагностических сообщений. void assert (int выражение)
Если выражение имеет значение нуль, то assert (выражение)
напечатает в stderr сообщение следующего вида:
Assertion failed: выражение, file имя-файла, line nnn
после чего будет вызвана функция abort, которая завершит вычисления. Имя исходного файла и номер строки будут взяты из макросов __FILE__ и __LINE__.
Если в момент включения файла было определено имя NDEBUG, то макрос assert игнорируется.
269

B7. Списки аргументов переменной длины:
Заголовочный файл предоставляет средства для перебора аргументов функции, количество и типы которых заранее не известны. Пусть lastarg - последний именованный параметр функции f с переменным числом аргументов. Внутри f объявляется переменная ap типа va_list, предназначенная для хранения указателя на очередной аргумент: va_list ар;
Прежде чем будет возможен доступ к безымянным аргументам, необходимо один раз инициализировать ap, обратившись к макросу va_start: va_start(va_list ap, lastarg);
С этого момента каждое обращение к макросу: type va_arg(va_list ap, type);
будет давать значение очередного безымянного аргумента указанного типа, и каждое такое обращение будет вызывать автоматическое приращение указателя ap, чтобы последний указывал на следующий аргумент. Один раз после перебора аргументов, но до выхода из f необходимо обратиться к макросу void va_end(va_list ap);
B8. Дальние переходы:
Объявления в предоставляют способ отклониться от обычной последовательности "вызов - возврат"; типичная ситуация - необходимость вернуться из "глубоко вложенного" вызова функции на верхний уровень, минуя промежуточные возвраты. int setjmp(jmp_buf env);
Макрос setjmp сохраняет текущую информацию о вызовах в env для последующего ее использования в longjmp. Возвращает нуль, если возврат осуществляется непосредственно из
setjmp, и не нуль, если - от последующего вызова longjmp. Обращение к setjmp возможно только в определенных контекстах, в основном это проверки в if, switсh и циклах, причем только в простых выражениях отношения. if (setjmp() == 0)
/* после прямого возврата */
else
/* после возврата из longjmp */
void longjmp(jmp_buf env, int val);
270

longjmp восстанавливает информацию, сохраненную в самом последнем вызове setjmp, по информации из env; выполнение программы возобновляется, как если бы функция setjmp только что отработала и вернула ненулевое значение val. Результат будет непредсказуемым, если в момент обращения к longjmp функция, содержащая вызов setjmp, уже "отработала" и осуществила возврат. Доступные ей объекты имеют те значения, которые они имели в момент обращения к longjmp; setjmp не сохраняет значений.
B9. Сигналы:
Заголовочный файл предоставляет средства для обработки исключительных ситуаций, возникающих во время выполнения программы, таких как прерывание, вызванное внешним источником или ошибкой в вычислениях. void (*signal(int sig, void (*handler)(int)))(int)
signal устанавливает, как будут обрабатываться последующие сигналы. Если параметр handler имеет значение SIG_DFL, то используется зависимая от реализации "обработка по умолчанию"; если значение handler равно SIG_IGN, то сигнал игнорируется; в остальных случаях будет выполнено обращение к функции, на которую указывает handler с типом сигнала в качестве аргумента. В число допустимых видов сигналов входят:
SIGABRT
- аварийное завершение, например от abort;
SIGFPE
- арифметическая ошибка: деление на 0 или переполнение;
SIGILL
- неверный код функции (недопустимая команда);
SIGINT
- запрос на взаимодействие, например прерывание;
SIGSEGV
- неверный доступ к памяти, например выход за границы;
SIGTERM
- требование завершения, посланное в программу.
signal возвращает предыдущее значение handler в случае специфицированного сигнала, или
SIGERR в случае возникновения ошибки.
Когда в дальнейшем появляется сигнал sig, сначала восстанавливается готовность поведения "по умолчанию", после чего вызывается функция, заданная в параметре handler, т.е. как бы выполняется вызов (*handler)(sig). Если функция handler вернет управление назад, то вычисления возобновятся с того места, где застал программу пришедший сигнал. Начальное состояние сигналов зависит от реализации. int raise(int sig)
raise посылает в программу сигнал sig. В случае неудачи возвращает ненулевое значение.
271

B10. Функции даты и времени:
Заголовочный файл объявляет типы и функции, связанные с датой и временем.
Некоторые функции имеют дело с местным временем, которое может отличаться от календарного, например в связи с зонированием времени. Типы clосk_t и time_t - арифметические типы для представления времени, a struct tm содержит компоненты календарного времени: int tm_sec; - секунды от начала минуты (0,61); -- I.B.: все же наверно от 0 до 59
int tm_min; - минуты от начала часа (0,59);
int tm_hour; - часы от полуночи (0,23);
int tm_mday; - число месяца (1,31);
int tm_mon; - месяцы с января(0,11);
int tm_year; - годы с 1900;
int tm_wday; - дни с воскресенья (0,6);
int tm_yday; - дни с 1 января (0,365);
int tm_isdst; - признак летнего времени.
Значение tm_isdst - положительное, если время приходится на сезон, когда время суток сдвинуто на 1 час вперед, нуль в противном случае и отрицательное, если информация не доступна. clock_t clock(void)
clock возвращает время, фиксируемое процессором от начала выполнения программы, или -1, если оно не известно. Для выражения этого времени в секундах применяется формула clock()/CLOCKS_PER_SEC. time_t time(time_t *tp)
time возвращает текущее календарное время (т. е. время, прошедшее после определенной даты,
- обычно после 0 ч 00 мин 00 с GMT 1-го января 1970 г. - примеч. ред.) или -1, если время не известно. Если tp не равно NULL, то возвращаемое значение записывается и в *tp. double difftime(time_t time2, time_t time1)
difftime возвращает разность time2 - time1, выраженную в секундах. time_t mktime(struct tm *tp)
mktime преобразует местное время, заданное структурой *tp, в календарное, выдавая его в том же виде, что и функция time. Компоненты будут иметь значения в указанных диапазонах.
Функция mktime возвращает календарное время или -1, если оно не представимо.
Следующие четыре функции возвращают указатели на статические объекты, каждый из которых может быть изменен другими вызовами. char *asctime(const struct tm *tp)
asctime переводит время в структуре *tp в строку вида
272

Sun Jan 3 15:14:13 1988\n\0
char *ctime(const time_t *tp)
ctime переводит календарное время в местное, что эквивалентно выполнению asctime(localtime(tp))
struct tm *gmtime(const time_t *tp)
gmtime переводит календарное время во Всемирное координированное время (Coordinated
Universal Time - UTC). Выдаст NULL, если UTC не известно. Имя этой функции, gmtime, происходит от Greenwich Mean Time (среднее время по Гринвичскому меридиану). struct tm *localtime(const time_t *tp)
localtime переводит календарное время *tp в местное. size_t strftime(char *s, size_t smax, const char *fmt, const struct tm *tp)
strftime форматирует информацию о дате и времени из *tp в строку s согласно формату fmt, который имеет много общих черт с форматом, задаваемым в функции printf. Обычные символы
(включая и завершающий символ '\0') копируются в s. Каждая пара, состоящая из % и буквы, заменяется, как показано ниже, с использованием значений по форме, соответствующей местным традициям. В s размещается не более smax символов; strftime возвращает число символов без учета '\0' или нуль, если число сгенерированных символов больше smax.
%a сокращенное название дня недели
%A
полное название дня недели
%b сокращенное название месяца
%B
полное название месяца
%c местное представление даты и времени
%d день месяца (01-31)
%H
час (24-часовое время) (00-23)
%I
час (12-часовое время) (01-12)
%j день от начала года (001-366)
%m месяц (01-12)
273

%M
минута (00-59)
%p местное представление AM или РМ (до или после полудня)
%S
секунда (00-61)
%U
неделя от начала года (считая, что воскресенье - 1-й день недели) (00-53)
%w день недели (0-6, номер воскресенья - 0)
%W
неделя от начала года (считая, что понедельник - 1-й день недели) (00-53)
%x местное представление даты
%X
местное представление времени
%y год без указания века (00-99)
%Y
год с указанием века
%Z
название временной зоны, если она есть
%%
%
B11. Зависящие от реализации пределы: и
274

Заголовочный файл определяет константы для размеров целочисленных типов. Ниже перечислены минимальные приемлемые величины, но в конкретных реализациях могут использоваться и большие значения.
CHAR_BIT
8
битов в значении char
SCHAR_MAX
UCHAR_MAX или
SCHAR_MAX
максимальное значение char
CHAR_MIN
0 или CHAR_MIN
минимальное значение char
INT_MAX
+32767 максимальное значение int
INT_MIN
-32767 (I.B.:обычно это
значение -32768) минимальное значение int
LONG_MAX
+2147463647 максимальное значение long
LONG_MIN
-2147483647 (I.B.:обычно это
значение -2147483648) минимальное значение long
SCHAR_MAX
+127 максимальное значение signed char
SCHAR_MIN
-127 (I.B.:обычно это значение
-128) минимальное значение signed char
SHRT_MAX
+32767 максимальное значение short
SHRT_MIN
-32767 (I.B.:обычно это
значение -32768) минимальное значение short
UCHAR_MAX
255 максимальное значение unsigned char
UINT_MAX
65535 максимальное значение unsigned int
ULONG_MAX
4294967295 максимальное значение unsigned long
USHRT_MAX
65535 максимальное значение unsigned short
Имена, приведенные в следующей таблице, взяты из и являются константами, имеющими отношение к арифметике с плавающей точкой. Значения (если они есть) представляют собой минимальные значения для соответствующих величин. В каждой реализации устанавливаются свои значения.
FLT_RADIX
2 основание для представления порядка, например: 2, 16
FLT_ ROUNDS
способ округления при сложении чисел с плавающей точкой
FLT_DIG
6
количество верных десятичных цифр
275

FLT_EPSI ON
1E-5
минимальное х, такое, что 1.0 + х != 1.0
FLT_MANT_DIG
количество цифр по основанию FLT_RADIX в мантиссе
FLT_MAX
1E+37 максимальное число с плавающей точкой
FLT_MAX_EXP
максимальное n, такое, что FLT_RADIX
n
-1 представимо
FLT_MIN
1E-37
минимальное нормализованное число с плавающей точкой
FLT_MIN_EXP
минимальное n, такое, что 10
n представимо в виде нормализованного числа
DBL_DIG
10
количество верных десятичных цифр для типа double
DBL_EPSILON
1E-9
минимальное х, такое, что 1.0 + x != 1.0, где x принадлежит типу double
DBL_MANT_DIG
количество цифр по основанию FLT_RADIX в мантиссе для чисел типа double
DBL_MAX
1E+37 максимальное число с плавающей точкой типа double
DBL_MAX_EXP
максимальное n, такое, что FLT_RADIX
n
-1 представимо в виде числа типа double
DBL_MIN
1E-37
минимальное нормализованное число с плавающей точкой типа double
DBL_MIN_EXP
минимальное n, такое, что 10
n представимо в виде нормализованного числа типа double
276
1   ...   16   17   18   19   20   21   22   23   24

перейти в каталог файлов


связь с админом