Брайан Керниган - Язык программирования Си. Издание 3-е, исправленное
- Название:Язык программирования Си. Издание 3-е, исправленное
- Автор:
- Жанр:
- Издательство:Невский Диалект
- Год:2001
- Город:Санкт-Петербург
- ISBN:0-13-110362-8
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Брайан Керниган - Язык программирования Си. Издание 3-е, исправленное краткое содержание
Книга широко известных авторов, разработчиков языка Си, переработанная и дополненная с учетом стандарта ANSI для языка Си, 2-е английское издание которой вышло в 1988 году, давно стала классикой для всех изучающих и/или использующих как Си, так и Си++. Русский перевод этой книги впервые был выпущен изд- вом "Финансы и статистика" в 1992 г. и с тех пор пользуется неизменным спросом читателей.
Для настоящего третьего русского издания перевод заново сверен с оригиналом, в него внесены некоторые поправки, учитывающие устоявшиеся за прошедшие годы изменения в терминологии, а так же учтены замечания, размещенные автором на странице http://cm.bell-labs.com/cm/cs/cbook/2ediffs.html.
Для программистов, преподавателей и студентов.
Издание подготовлено при участии издательства "Финансы и статистика"
Язык программирования Си. Издание 3-е, исправленное - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
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 должны быть упорядочены в возрастающем порядке, 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 игнорируется.
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);
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 вернет управление назад, то вычисления возобновятся с того места, где застал программу пришедший сигнал. Начальное состояние сигналов зависит от реализации.
Читать дальшеИнтервал:
Закладка: