Текст
                    Рекс Жешке
толковый
СЛОВАРЬ
СТАНДАРТА
ЯЗЫКА СИ

Толковый словарь стандарта языка Си
Rex Jaeschke The Dictionary of Standard C
Рекс Жешке Толковый словарь стандарта языка Си перевод с английского В. К. Потоцкого «ПИТЕР» Санкт-Петербург 1994
Рекс Жешке Толковый словарь стандарта языка Си Главный редактор Ответственный редактор Художественный редактор Корректор Оригинал-макет подготовили В. В. Усманов Е. А. Гринберг В. Д. Кашин А. Р. Денисов Е. А. Гринберг, А. Р. Денисов Настоящий толковый словарь является своеобраз- ным лоцманом в море имен и терминов, используемых при работе на языке Си. Словарь включает описание двух версий стандарта языка Си: американ- ской (ANSI С) и международной (ISO С). Входящие в словарь термины организованы в алфа- витном порядке и поясняются конкретными примерами программ. Имеется обширная система перекрестных ссылок между терминами, а также указатель их русско- язычных аналогов. Книга рассчитана на программистов всех уровней владения языком Си. © Rex Jaeshke, 1991 © Перевод на русский язык, В. К Потоцкий, 1994 © Оформление, издательство «Питер». 1994 ISBN 5-7190-0018-6 (рус.) ISBN 1—878956—07—8 (англ.) MS-DOS — торговая марка Microsoft Corporation; PC-DOS — торговая марка International Business Machines Corporation; POSIX — торговая марка Institute of Electrical and Electronics Engineers; UNIX — торговая марка UNIX System Laboratories Inc. Издательство «Питер». 194044, С.-Петербург, Выборгская наб., 17. Лицензия ЛР № 060557 от 17.01.92 Подписано к печати 7.03.94. Формат 84X108 1/32. Печать высокая. Усл. п. л. 12,1. Уч.-изд. л. 13,2. Тираж 30 000. Заказ 677. Отпечатано с готового оригинал-макета в ГПП «Печатный Двор». 197110, С.-Петербург, Чкаловский пр., 15
Предисловие В течение семи лет я писал о языке Си, проводил семинары по программированию на Си, в результате чего постепенно сформиро- вался словарь терминов этого языка. Однако на протяжение почти всего этого времени стремительно развивался проект Стандарта ANSI языка Си (ANSI С). Поэтому я решил подождать, пока процесс стандартизации языка не будет в основном завершен, и только после этого предпринял попытку создания толкового словаря языка Си. 11а рынке существует множество книг по языку Си. охватываю- щих широкий диапазон приложений и вычислительных платформ, причем каждая имеет свою систему перекрестных ссылок. Между тем, искусство построения в книге предметного указателя (индекса) весьма специфично, а само построение часто делается липом, не слишком хорошо проникшим в суть изложения автора. Кроме того, предметный указатель любой книги ограничен ее содержанием. Маловероятен, например, гот факт, что книга по структурам данных в языке Си будет иметь в индексе ссылки на стандартные функции обработки даты н времени. Многие из тех, кто программирует на языке Си, собирают большое количество связанной с ним литературы, поскольку в одной книге невозможно найти ответы на все возникающие вопросы. Сталкиваясь с некоторыми специфическими терминами, читатель иногда вынужден просматривать предметные указатели пяти или шести книг, прежде чем найдет нужную информацию. В тех же случаях, когда эта информация касается наиболее совершенных средств или «тонкостей» языка программирования (таких, напри- мер, как «именующие выражения» или «точки следования»), индекс может оказаться и вовсе бесполезным. Именно эти проблемы и призван решать толковый словарь. Входящие в него термины, организованные в алфавитном порядке, отыскиваются быстро и легко. Формат словаря позволяет давать краткие, но достаточно емкие определения, сопровождаемые в некоторых случаях поясня- ющими примерами учебного характера. И, конечно же, имеется обширная система перекрестных ссылок между терминами. Кому предназначен словарь Эта книга рассчитана на программистов всех уровней владения языком Си. Поскольку содержание книги не охватывает многие расширения, словарь не стремится осветить возможности какого-ли- бо конкретного приложения. Излагаемое носит фундаментальный и универсальный характер и предназначено любому программисту, работающему с языком Си и использующему наиболее широко распространенные реализации системы программирования па язы- ке Си. Пределы возможностей словаря Чтобы осветить все многообразие имен и терминов, используемых в индустрии языка Си я начал составление словаря с предметного указателя стандарта ANSI С и сопровождающего его документа основных положений (rationale document). Эту основу я дополнил предметными указателями каждой из моих книг, а также методиче- 5
ским материалом по обучению программированию на языке Си, Я убежден, что словарь содержит все важные термины, а также боль- шинство тех, которые представляют меньший интерес. Подавляющее большинство вошедших в словарь определений относится к Стандарту языка Си, однако я подобрал для словаря еще несколько широко используемых, но нестандартных терминов. Про- вести черту между ними было трудно, и я допускаю, что мой выбор в определенной степени произволен. Например, включены предназ- наченные для MS- DOS ключевые слова near, far и huge, относящиеся к расширению средств языка, однако за пределами словаря оказа- лись функции описания работы с файлами в операционной системе UNIX, такие как open и close. Данная книга не является словарем UNIX System V или POSIX. Она не содержит ничего из многообразия нестандартных функций, сопутствующих компиляторам или входящих в дополнительные биб- лиотеки. которые предлагаются различными поставщиками про- граммного обеспечения. Содержимое словаря — это Стандарт языка Си с очень небольшим включением средств систем программирова- ния на языке Си. Выражение благодарности Хотелось бы поблагодарить Dennis Ritchie из Bell Labs за создание языка Си, Brian Kernighan за столь выразительное изложение языка Си, хорошо вооружившее поколение Си-программистов, Jim Brodie, Tom Plum и P. J. Plauger за большой вклад в работу комитета X3J11 по стандартизации, Larry Rosler и David Prosser за прекрасную работу по редактированию Стандарта языка Си, Randy Hudson за редактирование Rationale manual, а также всех моих коллег по комитету X3J11 и рабочей группе WG14. помогавших мне в моих многочисленных, порой рискованных Си-начинаниях Я хочу также поблагодарить тех, кто взял на себя труд просмотра рукописи книги, а именно Nelson Beebe, Jim Brodie, Tom MacDonald и Tom Plum; их предложения значительно повысили качество содер- жания этой книги. Большое спасибо сотрудникам издательства Professional Press и, в частности, Annette Nelson, возглавлявшей отделение издания книг, и Lonni Wright за самоотверженное редак- тирование моих книг и статей и попытки, увы, тщетные, научить меня корректному обращению с глаголами в неопределенной форме и запятыми. Наконец, я выражаю благодарность Donald Knuth за его систему набора текста Т^Х и Leslie Lamport за его макропакет LGf-.X, с помощью которого была подготовлена эта книга*. * Имеется в виду оригинал книги на английском языке. Прим. peg. 6
Предисловие к русскому изданию Летом 1992 года я прочитал цикл лекций по языкам программирования С и C++ в Санкт-Петербурге (Россия). Я получил большое удовлетворе- ние от того интереса и энтузиазма, с которым были встречены мои выступления. Я познакомился со многими талантливыми людьми. Од- ним из результатов этой поездки в Россию явился перевод данной книги В. К. Потоцким и подготовка рукописи перевода к печати С В. Азарье- вой, с которыми у меня сложились дружеские отношения. Как лектор и руководитель семинаров, я рад поделиться инфор- мацией, которой располагаю. Я надеюсь на долгие и плодотворные отношения с Вами, мои русские друзья и искренне желаю Вам всего наилучшего в это нелегкое время. Я знаю, что некоторые из Вас имеют доступ к международной электронной почте. Если я могу оказаться полезным в решении каких-либо технических вопросов, пожалуйста, без вся- ких колебаний обращайтесь ко мие по адресу: rex@aussie.com С наилучшими пожеланиями, Вашингтон, США Rex Jaeschke февраль 1994 Предисловие переводчика Стандартизация столь мощного программного инструмента, како- вым является язык Си, вызвана прежде всего необходимостью пере- носимости Си-программ на различные «платформы» (персональ- ные компьютеры, мини- и супермини-ЭВМ, большие и сверхбольшие вычислительные системы). К настоящему времени разработаны и приняты две практически идентичные версии Стан- дарта Си: ANSI С (American National Standard Institute С) и ISO С (International Standard Organization С). Предлагаемый словарь Стандарта языка Си включает описание и иллюстрацию фрагмен- тами программ обеих версий стандарта. Автор словаря Rex Jaeschke (Рекс Жешке) — международно признанный эксперт по языку Си. Он член обоих комитетов по стандартизации этого языка (как американского ANSI С, так и международного ISO С), автор нескольких книг по языку Си. изве- стных под общим названием «Си-библиотека Рекса Жешке». Он также является основателем и со-редактором нескольких журналов (The Journal of С Language Translation, The C User's Journal),, ведет ежемесячную рубрику «Doctor C’s Pointers» в широко известном журнале «DEC Professional». Впервые опубликованная в США в 1991 году, данная книга выдержала несколько изданий. Настоящий перевод этой книги является первой публикацией в нашей стране по стандарту языка Си и первым толковым словарем этого универсального языка про- граммирования, доминирующего в мире вычислительной техники. Хотелось бы выразить благодарность всем, кто способствовал выходу в свет этой книги, и прежде всего издательству «Питер» и кандидату физ. мат. наук С. В. Азарьевой, выполнившей значи- тельную часть работы по подготовке рукописи к изданию. Потоцкий В. К. Санкт-Петербург, февраль 1994 7
Как пользоваться словарем Почти каждый знак операции и пунктуации языка Си представлен одним или несколькими символами. Как же включить их в алфавит- ный порядок терминов, чтобы поиск этих знаков проходил без затруднений, интуитивно? Я перечислил символы пунктуации в двухстраничной таблице, которая следует непосредственно за этим разделом. Каждому символу соответствует слово или фраза, исполь- зуемые в качестве ключа (входного термина) поиска этого символа. Символы, смысл которых многозначен, имеют несколько включений (терминов), перечисленных в алфавитном порядке. Сами символы располагаются в таблице в порядке следования их ASCII-кодов. Возможно, что такое решение не является наилучшим, но для предпочтения другого решения нет оснований. Многие темы представлены несколькими включениями (терми- нами), поскольку у этих тем существует более одного наименования. Например, метки case представлены двумя включениями: «case label» и «label, case». Можно надеяться, что в большинстве случаев первое включение окажется наиболее очевидным. В то же время имеются многочисленные включения, связанные с информацией о case, а также о метках, поэтому выбор ссылки на включение делался в определенной степени произвольно. Для примера рассмотрим следующее включение (термин и его толкование): addition assignment operator (знак составной операции «сложение» и «присваивание») Использование соединенных вместе зна- ков «плюс» и «равенство» позволяет применять двухместную операцию выр! += выр2 в качестве выр! = выр! + выр2. От- личие первой записи от второй в том. что в первом случае выр! вычисляется только один раз. Порядок вычисления значений операндов (выражений выр! и выр2) не указан. Оба операнда должны быть выражениями арифметического типа; если же левый операнд является указателем на объект, то правый опе- ранд должен быть арифметическим выражением целого типа. Левый операнд должен быть модифицируемым именующим выражением (lvalue). Тип результата этой двухместной опера- ции — это тип выражения выр!. Операция ассоциативна справа. (См assignment operator, compound.) Включения (имена входа) выделены жирным шрифтом. Все эле- менты языка (такие, как идентификаторы, знаки операций и дирек- тивы препроцессора) и фрагменты программ воспроизведены руб- леным шрифтом. При описании формы или формата синтаксической конструкции языка части, включаемые программистом, отобража- ются курсивом. Многие включения являются прямыми ссылками на другие включения. Например, приведенное выше включение содержит среди прочих ссылку на «присваивание», «ассоциативность», «мо- дифицируемое именующее выражение», «знак операции» и «ука- затель». Такие ссылки не выделены специальным шрифтом потому, 8
что их слишком много; иначе текст выглядел бы нечитаемым из-за постоянной смены шрифта. В целом соблюдается правило, согласно которому каждый тер- мин, используемый во включении, является либо специфическим и описывается в своем собственном включении, либо это термин общего назначения в вычислительной технике, который утке знаком читателю. Включения, родственные данному, но не встречающиеся в его тексте, явно указываются в конце этого включения в форме ссылки, подобной следующей: «См. assignment operator, compound». Несколько сотен включений описывают библиотечные функ- ции. Рассмотрим подобное включение; abs Эта функция вычисляет абсолютное значение аргумента j. #inc!ude <stdlib.h> int abs(int j); Поведение функции не определено, если результат ее выполне- ния не может быть представлен (как, например, значение abs(—х) в 16-битовом компьютере в дополнительном коде, когда х имеет значение-32768.) (См. labs). Каждое включение, описывающее библиотечную функцию, на- чинается с короткого объяснения назначения этой функции. Затем следует название объекта-заголовка, подлежащего включению по- средством директивы #indude который обеспечивает надлежащий доступ к этой функции. После этого приводится прототип функции. Далее описываются детали применения функции и сопутствующая информация. Знаки операций, пунктуации и т. п. Лексема Включение словаря 1 Знак логической операции «отрицание» 1= 0 Знак операции отношения «неравенство» Знак операции «приведение типа» Знак операции «вызов функции» Знак пунктуации «круглые скобки» * Пунктуация в деклараторах (объявлениях) Знак операции «косвенная адресация» Знак операции «умножение» »= Знак составной операции «умножение» и «при- сваивание» + Знак операции «сложение» Знак одноместной операции «плюс» + Знак операции «увеличение на единицу» += Знак составной операции «сложение» и «присва- ивание» 9
Лексема Включение словаря 1 Знак операции «запятая» Знак пунктуации «запятая» — Знак операции «вычитание» Знак одноместной операции «минус» — Знак операции «уменьшение на единицу» — Знак составной операции «вычитание» и «при- сваивание» Знак операции «стрелка» Знак операции «точка» Точка разделения целой и дробной частей Многоточие / /♦♦/ /= Знак операции «деление» Комментарий Знак составной операции «деление» и «присваи- вание» : Двоеточие t Зна1 пунктуации «точка с запятой» Знак операции отношения «меньше» V V Знак операции «сдвиг влево» Знак составной операции «сдвиг влево» и «при- сваивание» <= Знак операции отношения «меньше или равно» — Знак операции «присваивание» Знак операции «равно» = Знак операции отношения «тождество» Знак составной операции «присваивание», уста- ревший Знак операции отношения «больше» >= Знак операции отношения «больше или разно» V V V V II Знак операции «сдвиг вправо» Знак составной операции «сдвиг вправо» и «при- сваивание» Знак операции «вычисление выражения по усло- вию» Ях [} # Триграф Пунктуация в деклараторах (объявлениях) null-директива препроцессора Знак операции препроцессора «придание операн- ду формы строки символов» ## % Знак операции препроцессора «склеивание лексем» Маска редактирования Знак операции «вычисление остатка» %= Знак составной операции «вычисление остатка» и «присваивание» 10
Лексема Включение словаря & Знак операции «вычисление адреса» Знак операции «побитовое И» && &= Знак операции «логическое И» Знак составной операции «побитовое И» и «при- сваивание» \ \" Наклонная черта влево Управляющая последовательность «двойные ка- вычки» V Управляющая последовательность «одиночная ка- вычка» \0 \? null-символ Управляющая последовательность «вопроситель- ный знак» \\ Управляющая последовательность «наклонная черта влево» \а Управляющая последовательность «подача сигна- ла предупреждения» \ь Управляющая последовательность «возврат на один символ» \ddd Управляющая последовательность «восьмеричное число» \f Управляющая последовательность «прогон стра- ницы» \n \r Управляющая последовательность «новая строка» Управляющая последовательность «перевод стро- ки» \f Управляющая последовательность «горизонталь- ная табуляция» \v Управляющая последовательность «вертикальная табуляция» \xWi Управляющая последовательность «шестнадцате- ричное число» Знак операции «побитовое исключающее ИЛИ» — Знак составной операции «побитовое исключаю- щее ИЛИ» и «присваивание» {} I Знак подчеркивания Фигурные скобки Знак операции «побитовое ИЛИ» l= Знак составной операции «побитовое ИЛИ» и II «присваивание» Знак операции «логическое ИЛИ» Знак операции «дополнение» знак= Знак составной операции «присваивание» 11
aocrt abort Эта функция вызывает аномальное завершение работы про- граммы, если не имеет места перехват сигнала SIGABRT и возврат управления из обработки сигналов (исключительных состоя- ний ). #indude <stdlib h> void abort(void); В зависимости от конкретной реализации (системы программи- рования на языке Си), выполняются или не выполняются очи- стка (сброс буферов) выходных потоков, закрытие открытых потоков или удаление временных файлов. От конкретной реа- лизации зависит также значение кода завершения работы про- граммы, свидетельствующего о том, что выполнение программы потерпело неудачу. Аварийное завершение работы программы может быть также выполнено вызовом ф} нкции raise с использо- ванием SIGABR"1 в качестве аргумента. (О нормальном заверше- нии выполнения программы см. ex t см. также assert)! abs Эта ф1 нкцня вычисляет абсолютное значение своего аргумента j. #include <stdlib.h> inf abs(int j); Поведение функции не определено, если результат ее выполне- ния не представим (как, например, значение abs(—х) в 16-бито- вой машине в дополнительном коде, когда аргумент х имеет значение —32/68). (См. labs.) absolute functions (функции вычисления абсолютных значений) Оперирующая числами в формате с плавающей точкой функция tabs определена в math.h; функции abs и labs, манипулирующие целочисленными значениями, объявлены в stdlib.h. abstract machine (абстряктная машина) Подобная система, сущест- вующая только теоретически, используется для моделирования стандарта языка программирования. В абстрактной машине стгтимизация (а следовательно, и семантика volatile] представля- ется неуместной. Однако реальный мир далек от абстракций, и поэтому такие понятия, как точки следования (sequence points), необходимы, поскольку они указывают оптимизаторам пределы, в которых допустима определенная вариабельность (гибкость). acos Эта функция вычисляет арккосинус своего аргумента х и возвращает в качестве результата значение (в радианах) в диа- пазоне [0 гг]. # nclude <math.h> double acos(double x); Если значение аргумента выходит за пределы диапазона [—1 ,+1 ], имеет место соответствующее сообщение об ошибке. 12
adoress-of operator acosf Эта дополнительная функция (опция) является альтернативой функции acos для аргумента типа float. Это нововведение прнн.цд- л' жи г Стандарту языка Си. acosl Эта дополнительная функция (опция) является альтернативой функции acos для аргумента long double. Это относится к нововве- дениям Стандарта языка Си. active position (активная позиция) Это позиция на экране дисплея, в которой появится следующий символ, выводимый функцией fputc. В большинстве стран Европейской культуры воспроизво- димое на экране дисплея «разворачивается» последовательно слева направо и сверху вниз. Однако это не является единствен- ным возможным решением. Направление воспроизведения ин- формации определяется «культурной средой» (locale). addition assignment operator (знак совмещенных операций «сложе- ние» и «присваивание») Использование соединенных вместе знаков «плюс» и «равенство» позволяет применять двухместную операцию выр! += выр2 в качестве выр1 = выр! + выр2. От- личие первой записи от второй в том, что в первом случае выр] вычисляется только один раз. Порядок вычисления значений операндов (выражений выр! и выр2) не указан. Оба операнда должны быть выражениями арифметического типа; если же левый операнд является указателем на объект, то правый опе- ранд должен быть арифметическим выражением целого типа. Левый операнд должен быть модифицируемым именующим выражением (lvalue). Тип результата двухместной операции — это тип выражения выр/. Операция ассоциативна справа. (См- assignment operator compound ) addition operator (знак операции «сложение») Знак «плюс» (+) сим- волизирует сложение значений операндов — участников опера- ции сложения. Порядок вычисления значений операндов не указан. Оба операнда должны быть выражениями арифметиче- ского типа; если же левый операнд является указателем на объект, то правый операнд должен быть арифметическим выра- жением целого типа. Над операндами выполняются обычные арифметические преобразования типов. Операция ассоциатив- на справа. address (адрес) Это адрес области памяти, в которой размещается объект (данные) или функция (программный модуль). У боль- шинства вычислительных машин наименьшей адресуемой обла- стью памяти (ячейкой) является байт или машинное слово. Объект или функция может занимать и обычно занимает более одной ячейки памяти, а поэтому адресом объекта или функции полагают адрес первой ячейки занимаемой области памяти. В языке Си выражение, значением которого является адрес, назы- вают адресным выражением (pointer expression) или указателем (pointer). (См. address-of operator ) address-of operator (знак операции «вычисление адреса») Знак этой одноместной операции (4), размещаемый слева от операнда, обеспечивает вычисление адреса последнего. В качестве опе- 13
aggregate ранда следует использовать символическое представление вызо- ва функции или именующее выражение (lvalue), представляю- щее объект (однако таковым не может быть поле битов или объект, класс памяти которого register). Операция ассоциативна справа. Тип результата операции вычисления адреса — это тип, определяемый как «указатель на данные типа, к которому при- надлежит операнд». Отметим, что если arg — это символическое обозначение массива, то &arg — это указатель на массив цели- ком, что существенно отличается от &агд[О] — указателя на пер- вый элемент массива. aggregate (составные данные) Составные или агрегатированные данные — это массив или структура. Типичным составным дан- ным является данное, включающее в себя два или более элемен- тов. Однако язык Си позволяет формировать и одноэлементный массив или структуру, т. е. составное данное с одним членом. К данным неагрегатированного типа относятся объединения (unions) и скалярные данные. alert « scape sequence (управляющая последовательность подачи сиг- нала предупреждения) Сигнал предупреждения, подобный зву- ковому сигналу тревоги, может быть представлен управляющей последовательностью вида \а. aliasing (совмещение имен) Псевдоним (alias) — это альтернатив- ное наименование объекта или функции. Посредством указате- лей язык Си позволяет присваивать неограниченное число псев- донимов объектам или функциям. Доступ к объекту или функции возможен по имени или с помощью одного из его указателей, который адресуется к объекту (функции) непосред- ственно или косвенно. Поскольку передача массива в функцию возможна только путем передачи его адреса, нельзя гарантиро- вать, что «перекрытие» массивов невозможно. Как следствие, очень трудно оптимизировать некоторые машинные коды (про- граммные модули), и невозможно векторизировать или распа- раллеливать циклы, если указанное перекрытие потенциально возможно. В процессе работы над проектом Стандарта языка Си комитет X3J11 предложил новый идентификатор типа noalias с целью помочь решению этой старой и грудной проблемы. Одна- ко после долгих и жарких дебатов это ключевое слово было изъято из проекта ANSI С. Обсуждение этого вопроса возобновлено в комитете NCEG. alignment (выравнивание) Некоторые вычислительные машины, такие, как PDP-11 или машины, построенные по RISC-техноло- гии, требуют размещения некоторых объектов на определенных границах адресного пространства памяти: говоря иначе, требу- ется выравнивание местоположения объектов в памяти И хотя другие машины, такие как VAX или Intel 80x86. могут манипу- лировать объектами, размещаемыми на любой границе адресно- го пространства, эффективность операций существенно повы- шается, если слова размещаются на границе слов, длинные слова — на границе длинных слов и т д. Структуры могут 14
argc содержать «дыры» между элементами (или после последнего элемента структуры), и в подобных случаях соответствующее заполнение «дыр» компилятором может обеспечить желаемое выравнивание объектов на границы адресного пространства. Подобное выравнивание может быть «навязано» пользователю компилятором, или у пользователя может иметься возможность выбора подобного выравнивания (опция режима работы компи- лятора). Некоторые компиляторы позволяют задать режим вы- равнивания путем использования соответствующей директивы типа pragma (например, называемой pack). AND assignment operator, bitwise (знак составной операции «поби- товое И» и «присваивание») Использование соединенных вме- сте знаков И (&) и присваивания (=) позволяет применять двухместную операцию выр! &= выр2 в качестве выр! = выр! & выр2. Отличие первой записи от второй в том, что в первом случае выр! вычисляется только один раз. Оба операнда должны быть данными целочисленного типа. Порядок вычисления значений операндов не указан. Левый операнд должен быть модифицируемым именующим выражением (lvalue). Тип результата двухместной операции — это тип выра- жения выр1. Операция ассоциативна слева. (См. assignment operator, compound.) AND operator, bitwise (знак операции «побитовое И») Знак & обес- печивает выполнение побитовой операции И над операндами. Оба операнда должны быть данными целочисленного типа. По- рядок вычисления значений операндов не указан. Над операн- дами выполняются обычные арифметические преобразования типов. Операция ассоциативна слева. AND operator, logical (знак операции «логическое И») Знак && обеспечивает выполнение логической операции И над операн- дами. Оба операнда должны быть данными скалярного типа. Результат операции имеет тип int и значение 0 («ложно») или 1 («истинно»). После определения значения левого операнда имеет место точка следования (sequence point). Если в результате проверки выясняется, что значение левого операнда — «ложно», то определение значения правого операнда не выполняется. Операция ассоциативна слева. ANSI С Официальное название языка Си, препроцессора и библиотеки поддержки выполнения программы (run-time library), принятое Американским Национальным Институтом Стандартов (ANSI). Данный стандарт (ANSI С) разработан коми тетом X3J11. (См ISO С и Standard С.) argc Первый параметр (аргумент), передаваемый функции main. Этот целочисленный (int) параметр предназначен для хранения числа параметров, указываемых в командной строке, использу- емой для пуска программы. Значение этого параметра равно по меньшей мере 1 (свидетельствуя о наличии в командной строке по крайней мере имени программы); однако действительное имя программы не обязательно будет сохранено загрузчиком заданий 15
argument (task loader). Отметим, что хотя идентификатор argc широко применяется в качестве имени этого параметра, вместо argc программист может использовать любое другое имя (См. argv и envp.) argument (аргумент или параметр) Речь идет о любом выражении, передаваемом функции в качестве параметра при ее вызове. Макросы, подобные функции, также могут иметь параметры. Однако при вызове подобного макроса нет необходимости в использовании выражений в качестве фактических параметров; эти параметры воспринимаются просто как набор лексем (token), разделяемых запятыми Параметры функций или макросов мо- гут даже содержать запятые, при условии заключения этих пара- метров в скобки. Отметим, что следует различать фактические и формальные параметры (при этом иногда первые называют аргументами, а вторые — просто параметрами). argument actual (аргумент или параметр фактический) Это факти- ческие параметры, передаваемые функции или макросу при вызове. Например, в записи вида f(a, Ь + с) роль фактических параметров, передаваемых f. играют а и Ь + с. (См argument, formal.) argument, command line (аргумент или параметр командной строки) Один из возможных наборов лексем (token), указываемых в командной строке при пуске программы. По определению, каж- дый параметр командной строки должен отделяться пробелами. Количество и значения параметров командной строки регистри- руются посредством argc и argv соответственно. argument, formal (аргумент или параметр формальный) Формаль- ный параметр определяется при описании функции или макро- са. Например: void flint al, long az) { } #define Add(a, b) (a + b) Здесь at и al — формальные параметры, определяемые при описании функции f; а и Ь — формальные парами ры макроса Add. (См. argument, actual ) argument list (список параметров) Это перечень формальных или фактических параметров, разделяемых запятыми. argument list, variable (список с переменным числом параметров) Это список параметров, содержащий по меньшей мере один параметр и завершаемый многоточием (...). Согласно Стандарту языка Си, единственными функциями, имеющими переменное число параметров, являются функции семейства printf и scanf. (См stdarg h и varargs.h, где дано детальное определение функ- ции, допускающей изменение числа параметров при ее вызове.) Макросы не могут быть определены для случая изменяемого 16
arrow operator числа параметров, и они не могут вызываться с использованием списка с переменным числом параметров. argument promotion, default (выполняемое по умолчанию продвиже- ние параметра по шкале типов) (См. conversion, function arguments.) argv Второй параметр (аргумент), передаваемый функции mair Это массив указателей на данные типа char, причем каждый элемент массива является указателем на строку символов, являющуюся элементом (параметром) командной строки. Количество элемен- тов массива равно argc+f, при этом значением argv[»rgc] является NULL. Если имя программы отсутствует, argv[O] указывает на пустой символ (null character). Отметим, что различные загруз- чики/компиляторы могут по-разному обращаться с параметрами в кавычках или со включенными в них (в параметры) пробелами. Отметим также, что, хотя идентификатор argv широко применя- ется в качестве имени рассматриваемого параметра, вместо argv программист может использовать любое другое имя. (См argc и envp.j arithmetic conversions, usual (типовые арифметические преобразо- вания) (См. conversion, usual arithmetic.) arithmetic type (арифметический, или числовой тип данных) Это один из типов целых или вещественных чисел. array (массив) Это составные (агрегатироваиные) данные, включа- ющие в себя один или несколько элементов, каждый из которых имеет одни и те же атрибуты (характери стики) и размещается в очередной (из следующих по порядку) области памяти. Язык Си не накладывает ограничений на размерность (число измерений) массива однако на практике обычно допускается использование массивов, размерность которых не превышает 12. Максимум значения размерности массива определяет макрос ULONG_MAX По каждому измерению нумерация элементов начинается с нуля. При описании массива, а также при использовании его отдель- ных элементов отсчет (индекс) по каждому измерению указыва- ется отдельно (в прямоугольных скобках). array, zero-sized (массив нулевого размера) До появления Стандар- та языка Си только незначительное число систем программиро- вания на языке Си допускали использование массивов, число элементов которых равно нулю. Типовым применением подобно- го массива является его использование в качестве последнего члена структуры. Хотя стандарт языка Си не позволяет приме- нять массив с нулевым размером, предоставляется возможность выделять память для массивов нулевого размера посредством calloc и malloc. arrow operator (знак операции —>) Этот знак двухместной опера- ции применяется для «выбора» элемента, задаваемого правым операндом, из структуры или объединения (множества), на ко- торую указывает левый операнд. Порядок вычисления значений операндов не задан. В качестве левого операнда должен быть указатель на структуру или объединение; в качестве правого 17
«as if» rule ont ранда — член (элемент) структуры или объединения. Эта оп< рация «порождает.» именующее выражение (lvalue). Выраже- ние, содержащее знак —>, всегда можно заменить эквивалент- ным выражением, использу ющим в качестве знака точку. На- пример р—>гг эквиваленч но [*р) m. Тип результата рассматриваемой операции — это тип «выбираемого» члена структуры или объединения. Операция ассоциативна справа. «as if» rule (правило «как если бы») Стандарт языка Си позволяет прикладным проз раммам всегда использогать в полной мере возможности среды функционирования без необходимости вы- полнять неэффективные операции. Например, стандарт избав- ляет программиста от традиционного требования выполнять всю арифметику данных типа char с точностью, установленной для данных типа inf. Стандарт языка Си позволяет выполнять опти- мизацию и операции так, как это «удобно» программе при условии, что достигается такой же результат, как если бы («as if») соблюдались строгие правила абстрактной машины, для которой и был определен Стандарт. Говоря иначе, если неч приводящих к нсидентичным результатам различий между выполнением оптимизации и отказа от нее, оптимизация допускается. ASCII Акроним (аббревиатура) для American Standard Code for Information Interchange I Американский Стандартный Код для Обмена Информацией). Этот широко используемый 7-битовый код допускает представление 128 различных символов. Стандарт языка Си не «привязан» к определенному набору символов. (См EBCDIC, isascii, isc-frl и toasci.) asctime Эта функция преобразует в строку символов календарное время (так называемое broken-down time), хранимое в структуре, на которую указывает timepfr. #indude <fime.h> char «ascfimetconst struct tm » timepfr); Адрес, являющийся значением, которое возвращает данная функция, указывает на строку симве ив содержащую время в формате Day Mon < Id hh:mm:ss yyyy\n\O. На >ту функцию не вли- яют изменения, имеющие место в текущей «культурной среде» (locale). Для задания времени в определенной «культурной сре- де» следует использовать sfrffime. (Префикс asc указывает на применение ASCH, и его наличие носит исключительно истори- ческий характер, поскольку Стандарт языка Си не «связан » с определенным набором применяемых символов.) вsin Эта ф дикция вычисляет значение арксинуса для заданного аргумента х: возвращаемое значение измеряется в радианах и принадлежит диапазону Нч/2,+тг/2]. #include <mafh.h> dout le asin(double x); 18
assignment Если аргумент (фактический параметр, передаваемый функ- ции) вне диапазона значений [—1,И], имеет место ошибка (вы- ход за диапазон допустимых значений). aslnf Эта дополнительная функция (опция) является разновидно- стью функции asin, оперирующей данными типа float Она при- надлежит к нововведениям Стандарта языка Си. aslnl Эта дополнительная функция (опция) является разновидно- стью функции asm, оперирующей данными типа long double. Опа принадлежит к нововведениям Стандарта языка Си. asm Многие компиляторы допускают включение команд ассембле- ра в текст программы на языке Си. Типовым решением этой задачи является использование ключевого слова asm или дирек- тивы препроцессора типа #asm с соответствующей директивой #endasm. Все эти решения выходят за рамки Стандарта языка Си. asm является также ключевым словом языка Си++. Если Вы планируете использовать программу на языке Си в среде Си++, целесообразно отказаться от применения asm в качестве иденти- фикатора программы. assert Этот макрос направляет диагностическое сообщение в поток stderr, а затем инициирует вызов abort при условии, что значени- ем аргумента макроса является «ложно» и при этом макрос NDEBUG не определен. ^include <assert.h> void asserf(int exp); Если пользователь определил NDEBUG перед включением assert.h макрос assert определен как выражение типа void, и все обраще- ния к assert становятся бессмысленными. Формат выводимого сообщения зависит от конкретной реализации системы про- граммирования в среде языка Си Однако типовым является решение, при котором сообщение включает аргумент (пара- метр) макроса в форме текста, а также имя файла с текстом программы и номер строки, в которой имел место безуспешный вызов assert. Поведение макроса непредсказуемо, если используется #undef assert в попытке получить версию функции assert.h Этот объект-заголовок (header file) предоставляет сравни- тельно грубые средства отладки с трассировкой. Это единствен- ный объект-заголовок, поведение которого меняется от включе- ния к включению. (См. assert.) Объект-заголовок assert.h содержит определение следующего идентификатора: assert Put diagnostic assertion in code assignment (присваивание) Речь идет об операции присваивания значения некоторого выражения области памяти, задаваемой другим выражением (роль которого обычно выполняет имя пе- ременной или выражение вида a[i], *ptr, р—>m или s.m). Выраже- 19
assignment compatibility яие, обозначающее «приемник» присваиваемого значения, дол- жно быть именук щим выражением (lvalue). Поскольку выраже- ние присваивания имеет тип и значение резул ьтата, го оно может быть включено в другое большее выражение. (См. assignment operator, compound; assign iwit operate’ simple assignment compatibility (совместимость присваивания] Прежде чем компилятор подтвердит присвоение значения некоторого выражения именующему выражению (модифицируемое lvalue), задаваемому др у гим выражением, необходимо достигнуть совме- стимости типов этих выражений. Совместимость присваивания применяется не только в контекстах, исполняющих присваива- ние. Например, с перации сравнения и проверки тождественно- сти такж< требуют совместимости типов операндов. Аналогично этому, необходима совместимость типов формальных и фактиче- ских параметров в механизме вызова функций. Все ариф мети- ческие типы между собой совместимы, перечисляемые типы данных совместимы с целочисленными типами. Указатель типа void совместим с указателем любого другого типа. Модификаторы void и volatile не оказывают влияния на совместимость. Если сопоставляются два несовместимых типа выдается диагностиче- ское сообщение; например, это имеет место при сравнении указателя с целым числом, ие равным нулю, или при передаче в качестве параметра целого числа вместо структуры. assignment operator, compound (знак составной операции «присваи- вание») Речг ид~т об обобщенной форме двухместной операции присваивания х знак= у эквивалентно х = х З"ак у. (Разница между двумя формами записи составной операции присваива- ния в том, что в первом случае значение х определяется только один раз!) Полный иаб< р знаков составной опер щии присваи- вания: +=, —<=, *= /=, %=, >>=, <<=, &=. '=, |=. (См. assignment operator, compound, archaic; assignment operator simple.) assignment operator, compound, archaic (знак составной операции «присваивание», устаревший) Архаичная форма (=знак) запи- си знака составной операции присваивания уже давно заменена формой вида знак= и больше не является элементом Стандарта языка Си Отменим, что использование архаичной формы в теките, компилируемом в режиме Стандарта языка Си, ие при- ведет к желаемым результатам Например, в обоих случаях а = + Ь а = — Ь выполняется простая операция присваивания, а знаки + и — воспринимаются как знаки одноместной операции вида знак операнд assignment operator, simple (знак простой операции «присваива- ние») Это знак =, используемый в двухместной операции при- сваивания. при которой значение операнда справа от знака помещается в области памяти, на которую указывает операнд, расположенный слева от этого знака. Порядок определения зна- 20
atan2f чений операндов не указан. Левый операнд должен быть моди- фицируемым именующим выражением (См. assignment operator compound.) Следует отличать знак простой операции присваива- ния (=) от знака тождества (=) их семантика различна. Напри- мер, в следующем фрагменте if (а = На- значение Ь присваивается а; после этого проверяется «истин- ность» значения а. Однако во фрагменте if (а — Ь)„. осуществляется проверка тождественности а и Ь. associativity (ассоциативность) Таблица приоритетов действия зна- ков операций определяет место каждому из них в иерархии очередности выполнения соответствующих операций в тексте программы на языке Си. Относительный приоритет для знаков операций, занимающих одну и ту же позицию в указанной таблице, определяется направлением ассоциативности обработ- ки операндов выражения: слева направо или справа налево. Например, а/Ь/с эквивалентно (а/Ь)/с потому.что операция де- ления ассоциативна слева. С другой стороны выражение !++i эквивалентно выражению (1(+ Н)). поскольку данные одномест- ные операции ассоциативны справа. atan Эта функция вычисляет арктангенс своего аргумента х. #indude <math.h> double a*an(double x); Возвращаемое значение, измеряемое в радианах, принадлежит диапазону (—я/2,+я/2). atari Эта дополнительная функция (опция), оперирующая данными типа float является разновидностью функции afar Она принад- лежит к нововведениям Стандарта языка Си atanl Эта дополнительная функция (опция), оперирующая данными типа long double, является разновидностью функции atan. Она принадлежит к нововведениям Стандарта языка Си. atanZ Эта функция вычисляет арктангенс у/х и возвращает значе- ние (в радианах), принадлежащее диапазону [-я.+л:]. #indude <math.h> double atan2(double у, double x); Если оба аргумента равны нулю, имеет место ошибка выхода за пределы области определения. Знаки обоих аргументов исполь- зуются для определения квадранта местоположения вычисляе- мого (возвращаемого) значения. atanZf Эта дополнительная функция (опция), оперирующая данны- ми типа float, является разновидностью функции atan2. Она принадлежит к нововведениям Стандарта языка Си. 21
afan2) atan21 Эта дополнительная функция (опция), оперирующая данны- ми типа long double является разновидностью функции atan2. Она принадлежит к нововведениям Стандарта языка Си. atexlt Эта функция позволяет зарегистрировать требуемую функ- цию таким образом, что последняя будет вызываться автомати- чески средой трансляции Си-программ при нормальном завер- шении программы. #incude <stdlib.h> mt atexit(void (*func)(void)); Регистрируемая функция не должна иметь аргументов и не должна возвращать какое-либо значение. Стандарт языка Си требует возможности регистрации по меньшей мере 32 функ- ций. (Для того, чтобы собойти» возможные ограничения числа регистрируемых функций, можно зарегистрированную функ- цию использовать для прямого вызова других функций. В этом случае такие функции могут иметь список параметров и возвра- щаемое значение.) Одну и ту же функцию можно регистриро- вать более одного раза. Если регистрацию выполнить не удается, возвращаемое значение отлично от нуля; при успешной регист- рации оно равно нулю. (См. onexit.) atof Эта функция преобразует ведущую часть строки символов, на которую указывает nptr. в значение типа double. #include <sfdlib.h> double atof(const char •npfr); Обращение к atof аналогично strtod(nptr, (char **)NULL) за исключением того, что sfrfod может обрабатывать ошибки. Отметим, что формат допустимого значения числа с плавающей точкой в качестве входного параметра определяется так называ- емой «культурной средой» (locale). Функция strtod имеет пре- имущества перед перед функцией atof. поскольку первая предо- ставляет большие возможности по управлению процессом преобразования, а также обнаружению и обработке ошибок. atoi Эта функция преобразует ведущую часть строки символов, на которую указывает nptr. в значение типа mt. #include <stdlib.h> int atoi(const char »nptr); Обращение к atoi аналогично (int) strtol(nptr, (char »»)NULL, 10) за исключением того, что strtol может обрабатывать ошибки. Функция strfol имеет преимущества перед функцией atoi, по- скольку первая предоставляет большие возможности по управ- 22
backslash escape sequence лению процессом преобразования, а также по обнаружению и обработке ошибок. atol Эта функция преобразует ведущую часть строки символов, на которую указывает, nptr, в значение типа long inf. #indude <sfdlib.h> long in* afolfconst char *nptr); Обращение к atol аналогично sfrfol(nptr, (char ♦*)NULL, 10) за исключением того, что sfrfol может обрабатывать ошибки. Функция strtol имеет преимущества перед функцией atol, по- скольку первая предоставляет большие возможности по управ лению преобразованием, а также по обнаружению и обработке ошибок. auto Это ключевое слово, идентифицирующее принадлежность объ- екта к определенному классу памяти (storage class), применяется для описания объекта внутри определенной функции с целью указания на его так называемую автоматическую продолжитель- ность хранения (automatic storage duration). Если подобное опре- деление объекта дано без использования ключевого слова auto, присутствие последнего подразумевается. (По этой причине это ключевое слово редко применяется, и в его присутствии нет никакой необходимости.) Формальные параметры, задаваемые при описании функции, «ведут себя» так, как будто бы они были определены с использованием ключевого слова auto (если они не были явно определены посредством ключевого слова register). Однако в действительности при описании формальных парамет- ров использование ключевого слова auto недопустимо. automatic storage duration (продолжительность хранения данных ти- па auto) (См storage duration, automatic.) В backslash (наклонная черта влево) Этот символ используется как ведущий при формировании управляющей последовательности (escape sequence) в строковых литералах (string literals) и сим- вольных константах. Например, \f — переход к новой странице, \п — переход к новой строке. (См. backslash escape sequence, backslash/new-line sequence.) backslash escape sequence (управляющая последовательность для представления наклонной черты влево) Символ «наклонная черта влево» (\) может использоваться в строковом литерале или символьной константе путем его размещения вслед за ведущим 23
backslash/new-line sequence символом управляющей последовательности, т. е. после наклон- ной косой черты, а именно: \\. backslash/new-line sequence {наклонная черта влево с последующим переходом к новой строке) Предполагается, что если строка ис- ходного теста программного модуля на языке Си завершается символом «наклонная черта влево», то текст продолжается на следующей строке. Традиционно эта возможность реализовыва- лась только для длинных строк макроопределений или длинных строковых литералах. Однако Стандарт языка Си требует предо- ставления такой возможности для любой лексемы (token), кото- рую необходимо «разбивать» при переходе к следующей строке текста программного модуля. Отметим, что между «наклонной чертой влево» н новой строкой не должно быть никаких симво- лов (в гом числе никаких пробелов или комментария). Напри- мер, допустим следующий текст: # \ def\ in\ е WAX \ 10\ 00 in\ t i; который эквивалентен двум строкам текста вида #def>ne МАХ ’ООО int i; (См pnases of translation.) backspace escape sequence (управляющая последовательность воз- врата на один символ) Операция возврата на один символ мо- жет быть представлена управляющей последовательностью вида \Ь base documents (основополагающие документы) Речь идет о доку- ментах. положенных в основу при формировании Стандарта языка Си. В частности, раздел описания языка базируется на книге Dennis М Ritchie «The С Reference Manual» (Руководство го языку Си), вариант которой был опубликован в качестве Приложения А книги Brian W. Kernighan и Dennis М. Ritchie «The С Programming Language» (Программирование на языке Си.) (См. К & R.) Раздел описания библиотек основан на стандарте «The 1984/usr/group Standard», выпушенном комитетом /usr/group Standard Committee (Santa Clara, California, November 14. 1 984). benign redefinition (адекватные переопределения) Макрос, подоб- ный объекту (object-like macro) или функции (function-like macro), может подвергаться многократному переопределению в 24
block процессе одной и той же трансляции (компиляции) при условии, что последовательность лексем в каждом определении точно соответствует последовательности лексем во всех других опреде- лениях. Все последовательности пробелов (white-space charac- ters) воспринимаются как эквивалентные. (См. macro, redefinition of.) binary operator (знак двухместной операции) (См. operator, binary ) binary stream (двоичный поток) (См. stream, binary.) bit-field (поле битов) Это составная часть (член) структуры или объединения, размер которой определяется в битах. Содержи- мым битовых полей могут быть данные типа int signed (целое со знаком) или int unsigned (целое без знака). Конкретная реализация системы программирования языка Си определяет значение ука- зателя типа int для битовых полей (целое со знаком или без знака). Вы не можете «взять» адрес поля битов (а следовательно нельзя получить массив полей битов). Нельзя определить размер поля битов посредством функции sizeof. Стандарт языка Си допускает использование поля битов в качестве элемента объединения. Поля битов — это упакованные элементы памяти, размеры кото- рых определяются реализацией системы программирования на языке Си. Порядок, в котором упаковываются поля битов, и правило выравнивания или отказ от выравнивания на границе памяти определяются конкретной реализацией системы bit-field, plain int (поле битов типа int без модификаторов типа) В общем случае при использовании int для определения типа объ- екта предполагается, что имеет место целое число со знаком. Однако применительно к по'лю битов типа int это не так: если модификатор signed (со знаком) или unsigned (без знака) отсутст- вует, то только от конкретной реализации системы программи- рования на языке Си зависит, что означает использование int без модификатора применительно к полю битов. bitwise operators (знаки операций над битами) Речь идет о знаках & |, ", «, », и block (блок) В определении (описании) функции блок — это часть функции, заключаемая в соответствующую пару фигурных ско- бок (которые следует отличать от подобных пар фигурных ско- бок, используемых при описании списков начальных значений, структу р, объединений или «значений» объектов перечисляемых типов). Блок определяет область действия локально определяе- мых идентификаторов и может применяться для описания обла- сти действия таких команд, как if/dse, while и for. Блоки могут быть вложенными и содержать определения (объектов), за кото- рыми могут следовать команды. Блок принято также называть составной командой (compound statement). Пустой блок ({}) эк- вивалентен «пустой» команде (null statement), которая символи- чески представляется знаком «точка с запятой» (;). Однако пустая команда не может использоваться в качестве тела функции без команд. 25
braces braces (фигурные скобки) Открывающая и закрывающая фигур- ные скобки используются в качестве границ составной команды (блока), списка начальных значений, структуры, "бъе?мнения или определения «значений» объектов перечисляемого типа. Фигурные скобки всегда используются попарно, дополняя друг друга [открывающая и закрывающая!. Исклю гение составляют случаи их включения в состав строковых литера лов или форми- рования символьной константы. break Эта команда вызывает завершение выполнения текущего внутреннего (самого глубокого из числа вложенных) цикла while, for или do, либо коман да выбора swiich. Ни в каких других конструкциях языка команда break не применима. При ее выпол- нении управление передается команде, которая следует непо- средственно за той выполнение которой прекращает команда break Команда break несколько отличается от команды continue. Команда break позволяет прервать выполнение только на теку- щем уровне и "подняты я» на один уровень выше. Для перехода на несколько уровней сразу используется команда goto Приме- нение команды break: break; broken-down time (календарное время, расчлененное на компонен- ты) Речь идет о календарном времени, являющемся значением объекта типа struct tm, который определен в time.h. bsearch Эта функция выполняет поиск в массиве объектов nmemb, первый элемент которого адресуется указателем base. Осущест- вляется поиск объекта, эт.вив^лентного объекту, на который указывает key. #indude <stdlib.h> void *bsearch(const void «key, const void «base, size.t nmemb, size_t size, int ( *compar)(const void ♦, const void »)), Здесь size означает размер каждого объекта (элемента) массива. Предполагается, что элементы массива упорядочены по возра- станию значения параметра используемого функцией сравне- ния, на которую указывает сотраг. Эта функция (cornpar) получа ет два параметра, первый из которых указывает на « ключевой» (key) объект, а второй — на элемент массива. В зависимости от результата сравнения, значение, возвращаемое функции срав- нения (сотраг), Меньше нуля, равно пулю или больше нуля соответственно. Если поиск не обнаружил соответств} юшею объекта, возвращаемым значением функции bsea-ch является NULL; в противном случае возвращаемое значение — указатель на искомый объект. Ес? и два объекта удовлетворяют критерию поиска, то нельзя предсказать, какой из них будет выбран про- цедурой поиска. BUFSIZ Этот макрос, определяемый в stdio.h. является целочислен- ным константным выражением и задает размер буфера, исполь- 26
Cdlloc зуемого функцией sefbuf. Стандарт языка Си требует, чтобы это значение было не меньше, чем 256 с "С” locale («культурная среда» языка Си) По умолчанию предпола- гается, что программа, написанная на языке Си, выполняется в «культурной среде» языке Си. Это справедливо при условии, что не было выполнено обращение к функции setlocale (или конкрет- ная реализация системы программирования на языке Си по умолчанию настроена на среду, отличную от "С" locale). Реали- зация системы программирования на языке Си согласно Стан- дарту языка Си должна поддерживать по меньшей мере одну «культурную среду», а именно "С”. На практике "С" locale означает возможность выполнять программы в режиме «U.S.- English». Этот режим хорошо знаком пользователям библиотеч- ными функциями. Так, например, printf использует десятичную точку для отделения дробной части числа от целой; текущие дата и время представлены в формате, соответствующем стилю «U.S.», а значение функции isalpha равно «истинно» только для строчных и прописных латинских (Roman) букв. (См. locale- specific behaviour ) С Standard (Стандарт языка Си) Это формальное определение язы- ка программирования Си. Стандарт, полное наименование ко- торого ANSI С Standard, имеет обозначение ANSI ХЗ.159-1989. Первый проект аналогичного стандарта ISO. полное наименова- ние которого ISO С Standard, обозначается ISO/IEC: 9899- 1989(E). Это эквивалент стандарта ANSI С Standard. (См. ISO С, WG14 и X3J11.) C++ programming language (язык программирования Си++) Перво- начально именуемый как «язык Си с классами», этот язык был разработан Bjarne Stroustrup в Bell Laboratories корпорации AT&T, т. е. там, где были разработаны операционная система UNIX и язык Си. Язык программирования Си++ (C++) исполь- зуется как инструмент объектно-ориентированного программи- рования. За исключением небольшого числа средств язык Си++ можно рассматривать как супермножество (superset) Стандарта языка Си. (См. identifier conficts with C++ и X3J16.) calloc Эта функция динамически выделяет область памяти для объектов nmemb, размер каждого из которых равен size (в байтах). #indude <s‘dlib.h> void *calloc(size_t nmemb, size_t size); Выделяемая память инициализируется двоичными нулями. От- метим, что при этом не гарантируется такое же представление 27
carriage-return escape sequence данных, как это имеет место для нулевых значений веществен- ных чисел (floating-point zero) или NULL. Значение возвращае- мое функцией, имеет тип void * и, следовательно, является совме- стимым по операции присваивания (assignment-compatible) с указателями любого типа. По этой причине не требуется явного задания приведения типов (no explicit cast). Это значение явля- ется адресом первого байта выделения памяти, при этом гаран- тируется соответствующее выравнивание на границу адресного пространства так. чтобы можно было разместить любой объект, для которого выделяется память. Если не удается выделить па- мять, то возвращаемым значением является NUd_. Если параметр size равен нулю, то от конкретной реализации системы программирования зависит, будет ли возвращаемым значением NULL или некоторый уникальный указатель. (См. free, malloc и realloc.) carriage-return escape sequence (управляющая последовательность «возврат каретки») «Возврат каретки» может быть представлен управляющей последовательностью вида \г. Этот символ приме- няется сравнительно редко. Например, в системах, где записи завершаются парой символов «возврат каретки»/«перевод стро- ки» (carnage return/line-feed). при выполнении операций ввода и вывода такая пара преобразуется в управляющую последова- тельность «новая строка» (new-line escape sequence). По этой причине явно приходится иметь дело с «возвратом каретки» только в тех случаях, когда текстовый файл, содержащий указан- ные пары, открыт как двоичный (binary mode). (См. fopen.) case Это ключевое слово используется только в контексте команды switch для задания значения метки переключателя (См. label, case.) case conversion (преобразование представления символа с учетом регистра) (См tolower и toupper | case label (метка выбора в команде switch) (См. label, case.) case ranges (диапазон значений метки переключателя) Стандарт языка Си не допускает задание диапазона значений метки пере- ключателя в команде выбора (ease). Однако некоторые реализа- ции системы программирования предоставляют такую возмож- ность как расширение средств, используя для этой цели форму представления значений метки в виде case 3..6: case sensitivity («чувствительность» к состоянию регистра) Язык Си относится к языкам программирования, которые «чувстви- тельны» к состоянию регистра (верхний и нижний), т. е. иден- тификаторы ABC, abc, аЬс и АЬС воспринимаются как отличаю- щиеся друг от друга. Однако для конкретной реализации системы программирования допустимо игнорирование состоя- ния регистра по отношению к внешним именам (т. е. к функци- ям и переменным с модификатором extern), поскольку многие компоновщики (linker), библиотекари (librarian) и трансляторы с языка ассемблера (assembler) нечувствительны к состоянию 28
cded регистра. Ключевые слова языка Си необходимо писать пропис- ными (lowercase) буквами для их правильной идентификации cast operator (знак операции «приведение типа») Одноместная опе- рация приведения типа использует круглые скобки в качестве знака операции: ( тип ) выр Здесь значение выражения (выр) преобразуется в значение ука- занного типа (тип). Операнд должен быть данным скалярного типа, исключая случай применения типа void, если в качестве типа приведения задан void. (Отметим, что в качестве выраже- ния можно использовать обозначение массива или функции, поскольку такое выражение предварительно будет преобразова- но в соответствук щий указатель.) Допустимо использование уточнителей (спецификаторов) типов применительно к «типу» в операции приведения типов. Результат операции приведения типов не является именующим выражением, хотя в некоторых конкретных системах программирования это реализовано. casting (операция «приведение типа») Эта операпия выполняет преобразование выражения заданного типа в выражение требу- емого типа. Приведение типа некоторого выражения к типу void означает отказ от значения заданного выражения. (См. cast operator.) catch Это ключевое слово языка Си++ не входит в состав ключевых слов Стандарта языка Си. Если Вы планируете использование Вашей программы на языке Си в среде Си++, следует отказаться от применения catch в качестве идентификатора. _cdecl Стандарт языка Си требуёт. чтобы ключевые слова расши- рения начинались со знака подчеркивания (underscore). Начи- ная с версии 6.0, фирма Microsoft дополнила набор средств программирования ключевым словом _cded в качестве синонима cded Ожидается, что _cded станет широко используемым ключе- вым словом в системе программирования на языке Си в среде MS-DOS. cded Это нестандартное ключевое слово широко используется при программировании на языке Си в среде MS-DOS. Оно приме- няется для указания на использование Си-метода межпропедур- ной связи идентификаторов (the С method of inter-procedural linkage). Это оказывает влияние на то, из каких символов состав- ляются внешние имена в сгенерированном коде программы (к ним могут быть добавлены в качестве ведущих символов знаки подчеркивания или. например, возможен перевод символов из строчных в прописные). Это также предписывает вызывающему модулю выполнение очистки стека после возврата управления из вызываемого модуля. Пример применения cded. void cded fp(int a, long b) < > 29
ceil inf caecl tabie[100); main() { void cded fp(int a long b); } Поскольку этот режим в общем случае действует по умолчанию, задание его явным образом не является нормой. Однако если опция компилятора задает другой режим для всей единицы компиляции, специфические внешние идентификаторы можно принудить к использованию Си-метода путем применения клю- чевого слова cded. (См. также _cded. fortran и pascal ) ceil Эта функция вычисляет наименьшую целую часть, которая не меньше, чем аргумент х. #indude <math.h> double ceil(doub!e x); Значение, возвращаемое функцией в качестве результата, явля- ется данным типа double. ceilf Эта дополнительная функция (опция), возвращающая резуль- тат типа float, является разновидностью функции ceil. Она при- надлежит к нововведениям Стандарта языка Си ceill Эта дополнительная функция (опция), возвращающая резуль- тат типа long double, является разновидностью функции ceil. Она принадлежит к нововведениям Стандарта языка Си. char Ключевое слово для указания целочисленного типа. Область памяти, выделяемая д\я данных этого типа, вполне достаточна для размещения любого символа из типового набора символов. Стандарт языка Си требует, чтобы размер указанной области был не менее восьми битов. Установилась традиция расширять эту область до размера области, предоставляемой для размеще- ния данных типа int, когда данные типа char применяются в выражениях в качестве аргументов функций. Однако Стандарт языка Си разрешает использовать данные типа char без выпол- нения упомянутого расширения. (См. char, plain; conversion, function arguments.) char, plain (char, plain без модификаторов типа) Речь идет о приме- нении типа char без его дополнения модификаторами signed или unsigned Только от конкретной реализации системы программи- рования зависит, являются ли данные типа char (без модифика- торов типа) целочисленными значениями со знаком (signed) или без знака (unsigned). CHAR BIT Этот макрос, определяемый в limits.h, содержит инфор- мацию о количестве битов, формирующих данное типа char. (Стандарт языка Си требует, чтобы эта величина была не мень- ше, чем восемь битов.) Значение, определяемое этим макросом. 30
character string literal расширяется до целочисленной константы соответствующих раз- меров при использовании макроса в директиве #if. CHAR МАХ Этот макрос, определяемый в limits.h, содержит инфор- мацию о максимальном значении объекта типа char. (Для подоб- ных объектов с подразумеваемыми по умолчанию, т. е. не ука- зываемыми явно, модификаторами signed или unsigned имеются соответствующие макросы SCHAR_MAX и UCrlAR_MAX.) Это отно- сится к нововведениям Стандарта языка Си. Значение, опреде- ляемое этим макросом, расширяется до целочисленной констан- ты соответствующих размеров при использовании макроса в директиве #if. CHAR_MIN Этот макрос, определяемый в limits.h, содержит инфор- мацию о минимальном значении объекта типа char. (Для подо- бных объектов с подразумеваемыми по умолчанию, т. е. не указываемыми явно, модификаторами signed имеется макрос SCHAR_MIN; в противном случае минимальное значение равно нулю.) Это относится к нововведениям Стандарта языка Си. Значение, определяемое этим макросом, расширяется до цело- численной константы соответствующего размера при использо- вании макроса в директиве #if. character (символ) Символ можно определить формально как после- довательность битов в пределах одного байта. Любой символ из набора символов, применяемых при написании текста програм- мы на языке Си, может быть представлен последовательностью битов длиной не более одного байта. (См. character, wide.) character, multibyte (многобайтовый символ) (См. multibyte charac- ter.) character, pushback (символ, возвращаемый в поток) (См. ungetc.) character wide (символ расширенной формы) Стандарт языка Си вводит минимальную поддержку для больших наборов символов при работе со строковыми литералами, символьными констан- тами и комментариями; кроме того, в stdlib.h Стандарт определяет несколько функций для конвертирования однобайтового пред- ставления объектов в многобайтовое представление и обратно. С имвол расширенной формы — это символ, кодируемый опре- деленным образом, в результате чего образуется объект некото- рого целочисленного типа. Стандарт языка Си определяет это тип как wchar_t в stddef b и stdlib h. Не следует смешивать два различ- ных понятия: символ расширенной формы (wide character) и многобайтовый символ (multibyte character). character constant (символьная константа) (См constant, character.) character handling header (объект-заголовок, манипулирующий сим- волами) (См. ctype.h.) character I/O functions (функции ввода/вывода символов) Речь идет о следующих функциях, определяемых в stdio.h: fgefc, fgets, fputc, (puts. getc. gefchar, gets. pu*c, putchar, pu*s, ungetc character string literal (строковый литерал) (См. string literal.) 31
character testing functions character testing functions (функции тестирования символов) Это семейство функций, имена которых имеют вид is* (где is — первые две буквы имени Функции); функции объявляюхся в cfype h. class Термин «класс» используется в объектно-ориентированном программировании, он является также ключевым словом языка Си++ Это ключевое слово не входит в состав средств Стенде рта языка Си. Если Вы планируете использовать программу, напи- санную на языке Си, в среде Си++, целесообразно отказе гься от применения термина class в качестве идентификат эра. Не следует смешивать понятие «класс памяти» (class storage) используемое в языке Си с понятием класса в языке Си++. class, storage (класс памяти) (См. storage class.) clearerr Эта функция «сбрасывает» (очищает) индикаторы достиже ния конца файла и обнар ужения сшибки для файла, на который указывает поток [stream) #indude <stdro h> rc.d clearerr(FILE «stream); CLK TCK Этот макрос был составной частью нескольких версий проекта ANSI С, однако позже был переименовав в CLOCKS_PER_SEC. clock Эта функция определяет, сколько процессорного времени использовано с начала «эры» действия данной прикладной про- граммы. #:ndude <time h> clock_t dock(void); Под «эрой» здесь следует понимать тот весьма приближенно определяемый момент времени, с которого началось выполне- ние программы Речь идет о намерении оценить интервал вре- мени работы процессора с момента пуска программы до момен- та вызова функции dock. Значение, возвращаемое этой функцией, является значением данного типа crock _t, единицы измерения которого определяются конкретной pt ализацией системы программирования Однако, согласно определению, если это значение разделено на CLOCK_PER_SEC, результат измеряется в секундах. Если про- пессорное время определить не удается чли оно не может быть представлено в форме данных типа, который задан для возвра- щаемого значения, то последнее есть (dock_t)(—1) clock_t Это тип данных, определяемый в time.h, является арифмети- Ч' эким типом, который зависит от конкретной реализации сис- темы программирования и необязательно является целочислен- ным типом, хотя и должен обеспечивать адекватное представление времени. Этот тип относится к нововведениям Стандарта языка Си. (См. dock и CLOCKS_PER_SEC ) 32
command line CI.OCKS_PER SEC Определяемый в time.h, этот макрос задает число интервалов dock_t в секунду. 11апример, если dock_t измеряется в миллисекундах, то CLOCKS_PER_SEC равен 1000. Данный макрос относится к нововведениям Стандарта языка Си и заменяет CLK.-TCK. colon (двоеточие) Знак, размещаемый после ключевых слов case и default в команде выбора (switch), а также после меток (label/, являющихся объектами, определяющими выполнение команды goto. Двоеточие предшествует заданию ширины полей битов. Двоеточие также является составной частью условного выраже- ния. (См. conditional operator ) comma operator (запятая как знак операции) Используемая в каче- стве знака двухместной операции (вычисление составного выра- жения), запятая делает эту операцию ассоциативной слева. Так, например, при вычислении выр!, выр2 значение выр! определяется, а затем «отбрасывается» (исключа- ется из рассмотрения). После этого вычисляется значение выр2; тип и значение последнего выражения определяет тип и значе- ние всего составного выражения. В месте расположения запятой находится так называемая точка следования (sequence point). Операция, в которой роль знака операции играет запятая, ассо- циативна слева. (Исключая применение в первом и третьем выражениях команды for, запятая как знак операции, как прави- ло, используется только в макроопределениях.) Если запятая как знак операции встречается в общем контексте с запятой как знаком пунктуации, между этими двумя знаками следует прово- дить разграничение. Например, д(а. Ь, с,); h((a, Ь), с); приводит к вызову функции g с передачей трех параметров и вызову функции К получающей только два параметра (как об этом свидетельствуют группирующие круглые скобки). Вторая запятая в обращении к функции h является знаком пунктуации, разделяющем два аргумента этой функции. comma punctuator (запятая как знак пунктуации) Речь идет об ис- пользовании запятой в качестве разделителя параметров функ- ции, деклараторов (declarator) в определениях (declaration), вы- ражений в списке начальных значений (initializer list) и т. п. command line (командная строка) Командная строка формируется из списка параметров, указываемых при пуске программы из среды операционной системы. Эти фактические параметры становятся доступными функции m»in посредством ее формальных парамет- ров argc и argv. О наличии процессора командной строки можно удостовериться используя библиотечную функцию system 2 Заказ 677 33
comment comment (комментарий) Текст комментария ограничивается слева и справа знаками /* и */ соответственно. В процессе трансляции исходного текста программы, написанной на языке Си, каждый обнаруженный комментарий заменяется одним пробелом. Сле- довательно, текст комментария можно размещать везде, где до пустимо появление пробела (например, между двумя любыми смежными лексемами). Так, фрагмент программы /* */ а /♦ */ = /* */ Ь /♦ */ ; /* •/ а = Ь; содержит две идентичные последовательности лексем, однако вторую из них значительно легче прочесть. Стандарт языка Си не предусматривает возможности вложения комментариев, хотя некоторые конкретные системы программирования на «нестан дартном» языке Си допускают это. Чтобы сделать недействую- щим (отключить) некоторый блок, содержащий комментарий, можно воспользоваться приемом, подобным следующему. #if О а = Ь + с; /». */ ttendif Рассмотрим еще один фрагмент: int i = 20, j, *pi = &i; j — ‘00/*pi; На первый взгляд кажется, что 1 00 делится на целочисленное (int) значение, адресуемое указателем р'. Однако при трансляции в процессе выявления лексем (token) символы /» идентифици руются как начало строки комментария (что вовсе не предпола- галось). Для решения этой проблемы последнее выражение мо- жет быть заменено на 100/(*pi) или 100/ *pi common extensions (общепринятые расширения) Речь идет о широ- ко распространенной, однако не повсеместно используемой но тации. В ее состав могут входить ключевые слова (такие, как fortran), имена директив препроцессора (например, #module) или библиотечных функций (как open и dose). Тенденция к исполь- зованию одного и того же имени envp или символа $ в иденти- фикаторах — еще один пример распространения общепринятых расширений. common warnings (общепринятые предупреждающие сообщения) Система программирования может выдавать предупреждающие сообщения, чтобы помочь программисту локализовать источник несинтаксических проблем. Однако наличие таких предупреж- дений в наборе средств системы не является требованием Стан дарта языка Си. Примеры подобных сообщений: «а statement can never be reached» (команда никогда не получит управление); 34
composite type «a function is called without a prototype in scope» (функция вызывается при отсутствии прототипа в области ее дейст- вия); «ап unrecognized pragma was foand» (обнаружена неизвест- ная прагма). Наличие и номенклатура предупреждающих сообщений опреде- ляются конкретной реализацией системы программирования на языке Си и относятся к характеристике качества последней, определяющей ее популярность. comparison functions (функции сравнения) Речь идет об определяе- мых в string, h функциях memcmp. strcmp, strcoll, strncmp и srrxfrm. compatible type (совместимый тип) (См. type, compatible.) compiler (компилятор) Повсеместно используемый термин «компи- лятор» в данном контексте обозначает транслятор с языка Си и включает в это понятие такие средства, как интерпретаторы и пошаговые трансляторы. complement operator (знак операции «дополнение») Посредством знака ~ формируется одноместная операция побитового допол- нения операнда до единицы (bitwise one's-complement). Операнд должен быть данным целочисленного типа. Операнд допускает выполнение обычных арифметических операций преобразова- ния типа, в результате чего формируется данное, тип которого йродвинут (promoted) по шкале типов. Операция дополнения ассоциативна справа. complex arithmetic Речь идет об арифметике комплексных чисел, т. е. объектов, каждый из которых имеет вещественную и мни- мую части. Файл maih.h нередко расширяется путем включения функций и макросов, обеспечивающих обработку комплексных чисел. Поддержка арифметики комплексных чисел не преду- смотрена в Стандарте языка Си. и поэтому эта проблема вклю- чена в перечень задач рабочей группы NCEG. compliance (степень соответствия) Речь идет о степени соответствия конкретной реализации системы формальным требованиям, та- ким, например, как определения Стандарта языка Си. Хотя степень соответствия очень легко декларируется, только верифи- кация объявляемых характеристик посредством набора нормати- вов, имеющих схему закона, может дать оценку адекватности. Национальный Институт Науки и Техники (National Institute of Science and Technology, сокращенно NIST), известный в про- шлом как Национальное Бюро Стандартов (National Bureau of Standards, сокращенно NBS) выбрал нормативы Perennial для ратификации поставок правительственными агентствами США. Между тем Британский Институт Стандартов (British Standards Institute, сокращенно BSI) наряду с несколькими другими орга- низациями, ответственными за Европейские Национальные Стандарты, сделали свой выбор в пользу нормативов Plum Hall. composite type (составной тип) (См. type composite.) 35
compound assignment operator compound assignment operator (знак составной операции «присваи- вание») (См. assignment operator, compound.) compound statement (составная команда) (См. block.) concatenation functions (функции конкатенации или сцепления строк) Это объявляемые в string.h функции strcat и strncat. conditional compilation (компиляция по условию) Выбор для транс- ляции определенных строк исходного текста программы путем оценки на этапе трансляции значения некоторого выражения, составленного из целочисленных констант, определения нали- чия или отсутствия заданных макроопределений или комбина- ции значений указанных выражений и макроопределений. Ком пиляция по условию реализуется посредством директив препроцессора #if, #ifdef #ifndef, #else, #elif и #endif, а также знака операции препроцессора defined. Ветви выбора «истинно» и «ложно» могут содержать любые лексемы языка или директивы препроцессора. Допускается по меныпей мере восемь уровней вложения директив компиляции по условию. Все директивы соответствующего набора должны размещаться в одном и том же файле исходного текста программы. Так, например, для директив #ifdef DEBUG #mclude "debug, h." #endif недопустимо, чтобы объект-заголовок debug.h содержал директи- ву #elif или #eise, принадлежащую внешнему (находящемуся за пределами файла) набору. conditional operator (знак операции «вычисление выражения по ус- ловию») Вычисление выражения по условию можно рассматри- вать как трехместную операцию, где знак вопроса и двоеточие образуют знак этой операции: выр! ? выр2 : вырЗ Результатом вычисления является значение выражения выр2. если выражение выр1 «истинно»; иначе результат равен зна- чению выражения вырЗ. (Вычисляется только одно из двух выражений: выр2 или вырЗ). Тип результата определяется ти- пом вычисляемого выражения (выр2 или вырЗ). Первый опе- ранд [выр!) должен быть скалярного типа. Второй и третий операнды должны быть данными арифметического типа, объ- единениями или структурами совместимых типов: возможным типом этих операндов является void; эти операнды могут быть указателями на данные совместимых типов или один из них может быть указателем, а другой — константой в виде null-ука- зателя; один из операндов может быть указателем на объект или данное незавершенного типа (incomplete type), а другой — указателем на void. Операция вычисления выражения по усло- вию ассоциативна справа. В этом условном выражении в месте расположения знака вопроса находится точка следова- ния (sequence point). 36
constant conforming implementation (Cm. implementation, conforming ) conforming program (программа, соответствующая требованиям Стандарта языка Си) (См. program conforming.) conio.h Этот широко распространенный нестандартный объект-за- головок содержит средства поддержки выполнения разнообраз- ных нестандартных операций ввода/вывода. В набор этих средств входят такие функции, как cgets, cprintf, cputs, cscanf, getch, getche, inp kbhit, outp. const Это ключевое слово используется в качестве спецификатора типа (type qualifier). Оно указывает, что объект, к типу которого «приложено» const, не может быть подвергнут модификации в пределах области действия определения объекта. Такой объект рассматривается как немодифицируемое именующее значение (lvalue). Ключевое слово const заимствовано Стандартом языка Си из Си++. Хотя const является полезным средством разделения данных на группы, предназначенные только для чтения (read- only) и для чтения-записи (read-write), это ключевое слово не гарантирует, что объект действительно физически защищен от записи в область его размещения. Ключевое слово const может также применяться к объектам, входящим в состав определения указателя. Рассмотрим следующие примеры: char «псрпес; char * const cpncc; const char «персе; const char ♦ const cpcc; nepnee — это указатель-неконстанта (non-consf pointer) на символ- неконстанту (non-const char). Используя этот идентификатор, мож- но модифицировать и данное типа char, и указатель на это данное. ерпес — это указатель-константа (const pointer) на символ-некон- стаиту. В этом случае можно менять значение только данного типа char; указатель српсс модификации не подлежит. персе — это указатель-неконстанта на символ-константу (const char). Посредством этого идентификатора можно изменять толь- ко значение указателя; данное типа char модификации не подле- жит. ерсе — это указатель-константа на символ-константу. Здесь ни указатель, ни адресуемое им данное модификации не подлежат. Объявления, содержащие спецификатор const, могут также со- держать спецификатор volatile; эти спецификаторы типа не явля- ются ни взаимосвязанными, пи взаимоисключающими. const-qualtfled type (тип со спецификатором const) Речь идет о типе, специфицируемом посредством добавления cons» к ключевому слову, обозначающему базовый тип. constant (константа) Это один из шести типов лексем (token type) в языке Си. Константа представляет собой значение, которое не 37
constant, character подлежит изменению. Различают следующие типы констант: символ, данные перечисляемого типа, вещественное число, це- лое число, указатель типа null, символ расширенной формы представления (wide character). Строковые литералы (string literals) относятся к своей собственной категории лексем и не рассматриваются как константы. constant, character (символ-константа) Это лексема в форме *х‘, где х — графически воспроизводимый (печатный) символ или управ- ляющая последовательность (escape sequence). По определению, типом символа-константы является int, а не char. Если х — это пос\едовательность символов (например, 'аЬ' или 'abed'), то зна- чение результирующей символ-константы определяется реали- зацией системы программирования. Отметим, что 'х' существен- но отличается от "х", поскольку в последнем случае имеет место массив из двух символов. (См. constant, character, wide.) constant chaiacter, wide (символ-константа расширенной формы) Это константа, обобщенная форма которой имеет вид L'x , где х — последовательность мулътибитовых символов. Такая последова- тельность может включать управляющие последовательности (escape sequence). Данная константа имеет тип wchar_t (который определен в нескольких стандартных объектах-заголовках, вклю- чая stddef.h). Символ-константа расширенной формы относится к нововведениям Стандарта языка Си (См constant, cha acter.) const, enumeration (константа перечисляемого типа) Речь идет о лю- бом идентификаторе, определенном как элемент перечисляемого типа. Например, red, green и blue являются константами перечис- ляемого типа согласно следующему определению: enum color (red, green = 4. blue); Эти константы имеют тип int и принимают значения 0, 4 и 5 соответственно. Константам перечисляемого типа можно явно присваивать начальные значения (инициировать), как это пока- зано в случае green. В результате могут образовываться «дыры» в наборе начальных значений: возможно также дублирование значений. Константы перечисляемого тина разделяют с пере- менными и функциями одно и то же пространство «имен». До определенной степени константы перечисляемого типа могут использоваться вместо простых макросов, подобных объектам. constant, floating (константа с плавающей точкой) Это числовая константа, содержащая значащую часть (мантиссу), за которой может следовать экспоненциальная часть (порядок) и cj ффикс, указывающий на тип. Экспоненциальная часть может иметь знак, ей может предшествовать буква е или Е Суффикс F (или f) указывает, что имеет место тип float; использование суффикса L (или 1) свидетельствует, что имеет место тип long double. (Эти суффиксы относятся к нововведениям Стандарта языка Си.) Если константа вещественного типа не имеет суффикса, то ее тип — double. 38
constrsinf constant, integer (константа целого типа) Эта константа формиру- ется из цифр, однако не имеет ни десятичной точки ни экспо- ненты. Она может иметь префикс, указывающий основание системы счисления, а также суффикс, обозначающий тип кон- станты. Префикс О обозначает восьмеричную систему счисле- ния, а Ох или ОХ указывает, что используется шестнадцатерич- ная система. Отсутствие префикса говорит об использовании десятичной системы счисления. Суффикс L (или I) указывает, что тип константы — long inf: суффикс U (или и) обозначает тип unsigned. Все возможные комбинации L (или I) и U (или и) допустимы. Суффиксы U и и относятся к нововведениям Стан- дарта языка Си. Конкретный тип целочисленной константы зависит от префик- са и суффикса ее представления. Десятичная система без суф- фикса: int. long int, unsigned long mt. Восьмеричная или шестнадца- теричная система без суффикса: int, unsigned int, long inf, unsigned long int. Наличие суффикса u или U: unsigned int. unsigned long int. I (аличие суффикса I или L. long int, unsigned long int. Использование в качестве суффикса обеих букв и или U и I или L: unsigned long int. constant null pointer (null указатель, константа) Речь идет об адрес- ном выражении (pointer expression), значение которого никогда не может быть адресом объекта или функции Оно может быть сформировано из целочисленного константного выражения, имеющего значение 0, или такого же выражения, приведенного к типу void ». Наиболее широко используемым представлением null-указателя как константы является 0, 01 или NULL. constant, type of (тип константы) (См. constant. floating constant, integer). constant expression (константное выражение или выражение-кон- станта) Это выражение, все составные части которого являются константами. Значение константного выражения может быть вычислено уже на этапе трансляции (т. е. до наступления этапа выполнения программы). Различают три вида константных вы- ражений: адресные, арифметические и целочисленные. Послед- ние являются требованием определенных контекстов: например, для задания размеров массивов, начальных значений статиче- ских объектов, меток переключателя (в команде switch), началь- ных значений констант перечисляемого типа. constraint (ограничение) Речь идет о синтаксических и семантиче ских ограничениях, накладываемых на элементы языка, подле- жащие интерпретации. Система программирования должна ди- агностировать нарушения заданных ограничений. Примеры ограничений на применение элементов языка. — знаки [ и ], ( и ), ? и : подлежат использованию попарно, будучи разделенными выражениями; — каждый из операндов деления, умножения и \и деле- ния по модулю должен быть арифметического типа; 39
continue — за каждой лексемой # препроцессорной обработки в списке замен макроса, подобного функции, должен следовать параметр в качестве следующей лексемы препроцессорной обработки в списке замен. continue Эта команда вызывает завершение текущей итерации самого внутреннего из вложенных циклов for, while или do и инициирование новой итерации (если она имеет место). Ни в каком ином контексте эта команда не применима. Она несколько отличается от команды break и имеет следующую форму: continue; control character (управляющий символ) Это элемент набора невос- производимых (непечатаемых) символов, определяемых кон- кретной системой программирования. (См. iscntrl.) conversion (преобразование типа) Речь идет об изменении типа операнда. Например, в данном фрагменте программы double d; int i = 5. । = 4; d = i + (double)j; операнд j явным образом (explicitly) подвергается преобразова- нию его типа из int в double посредством знака операции приве- дения типа, в то время как для операнда i такое преобразование выполняется неявно (implicitly). conversion, array (преобразование массива) Почти всегда выраже- ние. заданное в форме массива, преобразуется в выражение типа «указатель на первый элемент этого массива» Исключени- ями из этого правила являются случаи, когда подобное выраже- ние — это операнд функции sized или одноместной операции & либо это строковый литерал, применяемый для инициализации (задания начальных значений) массива символов или символов расширенной формы. conversion, explicit (явное преобразование типа) Речь идет о приме- нении знака операции приведения для преобразования значе- ния выражения одного типа в эквивалентное значение другого типа. conversion, function (преобразование функции) Почти всегда выра- жение, обозначающее функцию (обращение к одноименному программному модулю), преобразуется в выражение типа «ука- затель на функцию» Исключениями из этого правила являются случаи, когда такое выражение — это операнд функции sizeof или одноместной операции &. (Если f — это функция, то выражение f не преобразуется в функции sizeof(f), и, как следствие, имеет место нарушение ограничений, определяемых как невозмож- ность применения sizeof к функциям.) conversion, function arguments (преобразование параметров функ- ций) При передаче функции фактических параметров по умол- чанию выражения типа signed или unsigned char и short расширя- 40
conversion, usual arithmetic ются до соответствующего представления данных типа int, как это предписывается правилом сохранения значения (value preserving rule). Аналогичным образом параметры типа float расширяются до параметров типа double. Стандарт языка Си разрешает (но не требует) передачу парамет- ров указанных «узких» типов без расширения при условии, что прототип, содержащий соответствующие «узкие» типы, исполь- зуется как в определении функции, так и во всех ее объявлениях (declaration). В подобном случае система программирования может выполнять расширение всех типов, некоторых по выбору или ни одного из них. Например, расширение может быть определено для типов char и short, но не для типа float. Отметим что все передаваемые параметры, соответствующие многоточию (ellipses) в прототипе, всегда расширяются. функции, определяемые (defined) и объявляемые (declared) без прототипа, всегда предполагают и фактически получают расши- ренные типы. (Именно поэтому семейство функций print! не имеет спецификаторов преобразования типов char, short и float.) conversion. Implicit (неявное преобразование типов) Речь идет об автоматическом преобразовании значений операндов данного типа в значения другого типа, как это имеет место при выполне- нии ряда операций. Например, для выражения i + d при условии, что । — переменная типа Inf. ad — переменная типа double, операция сложения выполняется таким образом, что результат имеет тип double. (См conversion; conversion, axplicii.) conversion, integer type (преобразование данных целого типа) Данные со знаком и без знака типа char, short и поля битов типа int могут использоваться в тех случаях, когда ожидается примене- ние данных типа inf. Если их значения могут быть представлены в формате int, они преобразуются именно в данные этого типа; иначе они преобразуются в данные типа unsigned int. (См. unsigned preserving rule и value preserving rule.) conversion, pointer (преобразование указателя) Так называемый void-указатель является совместимым по присваиванию со всеми указателями на объекты обычные и незавершенного типа. Буду- чи таковым, void-указатель может преобразовываться в упомяну- тые указатели, а они могут быть преобразованы в void-указатель. Указатели всех других типов несовместимы друг с другом, однако они могут обладать способностью подвергаться приведению ти- пов (из одного в другой), порождая полезные результаты в некоторых системах программирования. conversion, usual arithmetic (обычные арифметические преобразо- вания) Ниже перечисляется набор правил, согласно которым выполняется преобразование арифметических типов операндов в зависимости от того, какая из операций /, *, % + —. «, », <. <=. >, >=, =, 1=, &, ", I, &&, || и : имеет место при вычислении выражения по условию ('< •). 41
conversion, void type • Если 0ДИ1 г из операндов имеет тип long doub.e другой операнд преобразуется в данное типа ’ong double. • Если один из операндов имеет тип аоаЫе. другой операнд преобразуется в данное типа double. • Если один из операндов имеет тип float, другой операнд преоб- разует зя в данное типа float. • В противном случае выполняется продвижение по шкале це- лочисленных типов (integral promotion) для обоих операндов. Затем применяются следующие правила: — если один из операндов имеет тип unsigned long int, то другой операнд преобразуется в данное типа unsigned long int: — если один операнд имеет тип long inf, а другой операнд имеет тип unsigned int, и при этом long int может обеспе- чить представление всех значений uns.gned inf, операнд типа unsigned int преобразуется в данное типа long int. если long inf ие может пред.тавить все значения unsigned int, оба операнда преобразуются в данные типа unsigneo long mt; — если один из операндов имеет тип long int. другой операнд преобразуется в данное типа long inf; — если один из операндов имеет тип unsigi.ed <nt, другой операнд преобразуется в данное типа unsigned int; — иначе оба операнда имеют тип int. conversion, void type (преобразование данных типа void) Несущест- вующее значение выражения типа void нельзя использовать никаким другим образом, как только выполнить явным образом приведение к типу void. conversion specifier (спецификатор преобразования) Речь идет о последовательности символов вида %х, где х — это один или несколько символов, которые используются семейством функ- ций printf и scant для интерпретации списка параметров форма- тированных вывода и ввода соответстъг дно. Иногда спсцифи катор преобразования называют маской редактирования (edit mask). copying functions (функции копирования) Это функции memcopy, memmove, strep у и strnepy объявляемые в s*ring.h. cos Эта функция вычисляет косинус своего аргумента х (значение которого измеряется в радианах). #indude < -natn.h> double cos(double x); При большой величине аргумента функция cos может возвра- щать результат совсем малой величины или не имеющий значе- ния вовсе. 42
ctype.h cosf Эта дополнительная функция (опция) является разновидностью функции cos для данных типа float. Она относится к нововведе- ниям Стандарта языка Си. cosh Эта функция вычисляет гиперболический косинус своего аргумента х (значение которого измеряется в радианах). # include <math.h> double cosh(double x); Если величина аргумента слишком велика, может иметь место ошибка (выход за диапазон допустимых значений). coshf Эта дополнительная функция (опция) является разновидно- стью функции cosh для данных типа float. Она относится к нововведениям Стандарта языка Си. cosh Эта дополнительная функция (опция) является разновидно- стью функции cosh для данных типа long doubl. Она относится к нововведениям Стандарта языка Си. cos! Эта дополнительная функция (опция) является разновидностью функции cos для данных типа long double. Она относится к нововведениям Стандарта языка Си. cross-compilation (кросс-компиляция) Речь идет о среде разработки программы, в которой исходные тексты программ компилируют- ся в одной системе, именуемой главной (host), однако предназ- начены для выполнения в другой системе, целевой (target). Программа обычно берет на себя целиком управление целевой системой, т. е. она выполняется не под управлением операцион- ной системы. Такие целевые системы называются «самостоя- тельными* (freestanding) в терминологии Стандарта языка Си. ctlme Эта функция преобразует календарное время, на которое указывает timer, в местное время, представляя его в виде строки символов. #include <fime.h> char ♦ctirnefconst time_t rfimer); Вызов функции dime эквивалентен записи вида ascfime (localtime(timer)) при этом возвращаемое значение указывает на строку символов, форма которой идентична форме строки символов, возвращае- мой функцией ascfime. ctype.h Этот объект-заголовок содержит различные функции пре- образования и тестирования символов Функции семейства is* (где is — первые две буквы имени каждой из функций), возвра- щают нулевое или ненулевое значение в зависимости от «ис- тинности» или «ложности» выполняемой ими операции соответственно, а функции семейства to* (где to — первые две буквы имени каждой из функций), возвращают значение своего 43
currency d i s p iay символьного аргумента (возможно преобразованное в соответст- вии с положением регистра: верхний или нижний). Все функции требуют наличие одного аргумента типа int. Одна- ко последний должен либо быть представим в формате unsigned char, либо быть макросом EOF. Если аргумент имеет значение, отличающееся от перечисленных, поведение функции не опре- делено. Поведение некоторых функций зависит от конкретной «куль- турной среды» (locale specific). Данный объект-заголовок содержит определения или объявле- ния следующих идентификаторов. Наимено- вание Назначение isalnum I (роверка: является ли символ алфавитно- цифровым (alphanumeric) isalpha Проверка: является ли символ текстовым (alphabetic) iscntrl Проверка: является ли символ управляющим isdigit Проверка: является ли символ цифрой isgraph Проверка: является ли символ графическим islower Проверка: является ли символ строчной бук- вой (нижнего регистра) i sprint Проверка: является ли символ печатаемым ispunct Проверка: является ли символ знаком пункту- ации isspace Проверка, является ли символ пробелом isupper Проверка: является ли символ прописной буквой (верхнего регистра) isxdigit Проверка: является ли символ шестнадцате- ричной цифрой tolower Формирование строчного варианта буквы toupper Формирование прописного варианта буквы (См. future library directions.) currency display (воспроизведение монетарной величины) Объект- заголовок locale.h содержит определение структуры Iconv. Некото- рые элементы этой структуры описывают способ форматирова- ния данных (значения которых — денежные суммы) согласно требованиям соответствующей «культурной среды» (locale). Макрос LC_MONETARY можно использовать в качестве параметра category в функции setlocale для выбора формата воспроизведения монетарной информации. currency symbol Это элемент структуры Iconv, являющийся указате- лем на строку символов, содержащую знак местной денежной 44
DBL MANT DIG единицы, соответствующий текущей «культурной среде-» (locale) Нели строка символов имеет вид то это означает, что требуемое значение отсутствует для данной «культурной среды » или, говоря иначе, оно имеет длину, равную нулю. curses Это популярный пакет работы с видеомонитором, берущий свое начала из среды UNIX, и многократно эмулировавшийся в других системах. Он содержит набор примитивных функций манипуляции с экраном и курсором. Этот пакет не входит в состав средств Стандарта языка Си. D __DATE___ Этот встроенный макрос Стандарта языка Си расширя- ется до формата строки, содержащей дату компиляции в форме Mm-п dd уууу (т — цифра месяца, d — цифра дня, у — цифра года). Если порядковый номер дня меньше, чем 16 первую позицию поля дня занимает пробел. Например: Мя~ 7 1991 или Маг 22 1991. Если дата отсутствует, ее заменяет дата, определен- ная в используемой вычислительной системе. Данный макрос можно применять в любом контексте, где допустимо или требу- ется использование строкового литерала. Например: char dafe[] =_DATE__; prinH("%s",__DATE__); А поскольку для смежных строк выполняется операция конкате- нации, допустимо следующее. prinW(">%s<\n”, "ххх"_DATE__”ххх”); date and time header (объект-заголовок даты и времени) (См. time.h.) [BL DIG Этот макрос определяемый в fl jat.1i указывает количество десятичных цифр такое, что при выполнении преобразования с округлением числа типа double с этим количеством значащих цифр в число с плавающей точкой и обратно указанные десят и- чные цифры не претерпевают изменений. Это относится к нововведениям Стандарта языка Си. DBL F.PSILON Этот макрос, определяемый в floath, обозначает раз- ницу между 1.0 и наименьшим из значений, больших 1 О, которое представимо в виде числа типа double. Это относится к нововведениям Стандарта языка Си DBL_MANT DIG Этот макрос, определяемый в foat.h. обозначает количество значащих цифр числа с плавающей точкой типа doubl s при использовании системы счисления с основанием FLT-RADIX. Это относится к нововведениям Стандарта языка Си. 45
DBl—MAX DBL_MAX Этот макрос, определяемый в float.h, обозначает макси- мальное представимое конечное число типа double. Это относится к нововведениям Стандарта языка Си. DBL_MAX_10_EXP Этот макрос, определяемый в float.h, обозначает максимальное целое число, которое, будучи степенью числа 10, дает число, не выходящее за диапазон представимых конечных чисел с плавающей точкой. Это относится к нововведениям Стандарта языка Си. DBI MAXJEXP Этот макрос, определяемый в float.h, обозначает максимальное целое число, которое, будучи уменьшенной на единицу степенью числа FLT_RADIX, дает представимое конечное число с плавающей точкой. Это относится к нововведениям Стандарта языка Си DBL_MIN Этот макрос, определяемый в float.h, обозначает мини- мальное нормализованное положительное число типа double. Это относится к нововведениям Стандарта языка Си. DBL_MIN_10_EXP Этот макрос, определяемый в float.h, обозначает минимальное отрицательное число, которое, будучи степенью числа 10, дает число, не выходящее за диапазон значений нор- мализированных чисел с плавающей точкой. Это относится к нововведениям Стандарта языка Си. DBL_MIN_EXP Этот макрос, определяемый в float.h, обозначает минимальное отрицательное число, которое, будучи степенью числа 10, дает число, не выходящее за диапазон значений нор- мализованных чисел с плавающей точкой. Это относится к нововведениям Стандарта языка Си. decimal constant (десятичная константа) (См. constant, integer.) decimal point (десятичная точка) (См.radix point.) decimaljoint Этот член структуры Iconv является указателем на строку символов, содержащую символ «десятичная точка», кото- рый применяется для форматирования немонетарных величии, declaration (объявление) Объявляет, например атрибуты одного или нескольких идентификаторов. Определение (definition), как например, static int i; также является объявлением, однако объявление вида extern int j; не обязательно является определением. Объявления могут иметь место в начале какого-либо блока, предшествуя каким-либо ко- мандам. Объявления могут также размещаться вне определения функции. Объявление должно завершаться точкой с запятой declaration specifiers спецификаторы объявлений) К ним относят- ся все составные части объявлений, за исключением инициали- заторов, а именно: спецификаторы классов памяти, специфика- торы типа и модификаторы типа. 46
default argument promol.ons declarator (декларатор, или объявитель) Декларатор объявляет один идентификатор. Например, объявление int i, j[5], k[void]; содержит три декларатора (для i, j и к). (См. declaration.) declarator, punctuation in (пунктуация в деклараторах) Речь идет об использовании в декларациях следующих знаков пунктуации: () используется для двух целей, одна из которых — задание приоритета выполнения операций, а другая — обозначение производного типа {derived type) значения, возвращаемого функцией. Так, например, int (*fp)(void) объявляет, что fp — указатель на функцию без параметров. При отсутствии круг- лых скобок мы имели бы int •fp(void), где fp — имя функции без параметров, возвращающей в качестве значения указа тель на данное типа int. ♦ применяется для обозначения производного типа «указатель на», как это имеет место, например, в int «pi и long (»pf)(inf). [] используется для обозначения производного типа «мас- сив.. » declarator type derivation (формирование производного типа декла- ратора) (См. derived type ) decrement operator (знак операции «уменьшение на единицу») Знак одноместной операции уменьшения на единицу (—) может при- меняться как в префиксной, так и в постфиксной записи. Опе- ранд должен быть данным скалярного типа и быть модифициру- емым именующим выражением (lvalue). Значение х— является значением х перед выполнением операции уменьшения х на единицу, в то же время значение —х — это значение х после выполнения подобной операции. Постфиксный вариант этой операции ассоциативен слева, а префиксный вариант — справа. (До введения Стандарта языка Си оба варианта имели равный приоритет в очередности выполнения. Однако Стандарт повы- сил приоритет постфиксной операции. Это не должно внести нарушения в корректно написанные программы. Более того, это дает возможность некорректные конструкции, разработанные ранее, сделать правильно функционирующими. Например, те- перь р------->т является корректной конструкцией.) Существует соответствующий знак операции увеличения на 1 (++). default Это ключевое слово используется в качестве специальной метки и только в контексте команды switch. Последняя передает управление на default, если значение управляющего выражения не соответствует ни одному из значений меток переключателя. Вы не можете, используя goto, передать управление на метку default, поскольку до*о можно применять только для передачи управления на метку, определяемую пользователем. (См. labeled statement.) default argument promotions (продвижение аргументов по умолча- нию по шкале типов) (См. conversions, function arguments.) 47
#define #define Это директива препроцессора, используемая для определе- ния макросов, подобных объектам (object-like macro) или функ- циям (function-like macro).(См. defined, #ifdef, #ifndef и #undef.) Директива используется согласно следующему формату: #define идентификатор [список замещений] #define идентификатор ([список идентификаторов]^ [список замещений] defined Это знак операции препроцессора, позволяющий упростить чтение и запись сложных критериев выбора для условной ком- пиляции. defined применяется для проверки, специфицирует ли макрос согласно определению его операнда; при этом выдается значение 1 на «истинно» и 0 на «ложно». Например: #if defined Ml && Idefined М2 /*...*/ #endif эквивалентно ffifdef Ml #ifndef М2 /».. •/ #endif #endif Вокруг операнда (имени макроса) операции, формируемой по- средством defined, можно использовать дополнительные скобки. Отмстим, что defined не является ключевым словом, defined имеет специальное значение только при использовании в контексте директив #>f или #elif. Во всех других контекстах это имя можно применять в качестве идентификатора. Слово defined не может быть объектом директив #undef или #define. definition (определение) Определение можно рассматривать как объявление (declaration), которое влечет за собой резервирова- ние памяти для объекта или функции, именуемой идентифика- тором. Определение (например: static int i;) — это в то же время и объявление; однако объявление (например: extern int j ) не обязательно является определением. definition, tentative (определение уточняемое) Речь идет об опреде- лении. которое может быть в дальнейшем в пределах одной и той же единицы трансляции для одного и того же идентификатора дополнено другим определением. Уточняемое определение — это объявление идентификатора (именующего объект), который имеет область действия в пределах файла (file scope), для кото- рого не задано начальное значение (идентификатор отсутствует), который не имеет спецификатора класса памяти или специфи- катора static. delete Это ключевое слово языка Си++ не входит в состав средств Стандарта языка Си. Если написанные на языке Си программы 48
div Вы предполагаете использовать в дальнейшем в среде Си++, следует избегать применения delete в качестве идентификатора, dereference (разыменование, или снятие косвенности) (См. indirection.) derived type (производный тип) Это тип, полученный на основании другого типа. Например, char *[10] является типом, производным от cha- *, который в свою очередь является производным от базового типа char. Имеются только три способа получения одного типа из другого: Т2 есть массив типа Tl; Т2 есть указатель на Т1; Т2 есть функция, возвращающая Т1. Не все возможные произ- водные типы допустимы, о чем свидетельствует приводимая ниже таблица, функция не может возвращать массив или фун- кцию, а также нельзя сформировать массив функций. Производные типы: допустимые комбинации Производный тип Указатель Массив Функция Указатель на да да да Массив да да нет Функция, возвращающая да нет нет diagnostic message (диагностическое сообщение) Это сообщение об ошибках. Система программирования, удовлетворяющая требо- ваниям Стандарта, должна производить по меньшей мере одно диагностическое сообщение для каждого нарушения синтакси- ческого правила или накладываемых ограничений, имеющих место в единице трансляции. Формат сообщения определяется конкретной реализацией системы. Впрочем, нужно добавить, что дополнительные ограничения могут быть наложены местными агентствами контроля качества продукции. Так, в США, согласно требованиям FIPS, подобные сообщения должны указывать наи- менование единицы трансляции и как можно точнее локализо- вывать номер «ошибочной» строки исходного текста программы. diagnostics header (объект-заголовок диагностики) (См assert ) difftime Эта функция вычисляет разницу между двумя значениями календарного времени, используя timet — timet. Это относится к нововведениям стандарта языка Си. Й indude <time.h> double difftime(time_t timet, time_t timeO); Возвращаемое значение указывает количество секунд, разделя- ющих два заданных значения времени. direct I/O functions Это функции tread и fwr.te, прототипы которых определены в stdio.h. div Эта функция вычисляет частное и остаток от деления питег на demon. Это относится к нововведениям стандарта языка Си. #indude <stdlib.h> div_t div(int numer, int demon); 49
div t Если деление не удается выполнить точно, то знак результирую- щего частного — это знак алгебраического частного, а величина результирующего частного — это наибольшее целое число, не превосходящее величины алгебраического частного. Если ре- зультат не представим, поведение функции не определено. Воз- вращаемое значение — это структура типа div_t, содержащая (в любом порядке; два числа типа int, а именно, quot и rem. Эта функция относится к иововведенням Стандарта языка Си. (См. Idiv.) dlv_t Определяемый в stdlib.h, этот тнп является структурой, исполь- зуемой как возвращаемое значение функции div (определение зависит от конкретной реализации системы программирова- ния'. Одно из возможных решений: typedef struct ( int quot; int rem; ) div_t; Порядок членов этой структуры не требует специального указа- ния. div_t относится к нововведениям Стандарта языка Си. (См ldiv_t.) division, integer with negative values (деление целочисленное с от рнцательными зиачеинямн) (См. division operator и функции aiv и Idiv.) division assignment operator (знак совмещенных операций «деле- ние» и «присваивание») Знак двухместной операции /= позво- ляет объединить деление с присваиванием такнм образом, что выр! /= выр2 эквивалентно выр! = выр1/выр2, за исключени- ем того факта, что в первом случае выр1 вычисляется только один раз. Оба операнда должны быть выражениями арифметического типа, причем левый операнд должен быть модифицируемым именующим выражением (lvalue). Если какой-либо операнд имеет отрицательное значение, поведение операции зависит от ее конкретной реализации. А именно, результат может быть наибольшим целым числом, которое меньше или равно алгебра- ическому частному, илн наименьшим целым числом, которое больше илн равно алгебраическому частному. Порядок вычис- ления выражений-операндов не указан. Тип результата — это тип выражения выр1. Данная операция ассоциативна справа. (См. assignment operator, compound .) division operator (знак операции «деление») Знак двоичной опера цин / обеспечивает деление значения левого операнда иа значе- ние правого операнда. Оба операнда должны быть выражениями арифметического типа. Порядок вычисления значений операн- дов не указан. Если какой-либо из операндов имеет отрицатель- ное значение, поведение операции зависит от ее конкретной реализации. А именно, результат может быть наибольшим це- лым числом, которое меньше или равно алгебраическому част- ному, или наименьшим целым числом, которое больше или 50
double равно алегбраическому частному. Операнды подвергаются обычному преобразованию арифметических типов. Данная опе- рация ассоциативна слева. (См. div н Idiv.) do/whlle Эти два ключевых слова применяются совместно для организации цикла, который подлежит выполнению по меньшей мере один раз. (Циклы for н while могут быть не выполнены ни разу ) Обобщенная форма цикла: do команда while (выражение); Команда тела цикла выполняется, а после этого вычисляется выражение. Если оно «истинно», процесс повторяется. Выраже- ние относится к категории полных, т. е. самостоятельных (full expression). DOMAIN Этот нестандартный макрос используется в нестандарт- ной функции malherr. domain error (ошибка выхода за пределы области определения) Эта ошибка имеет место, если фактический параметр математиче- ской (арифметической) функции оказывается за пределами об- ласти определения функции В этом случае значение, возвраща- емое функцией, определяется конкретной реализацией последней, и ermo присваивается значение, определяемое мак- росом EDOM. dot operator (знак операции «точка») Это знак двухместной опера цнн используемый для выбора правого операнда из структуры или объединения, задаваемого левым операндом. Порядок вы- числения операндов не указан. Левый операнд должен иметь тип структуры или объединения, а правый операнд должен быть именем элемента (члена) этой структуры или объединення. Та- кая операция порождает именующее выражение (lvalue), если левый операнд — именующее выражение. (Пример, когда выра- жение не является именующим: f().m.) Выражение, содержащее точку как знак операции, почти всегда может быть представлено в другом виде посредством замены точки знаком операции «стрелка» (arrowoperator). Например, s.m эквивалентно (Sts)—>m. Однако f().rn нельзя записать подобным образом, поскольку (() не является именующим выражением и, следовательно, нельзя «взять» его адрес. Аналогично, если s — это структура или объединение, имеющее класс памяти register, то s.m яьляется допустимой записью, в то время как (&s)—>т — недопустимая запись, поскольку нельзя вычислить адрес регистровой перемен- ной. Тип результата операции, знак которой есть «точка», — это тип именуемого члена (структуры или объединения) Данная операция ассоциативна слева. double Это ключевое слово, применяемое для одного из трех типов чисел с плавающей точкой. (Два других типа используют ключе- вые слова float н long double.) По традиции double означает «двой- ная точность» a float — «одинарная точность». Однако допуска- 51
double quote escape sequence етея double иметь ту же точность, что и f'oa*. Некоторые компиля- торы воспринимают long float как синоним double, одиако Стан- дарт языка Сн это не разрешает. (См. floating type.) double quote escape sequence (управляющая последовательность «двойная кавычка») Этот символ (двойная кавычка) может быть включен в строковый литерал только в форме управляющей последовательности вида \". Одиако двойные кавычки можно представить в виде символьной константы, а именно: \"' и double type conversion (преобразование типа double) (См. conversion, usual arithmetic.) 4-8--5- E E* value macros (макросы E* значение) (См. errno value macros ) EBCDIC Аббревиатура полного наименования расширенного дво- ично-десятичного кода обмена информацией (Extended Finary Coded Decimal Interchange Code). Этот 8-битовый код может представить 256 различных символов; он широко применяется на болы [их вычислительных машинах фирмы ) ВМ. Стандарт языка Сн не «привязан» к конкретному набору символов. (См ASCII и iscntrl.) edit mask (маска редактирования) Общепринятое наименование понятия, формально именуемого «спецификация преобразова- ния» (conversion specifier). EDOM Определяемый конкретной системой программирования, этот целочисленный макрос имеет положительное значение и применяется для указания на возникновение ошибки выхода за пределы области определения. (См. errno.) element type (тип элемента) Речь идет о типе элемента (члена) мас- сива. #elif Эта директива препроцессора используется в качестве сокра- щенной формы записи вложенной #else с #J. Она имеет следу- ющий формат: #e'if целочисленное выражение «онипанта Если целочисленное выражение кот такта содеця ит какие-либо идентификаторы, не определенные к текущему моменту как макросы, то предполагается (только для данной директивы), что они — макросы, имеющие нулевые значения, целочисленное вы- ражение-константа вычисляется, как будто бы каждый член выражения имеет тип long int. ellipsis [многоточие) Этот знак пунктуации применяется в объявле- ниях и описаниях функций для указания, что имеет место список с переменным числом параметров. (Это относится к нововведе- 52
Sendif ниям Стандарта языка Си.) Среди стандартных библиотечных функций, использующих подобную нотацию, имеются только два семейства функций: pnntf и scant. В стандартном объекте-заголов- ке s*darg h (и нестандартном файле varargs h) объявляется меха- низм доступа к параметрам в списке с переменным числом параметров. Поведение не определено, если вызывается функ- ция которая предполагает использование списка с переменным числом параметров, однако нет прототипа, содержащего много- точие. Следовательно, всегда в тексте программы необходима директива #!ndude<stdio.h> прежде, чем имеют место вызовы printf и scanf, даже хотя возвращаемые значения этих функций имеют тип int (См conversion, function arguments ) Seise Эта директива препроцессора применяется для указания ветви «ложно» в наборе директив компиляции по условию. Используемая вместе с #if, Sifdef, Sifndef, Selif и Sendif, эта директива имеет следующий формат Seise Типовым расширением для этой директивы является размеще- ние произвольных лексем (arbitrary tokens) после нее и перед символом «новая строка» (new-line), который ее завершает. Стандарт языка Си разрешает здесь только пробелы. else statement (команда else) (См. if/else ) end-of-file indicator (индикатор конца файла) Это один из элемен- тов (членов) объекта FILE, применяемый стандартными библио- течными функциями ввода-вывода совместно с файловой систе- мой для указания того, достигнут ли конец соответствующего файла. Этот идентификатор доступен посредством feof и dearerr. Индикатор конца файла очищается с помощью функций fopen и freopen. end-of-file macro (макрос «признак конца файла») (См. EOF.) end-of-line indicator (индикатор конца строки) Это последователь- ность символов, используемая в определенной среде для указа- ния конца строки текста программы или входных данных. На- пример, это может быть пара символов «возврат каретки» и «перевод строки» (carriage-return/line-feed) или только «перевод строки» (line-feed). В любом случае язык Си «рассматривает» индикатор как один символ — признак конца строки (new-line character) или просто «новая строка» (new-line). Sendif Эта директива препроцессора применяется для указания достижения конца набора директив компиляции по условию. Такой набор содержит одну или несколько директив из следую- щего списка: #if, Sifdef. Sifndef. Selif, Seise. Данная директива имеет формат вида Sendif Типовым расширением этой директивы является размещение произвольных лексем (arbitrary tokens) после нее и перед симво- 53
e ifry лом « пиная строка» (new line), который ее завершает. Стандарт языка Си разрешает здесь только пробелы. entry Этот идентификатор зарезервирован для применения в буду- щем в качестве ключевого слова в оригинальных определениях языка Си. enum Это ключевое слово применяется для задания перечисляемого типа и объявления идентификаторов для объектов такого типа. Например: enum color (red, green=4, blue}; etium color car_color; Идентификатор color является тегом (tag) данного перечисляемо- го типа, и его выбор произволен. Идентификаторы rea, green и blue — это константы перечисляемого типа. При отсутствии ини- циализатора (явного присвоения начального значения) первая такая константа получает значение, равное 0. Последующим константам присваиваются значения на 1, 2, 3 и т. д. больше, если для очередной константы не задается явно начальное зна- чение. В пределах одного и того же перечисляемого типа МиГ)” быть константы с одинаковыми значениями; диапазон значений Констант — не обязательно ряд непрерывных значений. enumerated type (перечисляемый тип) Это тип данных, набор кото- рых является множеством взаимосвязанных целочисленных зна- чений Каждое из этих значений представляет собой перечисля- емую константу. Такой тип данных может (но не обязательно) иметь гег (и объявляется подобно структуре или объединению). Между объектами перечисляемого типа и указанными целочис- ленными значениями устанавливается соответствие согласно конкретной реализации системы программирования. Механизм контроля типов для операций надданными перечисляемого типа разработан крайне незначительно. (См. enum.) enumeration constant (константа перечисляемого типа) Речь идет об идентификаторе, используемом внутри определения перечисля- емого типа. Это выражение-константа, (constant expression) типа int, обрабатываемое на этапе трансляции, которое может иметь инициализатор, задаваемый явно. Конст нпы пе речисляемого типа делят общее пространство имен с переменными, функция- ми и именами typedef В отличие от членов (элементов) структур и объединений, константы перечисляемого типа никогда пе определяются посредством знаков операций . (точка) и —> (стрелка). Однако их можно использовать в любом контексте, где допустимо применение константных выражений (исключая ди- рективы Л if и #elif). (См. enum ) enumeration tag (тег типа enum) (См tag.) environment (окружающая среда) (См. environment list.) environment, freestanding (среда стоящих «особняком» программ) Речь идет о среде, в которой программа выполняется не под управлением операционной системы. Часто такие, стоящие 54
environmental limits «особняком» (freestanding) программы не имеют доступа к ко- мандной строке процессора или файловой системе. (Операци- онная система — это особый случай подобной среды ) Трансля тор языка Си для такой среды должен сам предоставлять объекты-заголовки float h, limits.h и sfddef.h. Любые библиотечные средства, имеющиеся в распоряжении стоящей «особняком» программы, реализуются по своему для каждой конкретной си- стемы программирования. (См. environment, hosted.) environment, hosted (среда выполнения программ под управлением главной программы) Речь идет о выполнении программ под управлением операционной системы Такие программы, как правило, имеют доступ к командной строке процессора и фай- ловой системе. Соответствующий транслятор с языка Си должен обеспечивать реализацию всех возможностей библиотеки под- держки (run-time library) согласно требованиям Стандарта. (См. environment, freestanding.) environment functions (функции вычислительной среды) Это функ- ции »bort, atexit, exit, getenv и system, объявляемые в stdfib.h. environment list (список переменных среды) Этот список состоит из строк символов — переменных среды. Наличие этих перемен ных. способ их формирования — все это зависит от конкретной реализации вычислительной среды. Переменные среды часто используются как средство передачи информации (такой, как имена каталогов и файлов) из оболочки операционной системы нли уровня командной строки в прикладную программу Для доступа к списку переменных среды Стандарт языка Си предо- ставляет функцию getenv. (См. envp и putenv.) environment variables (переменные среды) Это элементы списка пе ременных среды. environmental considerations (характеристики среды) Речь идет о та- ких характеристиках среды, как наборы символов фаз трансля- ции и выполнения программ, семантика, отображение символов внешних устройств, сигналы и прерывания, ограничения воз- можностей среды. environmental limits (ограничения возможностей среды) Стандарт языка Си требует, чтобы транслятор был способен обрабатывать единицы трансляции минимальной сложности. Согласно требо- ваниям Стандарта, «конкретная система программирования (implementation) должна обеспечивать выполнение по меныней Мере одной программы, содержащей по меньшей мере одно включение каждого из следующих программных средств с соот- ветствующими предельными параметрами: • 15 вложенных уровней составных команд, конструкций уп равления выбором: • 8 вложенных уровней включения условий; • 12 объявлений указателей, массивов и функций (в любом сочетании), модифицирующих (в объявлении) тип арифмети- 55
envp ческого объекта, структуры, объединения или объекта неза- вершенного типа; • 31 вложенный уровень объявлений со скобками внутри пол- ного объявления; • 32 вложенных уровня выражений со скобками внутри полно- го выражения • 31 значащий символ во внутреннем идентификаторе (internal identifier) или имени макроса; • 6 значащих цифр во внешнем идентификаторе (external identifier): • 511 внешних идентификаторов в одной единице трансляции; • 127 идентификаторов, объявляемых в блоке, с областью дей- ствия в пределах блока; • 1024 идентификаторов макросов, одновременно определяе- мых в одной единице трансляции; • 31 параметр в определении одной функции: • 31 параметр в вызове одной функции; • 31 параметр в определении одного макроса (в одном макрооп- ределении); • 31 параметр в вызове одного макроса (в одном макроопреде- лении); • 509 символов в одной «логической» строке исходного текста программы; • 509 символов в строковом литерале (string literal) или расши- ренном строковом литерале (wide string literal) (после конка- тенации); • 327 67 байтов в объекте (только для среды с выполнением программ под управлением операционной системы); • 8 вложенных уровней для объектов-заголовков; • 257 с«е-меток для команды switch (исключая метки для любых вложенных команд swith); • 127 членов (элементов) в одной структуре или объединеннн; • 127 констант перечисляемого типа в одном данном перечис- ляемого типа; • 15 уровней вложенных определений структур или объедине- ний в одном списке объявлений структур». Стандарт языка Си требует, чтобы для конкретной реализации системы программирования в limits.h и float.h свойства гитов были документированы integer и float в соответствии с их реализацией. envp Этот идентификатор обычно применяется для наименования третьего параметра, передаваемого функции main при ее вызове. Эго массив указателей на строки символов, задаваемые как пере- менные среды. Данный идентификатор не определен в Стандарте языка Си, но допускается к использованию как расширение средств языка. Он обычно имеется в распоряжении при работе в средах UNIX и в компиляторах, моделируемых на компиляторе рсс UNIX. (См. getenv.) Отметим, что в то время как имя envp широко 56
errno используется в качестве третьего параметра функции main, этот идентификатор не является обязательным к применению и по желанию программиста может быть заменен на любое другое допустимое имя. EOF Определяемый в stdio.h, этот макрос является целочисленным константным выражением, принимающим отрицательное значе- ние, которое возвращают многочисленные функции указывая на возникновение условия достижения конца файла (end-of-file condition). (См. end-of-file indicstor.) equal-sign (знак равенства) (См. assignment operator, simple; equals punctuator.) equality (тождество) Знак операции тождество (=) применяется для проверки равенства значений двух выражений. Следует отли- чать знак тождества (=) от знака равенства (=). equality operator (знак операции «тождество») Знак двухместной операции тождества (=) позволяет сравнить значения операн- дов с целью проверки их равенства между собой. Оба операнда должны быть данными скалярного типа причем либо оба опе- ранда — данные арифметического типа, либо указатели на дан- ные совместимых типов (с модификаторами либо без модифика- торов типа), либо один операнд — указатель на void, а другой — указатель на объект или данное незавершенного типа, либо один операнд — указатель, а другой — константа в виде null-указателя (null poiner constant). Порядок вычисления значений операндов не задан. Результат операции имеет тип mt и значение 0 («лож- но») или 1 («истинно»). Данная операция ассоциативна слева. Отметим, что знак операции тождества (=) следует отличать от знака равенства (=), поскольку семантика этих знаков различна. Например, в случае if (• = Ь) .. значение Ь присваивается переменной а. после чего значение а проверяется на «истинность» В случае же if (а == Ь)... значения • и Ь проверяются па равенство (проверка тождествен- ности значений). equals punctuator (знак пунктуации в списке присваивания) Речь идет о знаке пунктуации в инициализаторах при определении объектов (с указанием начальных значений), а также при опи- сании констант перечисляемого типа. ERANGE Определяемый при реализации системы программирова- ния, этот целочисленный макрос, имеющий положительное зна- чение, используется для указания диапазона значений ошибок. (См еггпо.) errno Объявляемое в errno.h, это модифицируемое именующее вы- ражение (lvalue) указывает область памяти, через которую стан- дартная библиотека может пересылать значения ошибок Исто- 57
errno value macros рически errno было объявлено посредством extern int errno; однако Стандарт языка Си допускает errno быть макросом. Для errno определены только два стандартных значения: EDOM и ERANGE. В процессе старта системы errno получает нулевое значение (очищается). Однако нет библиотечной функции, которая бы запрашивалась для очистки errno. Следовательно, на программи- ста возлагается обязанность по очистке errno каждый раз непос- редственно перед вызовом библиотечной процедуры, о которой в документации сказано, что она способна осуществлять уста- новку errno. Ниже перечисляются библиотечные функции Стандарта языка Си, о которых в документации сказано, что они устанавливают errno: acos, asin, cosh, exp, fgetpos, fsetpos ftell, Idexp, log, log 10, perror pew, signal, sinh, strtod, strtol, stdout (Cm. errno value macros, perror и strerror ) errno value macros (макросы значений для errno) Макросы, опреде- ляющие допустимые значения для errno, требуется именовать согласно формату Е*, где * означает строку прописных букв или цифр. Стандарт языка Си определяет только два таких макроса: EDOM и ERANGE. EDOM используется для указания ошибки выхода за пределы области определения (domain error), a ERANGE пред- назначен для указания ошибки выхода результата за диапазон значений (range error). Возможны другие макросы этого форма- та, определяемые конкретной реализацией системы. (См. future library directions ) errno h Этот объект-заголовок (header) содержит определения и объявления для следующих идентификаторов: Имя Назначение EDOM Параметр вне области определения ERANGE Результат вне диапазона значений errno Место хранения номера ошибки Файл errno.h может также содержать макросы (с именами Е*), определяемые конкретной реализацией, значения которых мож- но сравнивать со значением errno. (См. future library directions.) #error Эта директива применяется для отображения сообщения на стандартном устройстве приема ошибок stderr и завершения трансляции Формат директивы: #еггог [лексемы_препроцессора] Это относится к нововведениям Стандарта языка Си. error domain (ошибка выхода за пределы области определения) (См domain error ) error, range (ошибка выхода за диапазон допустимых значений) (См range error.) 58
evaluation error conditions (условия возникновения ошибок) (См. domain error И range error.) error handling functions (функции обработки ошибок) Речь идет о функциях dearerr, feo*, terror и perror, объявляемых в stdio.h error indicator (индикатор ошибок) Это один из элементов (членов) объекта FILE. Ои используется стандартными функциями ввода- вывода совместно с файловой системой для указания того, имела или не имела место ошибка чтения или записи соответствующего файла. Этот индикатор доступен посредством функций terror и clearerr; сброс (очистка) индикатора осуществляется с помощью функций (open и freopen escape sequence (управляющая последовательность) Это последова- тельность символов исходного текста программы, используемая для представления кода одного символа. В то время как воспро- изводимые, так называемые «печатные» символы (такие, как А, Ь. 1 или +) могут представлять сами себя непосредственно, другие, невоспроизводимые символы (как например, «возврат на один символ» или «новая строка») требуют для своего пред- ставления использования управляющей последовательности (в данном случае \Ь и \п соответственно). Воспроизводимые сим- волы могут также быть заданы своим восьмеричным или шест- надцатеричным внутренним представлением. Управляющие последовательности языка Си Последова- тельность Значение \" \' \0 м \\ \а \Ь \ddd М \п \г \t \v \хй..Л Двойная кавычка Одиночная кавычка null-символ Знак вопроса Нак\онная черта влево Подача сигнала тревоги Возврат на один символ Восьмеричное значение ddd Перевод (прогон) страницы Перевод строки Возврат каретки Горизонтальная табуляция Вертикальная табуляция Шестнадцатеричное значение Л..Л (См. future language directions.) evaluation (определение значения) Акт выполнения операции над одним или несколькими операндами с целью получения значе- ния (например, а + Ь), указателя (например, »рс), побочного 59
exception эффекта (например, ++i) или комбинации перечисленного (на- пример, »рс = д(а + Ь++)). Здесь важным является порядок, в котором определяются значения операндов в выражении. (См order of evaluation.) exception (исключительное состояние) (См. signal ) exception Это нестандартный тип структуры, применяемый в не- стандартной функции ma‘herr. exclusive OR assignment operator (знак составной операции «исклю- чающее ИЛИ» и «присваивание») (См OR assignment operator, bitv. se exclusive ) exclusive OR operator (знак операции «исключающее ИЛИ») (См CR operator. Ь hvise exclusive.) ехес» Это набор нестандартных функций, позволяющих выполнять программы и командные строки (command lines) как подчинен- ные процессы или процессы выполняемые параллельно. exit Эта функция вызывает нормальное завершение программы. Л include <$fdlib.h> vo J exit(int status); Сначала в обратном порядке их регистрации вызываются фун- кции. зарегистрированные посредством atexit. Затем очищаются все открытые входные файлы, после этого открытые файлы закрываются, а временные файлы, созданные функцией ‘mpfile, удаляются. Управление возвращается в среду главной програм- мы (операционной системы), которой передается код заверше- ния status. (См. abort, где рассматривается аномальное заверше- ние программы.) exit code (код выхода из программы) Это значение типа int, возвра- щаемое программой пользователя в вызывающую ее среду, когда оно возвращается из функции main либо вызываемой функции exit или abort. Значение (семантика) кода зависит от конкретной реализации системы программирования на языке Си, за исклю- чением того, что нуль н подобный объекту макрос EXIT-SUCCESS означают успешное завершение программы, a EXIT-FAILURE ука- зывает на неудачу. Код выхода не опрелелен, если предприни- мается попытка выхода «через» самую удаленную закрывающую фигурную скобку (outermost closing brace) функции main или для выхода используется явно заданная команда return без указания возвращаемого значения. Отметим, что в некоторых системах значение 0 не означает «успех». EXIT_FAILURE Объявляемый в stdlib.h, этот макрос применяется в качестве значения кода выхода из программы, символизирую- щего неудачу. Определение этого макроса зависит от конкретной реализации системы программирования на языке Си. Код вы- хода, определяемый этим макросом, может использоваться фун- кциями exit или abort- Значение, задаваемое макросом, расширя- ется до целочисленного выражения (т. е. это не обязательно 60
expression, full константа). Данный макрос относится к нововведениям Стандар- та языка Си. (См. EXIT—SUCCESS.) EXIT_SUCCESS Объявляемый в stdlib.h, этот макрос применяется в качестве значения кода выхода из программы, символизирую- щего успех. Определение этого макроса зависит от конкретной реализации системы программирования на языке Сн. Код вы- хода, определяемый этим макросом, может использоваться функ- цией exit. Значение, задаваемое макросом, расширяется до цело- численного выражения (т. е. это необязательно константа). Данный макрос относится к нововведениям Стандарта языка Си. (См. EXIT-FAILURE.) exp Эта функция вычисляет экспоненциальное значение своего аргумента (параметра) х. #indude <math.h> double exp(double x); Если величина аргумента слишком велика, имеет место ошибка выхода за диапазон допустимых значений. expf Эта дополнительная функция (опция) является вариантом функции ехр, оперирующим данными типа float. Это относится к нововведениям Стандарта языка Си. ехр! Эта дополнительная функция (опция) является вариантом функции ехр, опернрующнм данными типа long double Это отно- сится к нововведениям Стандарта языка Си. explicit coversion (явное преобразование типов) Такое преобразо- вание достигается применением знака операции приведения типа (cast operator). exponential and logarithmic functions (экспоненциальные и логариф- мические функции) Речь идет о функциях, объявляемых в math.К, а именно: ехр, frexp. Idexp, log, loglO, modf, а также вариантах этих функций, оперирующих с данными типа float и long double. expression (выражение) Выражением называют допустимую после- довательность операндов и знаков операций, которые задают правило вычисления значения (например, а + Ь), либо дости- жения побочных эффектов (например, ff(), ++i или j—) или получения того и другого одновременно (например, а + g() + ++к). expression, full (полное выражение) Речь идет о выражении, кото- рое не является частью другого выражения. В конце полного выражения имеется точка следования (sequence point). Каждое из следующих выражений является полным: инициализатор (initializer); выражение, являющееся командой; выражения, управляющие ходом выполнения команд if, switch, while или do; каждое из трех (необязательных в конструкции) выражений в команде for; необязательное для использования выражение в команде return. 61
expression, parenthesized expression, parenthesized (выражение, заключаемое в круглые скоб- ки) Речь идет о любом выражении в круглых скобках. Тип и значение такого выражения — это тип и значение такого же выражения без скобок. Заключенное в круглые скобки выраже- ние является первичным. Если выражение ехр является имену- ющим (lvalue), обозначением функции или выражением типа vo.d, то (ехр) — именующее выражение, обозначение функции или void-выражение соответственно. Это является основанием для формирования следующих полностью корректных выраже- ний весьма странного вида: (((!))) = 6 ((prin*f)) ("Hello") expression statement (команда-выражение) Выражение, используе- мое как команда; имеет следующий формат: выражение; Такое выражение является полным. Большинство команд про- граммы на языке Си являются командами-выражениями. На- пример: i++; f(i. j, k); a = Ь + с - g(); х += у; Приводимые ниже выражения также приемлемые (хотя и бес- смысленные) команды-выражения. От конкретной реализации системы программирования зависит, будут ли подобные коман- ды выражения идентифицированы как таковые, или будут вы- даны сообщения об ошибках. i; 10 + j»k; ♦pc + 3; sqrt(d); extern Это ключевое слово используется для обозначения класса памяти, указывающего, что идентификатор определяется позже в той же или другой единице трансляции. Если объявление функции (function declaration) не включает ключевое слово клас- са памяти, подразумевается extern. externa] definition (внешнее определение) Речь идет об определении нестатической функции или нестатической переменной за пре- делами определения функции. (См. scope, file.) external name (внешнее имя) Это идентификатор, экспортируемый в среду разработки программ. Он может быть «видимым» для таких программных инструментов, как ассемблеры, компонов- щики (linkers), библиотеки объектных модулей и отладчики. Длина значащей части имени и «чувствительность» к пропис- ным и строчным буквам могут быть ограничены. (Стандарт 62
-far языка Си допускает наличие по меньшей мере шести значащих символов в имени и использование только одного регистра, верхнего или нижнего.) Кроме того, возможна замена символа подчеркивания (underscore) на какой-либо другой. (См. internal name и future language directions.) external object definition (определение внешнего объекта) Речь идет об определении реализации внешнего объекта. (См. definition, tentative.) F F suffix (суффикс F) (См. constant, floating.) f suffix (суффикс <) Суффикс, используемый в константах с пла- вающей точкой (см. constant, floating), а также в именах функций библиотеки математических функций (см future library directions). fabs Эта функция вычисляет абсолютное значение аргумента х, представляющего собой число с плавающей точкой. #mdude <math.h> double fabs(double x); fabsf Эта дополнительная функция (опция) является вариантом функции fabs, оперирующим с данными типа float. Это относится к нововведениям Стандарта языка Си. fabsl Эта дополнительная функция (опция) является вариантом функции fabs, оперирующим с данными типа long double Это относится к нововведениям Стандарта языка Си. false («ложно») Различают два логических значения, «истинно» (frue) и «ложно» (false). В языке Си результат проверки выраже- ния на «истинность» полагается равным «истинно», если выра- жение имеет ненулевое значение; в противном случае результат проверки — «ложно». При выполнении проверок выражений на «истинность» запись вида if (х) эквивалента записи if (х 1= 0) Подобные проверки можно выполнять как для адрес- ных выражений (pointer expression), так и для арифметических, поскольку нулевое значение адресного выражения представляет собой константу в виде null-указателя (null pointer constant). По определению, логические выражения, выражения отноше- ния и тождества имеют тип int и значения 0 («ложно») или 1 («истинно»). _far Согласно требованиям Стандарта языка Си, ключевые слова расширений языка должны начинаться со знака подчеркивания (underscore). Начиная с версии 6.0, система программирования Microsoft С включила в состав своих средств _far в качестве синонима far. Предполагается широкое распространение ключе- 63
вого слова такого вида в реализациях системы программирова- ния в среде MS-DOS. far Это нестандартное ключевое слово широко поддерживается системами программирования, функционирующими в 16-бито- вом режиме на микропроцессорах с сегментированной памятью, таких, как семейство Intel 80x86. Это слово используется как модификатор типа и может применяться как к объектам, так и к функциям. Например: double far table [100]; char far *«fppc; char far * far *fpfpc; long int far * far check(char far *); int (far *funptr)(void); Данные (или функции) типа far могут быть размещены в любом месте памяти; вовсе не предполагается их расположение в теку- щем сегменте данных (или кода программы). Адрес таких дан- ных (функций) имеет длину, равную 32 битам. Некоторые реализации системы программирования предостав- ляют опцию (дополнительную возможность) компилятора, при использовании которой все объявления указателей, не снабжен- ные модификатором near, far илн huge, полагаются имеющими модификатор far Имеются различия между арифметикой far-ука- зателей и арифметикой huge-указателей (см. huge). fclose Эта функция вызывает очистку потока, адресуемого указате- лем stream, и последующее закрытие соответствующего файла. i nclude <stdio.h> inf fdose(FlLE «stream); При успешном закрытии потока возвращаемое значение функ- ции fclose равно нулю. Если поток уже был закрыт или имеет место ошибка, возвращаемым значением является EOF. При аномальном завершении работы программы нет гарантии, что для потоков, открытых как выходные (output), их буферы будут очищены. Допускается закрытие файлов, на которые указывают stdin, stdout или stderr. fcntl.h Это широко используемый нестандартный объект-заголовок, предоставляющий поддержку различным средствам ввода-выво- да. feof Эта функция проверяет состояние индикатора достижения конца файла (end-of-file indicator) для файла, на который указы- вает stream. #inc!ude <$tdio.h> int feof(FILE «stream); Если индикатор «очищен», значение, возвращаемое функцией, равно нулю; в противном случае оно отлично от нуля. 64
(getpos terror Эта функция проверяет индикатор ошибок (error indicator) для файла, на который указывает stream. # include <stdio.h> int ferror(FILE «stream); Если индикатор «очищен», значение, возвращаемое функцией, равно нулю; в противном случае оно отлично от нуля. fflush Эта функция очищает буфер ввода-вывода открытого потока. Если осуществлялась операция записи в поток, любые не запи- санные данные, находящиеся в буфере вывода, записываются. #indude <stdio.h> int fflusti(FILE «stream); Функцию {flush следует использовать только с потоками, откры- тыми для вывода (output) или обновления (update) и находящи мися в текущий момент в режиме вывода (output mode). Если поток не открыт для вывода или он открыт для обновления, н предыдущая только что выполненная операция отлична от опе- рации вывода поведение функции не определено. Однако неко- торые реализации системы программирования позволяют «очи- щать» ((flushed) входные потоки. При успешном выполнении операций функция возвращает нулевое значение; в случае об- наружения ошибки возвращаемым значением является EOF. Если программа завершает свою работу аномально, нет гаран- тии, что потоки, открытые для вывода, будут иметь свои буферы очищенными. fgetc Эта функция берет очередной символ (если он имеется) из файла, на который указывает stream. #indude <$tdio.h> int fgetc(FILE «stream); Символ читается как данное типа unsigned cnar, а возвращается как данное типа int. При обнаружении признака конца файла fgetc возвращает EOF, и для этого потока «устанавливается» (получает значение 1) индикатор достижения конца файла. При появлении ошибки чтения возвращаемое значение равно EOF, и «устанавливается» индикатор ошибки для данного потока. Для проверки состояния этого индикатора можно использовать функцию (error. (См. getc.) fgetpos Эта функция записывает текущее значение индикатора позиции (position indicator) в файле (потоке stream) в объект, на который указывает pos. #indude <stdio.h> int (getposfFILE «stream, fpos_t «pos); Функция fgetpos относится к нововведениям Стандарта языка Си. Она предназначена для управления очень большими фай- лами, для которых индикатор текущей позиции в файле не 3 Заказ 677 65
fgets может быть представлен как данное типа long int (как этого требует функция (fell). Объект, адресуемый указателем pos, пригоден для использова- ния функцией isetnos с целью восстановления в файле пред- шествующей позиции. При успешном завершении операций значением, которое возвращает функция fgetpos, является нуль; в противном случае возвращается ненулевое значение, a errno получает некоторое положительное значение, определяемое кон- кретной реализацией системы программирования. fgets Эта функция читает не более n—1 символов из файла, на который указывает stream в массив, адресуемый указателем s. После прочтения последнего символа, т. е. его записи в массив, последний дополняется символом ’\0'. #indude <stdio.h> char ♦fgets(char *s, int n, FILE «stream); Если встречается «новая строка» (new line) или регистрируется факт достижения конца файла чтение символов прекращается. Будучи обнаруженным, символ «новая строка» включается в файл (чего не происходит прн использовании функции gets). После успешного выполнения операций фу нкция fge‘s возвра- щает s. Если имеет место достижение конца файла при условии, что еще ни один символ не прочитан, возвращаемым значением является NULL, а содержимое массива, на который указывает s, остается неизменным. NULL является возвращаемым значением также н при обнаружении ошибки чтения; однако в этом случае содержимое массива не определено. field (поле) (См. bit-field.) __FILE___ Это макрос, определенный Стандартом языка Си. Его следует рассматривать как имя файла с исходным текстом (source file) в форме строки символов. Макрос можно использовать в любом контексте, где допустим или требуется строковый литерал. Например: char fn«ime(J =_FILE__; printf("%s", __FILE__); Поскольку смежные строковые литералы «сцепляются» (concatenated), следующее также допустимо: printf(">%s<\n", "ххх" __FILE__ "ххх"); В некоторых реализациях системы программирования на языке Си имя файла включает также и маршруты доступа к нему (full path name). file (файл) Этот термин имеет обычный смысл, который в него вкладывается в теории и практике обработки данных. Когда 66
file opening файл открывается посредством стандартной библиотечной функции, ему ставится в соответствие поток. Последний, пред- ставленный и ««де FILE-учачателя, является средством, использу- емым для задания файла во всех последних операциях, а также для доступа к файлу. FILE Это объект, позволяющий хранить в себе «текущий контекст» открытого файла. Эта информация включает детальные сведе- ния о буферизации, флажки индикации ошибок и достижения конца файла, индикатор текущей позиции в файле. Как состав- ное данное, этот объект имеет ряд неспецифицированных членов (элементов). Программа никогда не нуждается в прямом форми- ровании объектов типа FILE; они создаются, и ими манипулируют библиотечные функции. file, source (исходный файл) Это файл, содержащий текст програм- мы, подлежащей трансляции (См. trarslai on unif ) file access functions (функции доступа к файлу) Речь идет о следу- ющих функциях, объявляемых в stdio.h: (dose fflush, (open, freopen, setbuf, sefvbu' file dosing (закрытие файла) (См. abort, exit, fdose и f«eopen ) file creation (создание файла) (См fopen и tmpfile.) file descriptor (дескриптор файла) Это нестандартный объект, при- меняемый для обозначения открытого файла. Своим происхож- дением это понятие обязано среде UNIX; дескриптор определен как небольшое числовое значение типа int Типовыми функция- ми, манипулирующими дескриптором файла являются open dose, read, write, fileno, creat, read, write, getw, putw, getch, getche и (seek file name (имя файла) Атрибуты и формат имен файлов, размеща- емых резидентно во внешней памяти (например, на магнитвътх ДИ1 как или ленте) специфичны для каждой операционной сис- темы По ггому Стандарт языка Си не определяет требования к именам фай? ов и не «полагается* на них. Функпии, подобные fopen, просто «ожидают», что имя файла будет представлено в виде массива символов, завершающегося null-символом. (См. FILENAME_MAX ) Хотя большинство систем программирования на языке Си пред- ставляют объекты-заголовки (headers) в форме текстовых фай- лов (с теми же именами) на диске, это н₽ является требованием. Имена файлов, которыми пользуются tmpFle и tmpnam, не специ- фицированы. file opening (открытие файла) (См. fopen. freopen и tmpfile.) 67
file operation functions tile operation functions (функции выполнения операций с файлами) Это объявляемые в stdio h функции remove rename, tmpfile и tmpnarr.. file pointer (указатель файла) Это указатель на объект типа FILE. tile position indicator (индикатор позиции в файле) Это член (эле- мент) каждого объекта типа FILE; тип этого члена — fpos_*. Когда файлы, расположенные в устройствах с поддержкой запросов о текущей позиции, открываются для чтения или записи, данный индикатор указывает на начало файла. Если файл открывается для дополнения (append) индикатор указывает на начало или конец файла в зависимости от реализации системы программи- рования. Значение индикатора определяется текущим положе- нием и операциями функций ввода-вывода; это значение про- граммисту непосредственно недоступно. (См. file positioning functions.) file positioning functions (функции позиционирования файла) Речь идет об объявляемых в stdio.h функциях fgetpos, (seek, fsetpos, ftell и rewind. FILENAME_MAX Этот макрос, определяемый в файле stdio.h, явля- ется целочисленным константным выражением, значение кото- рого — максимально допустимая длина строки символов, явля- ющейся именем файла. Это значение зависит от реализации системы программирования. Данный макрос относится к ново- введениям Стандарта языка Си. float Это ключевое слово, применяемое при определении одного из трех типов чисел с плавающей точкой. (Два других типа — это double и long double.) Традиционно double означает «двойная точность», a float — «одинарная точность». Существовала также традиция расширять данные типа float до их представления в формате double, когда подобные данные используются в выраже- ниях или в качестве параметров функций. Однако Стандарт языка Си позволяет применять данные типа float без расшире- ния. (См. conversion, function arguments и floating type.) float h Этот объект-заголовок содержит семейство макросов, кото- рые описывают свойства арифметики с плавающей точкой сис- темы. В то время как Стандарт языка Си формулирует опреде- ленные предельные (минимальные или максимальные) требования задание действительных значений документируется реализацией системы программирования. Указанные макросы имеют префиксы FLT, DBL и LDBL, обозначающие типы float, double и long doub'e соответственно. (Отметим, что несколько обобщен- ных атрибутов «плавающей точки» имеют префикс FLT, хотя они и не являются специфически float.) Ниже приводится полный перечень макросов. 68
floor! DBL.DIG FLT.EPSILON LDBL.DIG DBL.EPSILON FLT_MANT_DIG LDBL-EPSILON DBL_MANT_DIG FLT_MAX ldbl_mant_dig DBL.MAX FLT_MAX_ 10.EXP LDBL-MAX DBL_MAX_10_EXP FLT_MAX_EXP LDBL_MAX_IO_EXP DBL_MAX_EXP FLT.MIN LDBL-MAX _EXP DBL.MIN FLT_MIN_10_EXP LDBL_M1N DBL_M!N_10_EXP FLT_MIN_EXP LDBL_MIN_ 10_EXP DBL_MIN_EXP FLT.RADIX LDBL_MIN_EXP FLT_DIG FLT.ROUNDS Только для FLT .RADIX гарантируется расширение константного выражения этапа трансляции таким образом, чтобы оно (выра- жение) оказалось пригодным к применению в директиве #if. (См. environmental limits.) Данный объект-заголовок относится к нововведениям Стандарта языка Си. floating suffix, f or F (суффиксы f и F для типа «плавающая точка») (См constant, floating.) floating suffix, 1 or L (суффиксы 1 и L для типа «плавающая точка») (См constant, floating.) floating type (тип «плавающая точка»! Объект этого типа обычно представляется в виде дробной части (мантиссы) и экспоненци- альной части (порядка). Различают три таких типа: float, double и long double (это относится к нововведениям Стандарта языка Си). Объект типа long double должен иметь диапазон возможных зна- чений и точность по меньшей мере такие же, как у объекта типа double, который в свою очередь должен иметь эти параметры по меньшей мере такие же. как и объект типа float. Следовательно, два или более из этих трех типов могут совпадать по формату представления данных. Объект-заголовок float.h можно использо- вать для определения атрибутов типов «плавающая точка» со- гласно реализации системы программирования. Все три эти типа являются арифметическими. floor Эта функция вычисляет наибольшую целую часть аргумента х, значение которой не превосходит значение х. #indude <ma*h.h> double floor(double x); Вычисленная целая часть возвращается как данное типа double. floorf Эта дополнительная функция (опция) является вариантом функции floor, оперирующим с данными типа float. Она относит- ся к нововведениям Стандарта языка Си. floorl Эта дополнительная функция (опция) является вариантом функции floor, оперирующим данными тнпа long double. Она относится к нововведениям Стандарта языка Си. 69
FLT DIG FLT DIG Этот макрос, определяемый в floe*.h, обозначает количество десятичных цифр, такое, что число типа float, имеющее это количество значащих цифр, может быть округлено в число с плавающей точкой и обратно без изменения этого количества значащих цифр. Это относится к нововведениям Стандарта язы- ка Си. FLTEPSILON Этот макрос, определяемый в float.h, обозначает раз- ницу между 1.0 и наименьшим значением, которое больше, чем 1.0 и при этом представимо как данное типа floaf. Это относится к нововведениям Стандарта языка Си, FLT MANT DIG Этот макрос, определяемый в float.h. обозначает число цифр основания счисления FLT_RAD1X в значащей части представления с плавающей точкой значения типа float. Это относится к нововведениям Стандарта языка Си. FLT МАХ Этот макрос, определяемый в float.h, обозначает макси- мальное представимое конечное число типа float. Это относится к нововведениям Стандарта языка Си. FLT МАХ_10_ЕХР Этот макрос, определяемый в float.h, обозначает максимальное целое число; при использовании которого в каче- стве степени числа 10 результат возведения в степень еще не выходит за пределы диапазона допустимых значений чисел с плавающей точкой, имеющих конечную форму представления. Это относится к нововведениям Стандарта языка Си. FLT МАХ ЕХР Этот макрос, определяемый в float.h. обозначает максимальное целое число, при использовании уменьшенного на единицу значения которого в качестве степени числа FLT_RADIX результат возведения в степень является числом с плавающей точкой, имеющим конечную форму представления. Это относится к нововведениям Стандарта языка Си. FLT_MIN Этот макрос, определяемый в float.h. обозначает мини- мальное нормализованное положительное число типа float. Это относится к нововведениям Стандарта языка Си. FLT MIN 10 ЕХР Этот макрос, определяемый в float.h, обозначает минимальное отрицательное число, при использовании которого в качестве степени числа 10 результат возведения в степень еще не выходит за пределы диапазона допустимых значений чисел с плаваюшей точкой, имеющих конечную форму представления. Это относится к нововведениям Стандарта языка Си. FLTMIN ЕХР Этот макрос, определяемый в float.h. обозначает минимальное целое число, при использовании уменьшенного на единицу значения которого в качестве степени числа FLT_RAD1X результат возведения в степень является нормализованным чис- лом с плавающей точкой. Это относится к нововведениям Стан- дарта языка Си. FLT RADIX Этот макрос, определяемый в floaf.h. обозначает основа- ние степени (экспоненциального представления числа). Данный макрос расширяется до константного выражения этапа трансля- 70
(open ции. пригодного для использования в директиве #.f. Это отно- сится к нововведениям Стандарта языка Си. FLT_ROUNDS Этот макрос, определяемый в floaf.h, обозначает теку щий режим выполнения округления. В Стандарте языка Си определены режимы от -1 до 3. Все остальные значения опреде- ляются реализацией системы программирования. Этот макрос относится к нововведениям Стандарта языка Си. fmod Эта функция вычисляет остаток от деления х/у согласно арифметике чисел с плавающей точкой. #indude <mafh.h> double fmod(double x. double y); Значение, возвращаемое функцией, равно х - i*y. где i — целое число такое, что при ненулевом значении у знак результата совпадает со знаком х, а величина значения результата меньше, чем величина значения у. Если у равен нулю, то от реализации системы программирования зависит регистрация ошибки «вы- ход за пределы области определения» или возвращение функ- цией fmod нулевого значения. fmodf Эта дополнительная функция (опция) является вариантом функции fmod, оперирующим данным типа float. Это относится к нововведениям Стандарта языка Си. fmod] Эта дополнительная функция (опция) является вариантом функции fmod оперирующим данными типа long double. Это относится к нововведениям Стандарта языка Си. fopen Эта функция открывает файл. На имя которого указывает filename, в режиме, задаваемом mode. #inc!ude <sfdio.h> FILE *fopen(consf char «filename, const char «mode); mode указывает на строку символов, содержимым которой долж- на быть одна из следующих последовательностей символов: г. w. a, rb, wb. ab. г+, w+ а+, гЬ+, wb+, ab+, г+Ь. w+b или а4-Ь. Режим г означает «чтение» (read), w — «запись» (write) или создание файла, если ранее он не существовал, а — «добавление» (append). Если режим Ь не указан, предполагается, что файл — это текстовый поток (text stream); в противном случае файл — это бинарный поток (binary stream) Наличие в указании режи- ма символа + (плюс) означает, что файл открыт для обновления (update). Набор режимов вида г?+ эквивалентен набору г+?. В результате успешного выполнения функции fopen возвращае- мым значением является FILE-указатель на открытый поток; в случае неудачи возвращаемым значением функции является NULL. Отметим, что реализация системы программирования мо- жет ограничить число одновременно открытых файлов FOPEN_MAX задает допустимое число одновременно открытых 71
FOPEN MAX файлов; попытка превышения значения FOPEN_MAX приводит к неудаче выполнения fopen. Выполнение этой функции влечет за собой очистку индикаторов ошибок и признака достижения конца файла. Стандартные потоки stderr, stdin и stdout открываются автомати- чески при пуске программы, а следовательно, нет необходимо- сти открывать эти потоки явным образом. (См. FOPEN_MAX и f-eoper ) FOPEN МАХ Этот макрос, определяемый в stdio.h, является цело- численным константным выражением, значение которого — ми- нимальное число файлов, которое можно открыть одновременно согласно гарантиям используемой Вами системы программиро- вания. Стандарт языка Си требует, чтобы это значение было равно по меньшей мере восьми, включая stdin, stdout и stderr. Имя этого макроса относится к нововведениям Стандарта языка Си. Прежде подобные макросы имели имена SYS_MAX и OPEN_MAX Файлы, создаваемые функцией tmpfile, сокращают возможности, определяемые данным макросом. В некоторых системах указан- ный предел могут «делить» между собой порождающий и порож- даемый процессы (parent and child processes) for Речь идет о конструкции, обеспечивающий организацию цикла с проверкой критерия его окончания перед выполнением оче редиой итерации (подобно тому, как это делается в цикле while, и в отличие от цикла do. ..while, выполняющего по меньшей мере одну итерацию). Данный цикл имеет следующий формат: for ([выр/]; [выр2]; [вырЗ]) команда Прежде всего вычисляется значение выражения выр/. поскольку результат вычислений имеет побочные эффекты. Затем опреде- ляется значение выражения выр2. Если последнее оценивается как «ложное» (false), тело цикла не выполняется (его «обходят»). Если же значение выр2 оценивается как «истинное» (true), вы- полняется команда (тело цикла); после этого вычисляется выра- жение вырЗ, поскольку важны его побочные эффекты. Далее процесс повторяется, начиная с выражения выр2. Все три выражения не являются обязательными в конструкции команды for. Если отсутствует первое выражение, не осуществ- ляется инициализация. Отсутствие второго выражения интерп- ретируется так, как будто бы оно присутствует и всегда имеет значение «истинно». При отсутствии третьего выражения «не- чего делать» в конце каждой итерации Конструкция for всегда может быть заменена на конструкцию while, и наоборот. Напри- мер, приведенный выше for может быть заменен эквивалентным while [ выр1; ] while (выр2) ( команда 72
f print f [ вырЗ; ] } — с одним исключением: в цикле while выражение выр2 должно присутствовать всегда. Каждое из выражений — выр1, выр2 и вырЗ — являются полными (full expression). form feed (перевод страницы) Это один из так называемых пустых (white space) символов, допускаемых в исходном тексте програм- мы, а также в качестве входного данного для некоторых библио- течных функций. form-feed escape sequence (управляющая последовательность пере- вода страницы) Эта управляющая последовательность может быть представлена в виде \f. formatted I/O (форматированный ввод-вывод) Речь идете семейст- ве функций printt, которые обеспечивают форматированный вывод в стандартный поток (обычно экран дисплея или бумага принтера), в файл на диске или память, а также о семействе функций scant, обеспечивающих форматированный ввод из ана- логичных потоков и устройств. _fortran Стандарт языка Си требует, чтобы ключевые слова расши- рений начинались со знака подчеркивания (underscore). Начи- ная с версии 6.0, система программирования Microsoft С добав- ляет _fortran в качестве синонима fortran. Ожидается, что это ключевое слово получит широкое распространение в приложе- ниях, базирующихся на MS-DOS. fortran Это нестандартное ключевое слово широко используется в системах программирования, функционирующих под управле- нием MS-DOS (а также и в среде других операционных систем). Оно применяется для указания, что для межпроцедурных связей (inter-procedure linkage) следует использовать Fortran-метод. Он определяет способ «прочтения» внешних имен в сгенерирован- ном коде (например, к именам могут быть добавлены ведущие знаки подчеркивания или буквы имени могут преобразовывать- ся из строчных в прописные). Он может также заставлять вызы- вающий модуль очищать стек после того, как вызываемая фун- кция возвращает управление. (См. cded, -fortran и pascal.) fpos t Объекты этого типа используются функциями fgetpos и fsetpos. Данные этого типа отображаются в данные типа большего размера, достаточного для размещения самого большого возмож- ного значения индикатора текущей позиции в файле для конк- ретной реализации системы программирования. Это относится к нововведениям Стандарта языка Си; определение fpos_f дано в stdio h. fprlntf Эта функция помещает форматированные данные в файл, задаваемый посредством stream, согласно формату задаваемому с помощью format Данная функция является обобщенным вари- антом функции printf. 73
fp ufc #incl_de <stdio.h> int fprinff(FILE ^stream const char *format, ...); Обращение к printf эквивалентно обращению к fprinF использу- ющей в качестве потопа stdout. (См. pnntt. где объясняется format и возвращаемое значение.) fputc Эта функция помещает символ, задаваемый посредст вом с (преобразуемый в данное типа unsigned chart, в файл, на который указывает stream #inc!ude <stdio.h> inf fputc(inr c. FILE •stream); При успешном выполнении функции возвращаемым ею значе- нием является символ, записываемый в файл. При возникнове- нии ошибки записи значением, которое возвращает функция, является EOF; при этом для заданного потока устанавливается индикатор ошибки. Для проверки состояния этого индикатора можно использовать функцию (error (См. pufc ) fputs Эта функция записывает строку символов, адресуемую по средством s, в файл, на который указывает stream #indude <stdio.h> mt fputs(const char *s, FILE ♦sn-eam); Символ '\0'. завершающий заданную строку символов, записи в файл не подлежит В отличие от puts, функция fputs не допол няет записываемую строку символов символом «новая строка* (new-line) Если в процессе записи имеет место ошибка, функ- ция fputs возвращает ECF в случае благопр иятного исхода воз- вращаемым значением функции является неотрицател; ное чис- ло. frac_dlgits Этот член (элемент) структуры Iconv является неотрипа тельным числом, которое представляет количество цифр в дроб- ной части (т. е. после десятичной точки! числа, подлежащего воспроизведению как форматированная монетарная величина. fread Эта функция читает до nmemb элементов, каждый из которых размером size, в массив, адресуемый указателем ptr, из файла, на который указывает stream. #inc*ude <stdio.h> size_t f-ead(void »ptr, size_t size, size.* nmemb FILE «stream); При возникновении ошибки значение индикатора позиции в файле не определено. Значение, которое возвращает функ- ция — это количество элементов прочитанных успешно. Это число может быть меньше, чем nmemb. если имеют место ошибки ид и обнаружен конец файла При равенстве нулю значения size или nmemb, значение, которое возвращает функция, равно ну- 74
frexpf лю, а содержимое массива, на который указывает ptr, остается неизменным. (См. (write.) free Эта функция освобождает область памяти (ранее выделенную с помощью calloc, mallee или realloc), на которую указывает ptr. #indude <stdlib.h> void free(void *p*r). Если ptr — это NULL, to free ничего не выполняет. В противном случае, если ptr не является значением одной из функций, предварительно выделивших область памяти поведение функ- ции free не определено. Значение указателя который адресует «освобожденную» область памяти, неопределенно, такие указа- тели не следует применять для адресации к памяти. Отметим, что функция free не располагает средством передачи ошибки, возни- кающей при ее выполнении. freestanding environment (среда стоящих «особняком» программ) (См. environment, freestanting; cross-compilation.) freopen Эта функция почти идентична функции (open за исключе- нием того, что treopen использует заново существующий FlLE-ука- затель, который адресуется к текущему открытому файлу. #<ndude <sfdio.h> FILE »freopen(const char «filename, const char «mode, FILE «stream); Назначение параметров filename и stream такое же, как и для функции fopen. При успешном выполнении функция freopen возвращает значение stream; в противном случае возвращаемым значением функции является NULL. Сначала freope 1 пытается закрыть файл, соответствующий указателю stream. Любые неуда- чи игнорируются. Индикаторы ошибок и достижения конца файла очищаются. frexp Эта функция «разбивает» число с плавающей точкой value на нормализованную дробную часть и целую часть как степень числа 2. # include <math.h> double frexp(doubte value, inf «exp); Целочисленная степень записывается в область памяти, на кото- рую указывает ехр, а дробная часть используется как значение, которое возвращает функция. Величина возвращаемого значе- ния равна нулю или принадлежит интервалу [1/2, 1). a value равно х х 2'ггр. Если value равно нулю, то как возвращаемое функцией значение, так и «ехр равны нулю. frexpf Эта дополнительная функция (опция) является вариантом функции frexp. оперирующим данными типа float. Это относится к нововведениям Стандарта языка Си. 75
frexpl frexpl Эта дополнительная функция (опция) является вариантом функции ''ехр оперирующим данными типа long double. Это относится к нововведениям Стандарта языка Си. friend Это ключевое слово языка Си++ не входит в состав средств Стандарта языка Си. Если в будущем Вы предполагаете исполь- зовать программы, написанные на языке Си, в среде Си-Н, следует избегать применения friend в качестве идентификатора fscanf Эта функция читает форматированные входные данные из файла, на который указывает stream, согласно формату, задава- емому посредством format. Эта функция является обобщенным вариантом функции scant. #indude <stdio.h> int fsca if(FILE *stream const char *forrrat, ...); Отметим, что все параметры должны передаваться своими адре- сами (передача по адресу). Обращение к scant эквивалентно обращению к fscanf, использующей поток stdin (См. scant, где описываются format и возвращаемое значение.) fseek Эта функция присваивает параметр} offset значение индика- тора текущей позиции в файле, исходя из значения whence. #indude <stdio.h> inf fseek(FILE ♦stream, long int offset, int whence); В качестве whence можно использовать один из трех макросов 5EEK_SET SEEK_CUR или зЕЕК .END в зависимости от выбора точки отсчета положения в файле: начало, текущая позиция или конец файла соответственно. В случае успешного выполнения функ- ция fseek очищает индикатор конца файла, отбрасывая любые символы, которые могли быть «вытолкнуты» обратно в поток (stream) и возвращает нуль. При неудаче значение, возвращае- мое функцией, отлично от нуля Для очень больших файлов, в которых значение индикатора текущей позиции не может быть представлено как данное типа long int (как этого требует (seek), следует использовать функцию fse'pos. (См. ftell.) fsetpos Эта функция присваивает значение индикатора текущей позиции в файле, на который указывает stream, об ьекту адресу- емому указателем pos. #indude <stdio.h> int fsetpos(FILE »s*rea-n, const fpos_t *pos). В случае успешного выполнения >se*pos возвращает нуль, очи- щает индикатор конца файла и отбрасывает символы, которые могли быть «вытолкнуты» обратно в поток stream посредством функции ungetc. Ери неудаче функция возвращает ненулевое значение, a errno присваивается положительное значение, опре- деляемое конкретной системой программирования. Функция fsetpos относится к нововведениям Стандарта языка Си. (См. fgetpos и fseek.) 76
function call operator ftell Эта функция возвращает значение индикатора текущей пози- ции в файле, на который указывает stream #include <stdio.h> long int ftell(FlLE *stream); В случае неудачи значение, возвращаемое функцией, равно —1L, а е-mo присваивается положительное значение, определяемое кон- кретной реализацией системы программирования. Для очень больших файлов, в которых значение индикатора текущего поло- жения не может быть представлено как данное типа long int (как этого требует ftell), следует применять функцию fgetpos (См. fseekj full expression (полное выражение) (См. expression, full.) fully buffered stream (поток буферизуемый полностью) Понятие «полная буферизация» не определено. (См. JOFBF и setvbuf.) function (функция) Это базовый выполняемый модуль в программе на языке Си. Синонимами этого понятия являются процедуры и подпрограммы, как они определены в других языках программи- рования. Все функции в языке Си имеют единый формат (как описано в function definition), включая функцию main. Любая функ- ция может иметь параметры (аргументы), формировать возвра щаемое ею значение или быть без параметров, либо не возвра- щать ничего; возможны функции без параметров, не возвращающие ничего. В языке Си определения функций не могут быть вложенными. function argument (аргумент или параметр функции) (См. argument) function body тело (тело функции) Это часть определения функ- ции, ограниченная фигурными скобками {), которая следует непосредственно за декларативной частью, начинающей опреде- ление функции. Например: void f(int i, double d) I /♦ тело функции начинается здесь »/ } /» здесь заканчивается тело функции »/ void f(i, d) int i; double d; ( /» гело функции начинается здесь ♦/ } / ► здесь заканчивается тело функции ♦/ function call (вызов функции) Это акт обращения к функции, ис- пользующий знак операции вызова функции, а именно круглые скобки (). function call operator (знак операции «вызов функции») Этот знак операции имеет следующую обобщенную форму: выр! ( [выр2 (, вырЗ] ...] ) 77
function declarator где выр! обозначает функцию, подлежащую вызову, а выр2, вырЗ, ... — это параметры, передаваемые этой функции. Порядок вычисления всех этих выражений не определен, однако после вычисления всех выражений имеет место точка следования (sequence point) непосредственно перед фактическим обраще- нием к функции. Тип результата — это тип данного, возвраща- емого функцией: это может быть данное скалярного типа, струк- тура. объединение или данное незавершенного типа void. Операция вызова функции ассоциативна слева. function declarator (декларатор функции) Речь идет об объявлении функции согласно форме D (спасок_тилов_и_параметров) как, например void f(int i, double d) или в несколько отличной форме D (необязательный__список_параметров) как в случае void f(i, d) (См. future language directions.) function definition (определение функции) Определение (описа- ние) функции выполняется согласно следующей обобщенной форме: необязательные_спецификаторы_объявлений декларатор необязательный_список_объявлений соапавная_команда где составная _команда — это тело функции. (См. future language directions.) function designator (обозначение функции) Это выражение, тип ко- торого — это тип обозначаемой им функции. В большинстве случаев такое выражение преобразуется в указатель на эту функцию. Наиболее обычный способ обозначить функцию сво- дится к использованию ее имени. Однако этого же результата можно добиться разыменованием (dereferencing) указателя на функцию. Например, имея объявления вида void f(inf); void (*pf)(int) = f; void (**pf)(inf) = &pf; можно утверждать, что функция f может быть обозначена как f или одним из выражений *pf, либо »*pf. (См- conversion, function.) function library (библиотека функций) Это набор функций, кото- рый может включать следующее: функции, определяемые со- гласно Стандарту языка Си; дополнительные функции (опции), определяемые конкретной реализацией системы программиро- 78
future directions вания; функции, определяемые пользователем, или комбинации перечисленных категорий функций. function name (имя функции) Идентификаторы, применяемые для наименования функций, разделяют общее «пространство имен» с константами перечисляемых типов, переменными и именами, определяемыми с помощью typedef. function parameter (параметр или аргумент функции) (См. para- meter.) function prototype (прототип функции) Речь идет об объявлении (declaration) функции с указанием списка типа параметров. Каждый параметр в списке может быть представлен не только типом (обязательно), но и именем (необязательно). Понятие «прототип» заимствовано Стандартом языка Си из Си++. Напри- мер, прототип void f(int i, double d); объявляет, что f — это функция, требующая два параметра (одип параметр типа int, другой — типа double) и не возвращающая никакого значения. «Старомодная» запись объявления этой функции имела бы следующий вид: void f(); По сути дела, прототип — это тот же «старомодный» способ объявления функции с включением в него списка параметров. Новый стиль определения (definition) функции также определен Стандартом языка Си. Прототип используется как способ записи и при определении (описании) функции. function return (возврат из функции) Это явно или неявно указан- ный возврат из вызываемой функции в вызывающую. (См. return.) function type (тип функции) В это понятие включают и тип пара- метров функции, и тип возвращаемого ею результата (связанно- го с именем функции). (См. function designator.) function type conversion (преобразование типа функции) (См. con- version, function.) future directions (перспективы) Стандарты языков программирова- ния подлежат периодической ревизии (пересмотру) частично с целью корректировки выявленных недостатков и ь значительной мере для предоставления поддержки новым устройствам, клас- сам приложений и средам. (Для стандартов ANSI ХЗ подобная ревизия имеет место, как правило, каждые 10 лет.) Стандарт языка Си содержит некоторое руководство для тех, кто воплощает положения Стандарта в конкретных реализациях системы про- граммирования, а также для пользователей; это руководство освещает те области, в которых ожидается ревизия в будущем. (См fu*ure language directions и future library directions.) Очередная ревизия положений Стандарта может отменить поддержку тех 79
future language directions свойств языка, которые вышли из употребления в процессе эксплуатации предыдущих версий языка. future language directions (перспективы развития языка программи- рования) Стандарт языка Си содержит определенным образом сформулированное руководство для пользователей и разработ- чиков систем программирования, освещающее области описа- ния языка, которые могут подвергнуться ревизии из-за пересмот- ра Стандарта или его дополнения как расширения возможностей с целью удовлетворения новых требований реализации системы программирования. Приводимый ниже перечень критических замечаний заимствован непосредственно из Стандарта языка Си. external names (внешние имена) Ограничение значащей части внешнего имени меиее чем 3 1 символом, а также «чувстви- тельность» к положению регистра (верхнего или нижнего) является устаревшим и рассматривается как уступка сущест- вующим реализациям системы программирования. character escape sequences (символьные управляющие последо- вательности) Строчные буквы (нижнего регистра) как уп- равляющие последовательности зарезервированы для стан- дартизации в будущем. Другие символы могут использоваться в расширениях. storage-class specifiers (спецификаторы классов памяти) Разме- щение спецификатора класса памяти не в начале специфи- каторов объявления в объявлении является устаревшим ре- шением. (Рекомендация: ставьте спецификатор класса памяти первым сейчас, чтобы ие беспокоиться об отказе в будущем от существующей практики альтернативного раз- мещения не в начале объявления.) function declarators (объявления функции) Применение объяв- лений функции с пустыми круглыми скобками («непрото- типный» формат объявления функции) является устарев- шим решением. (Рекомендация: используйте «прототипный» формат объявления функции сейчас, чтобы не беспокоиться в будущем в связи с отказом от указанной устаревшей прак- тики.) function definitions (определения функций) Применение в оп- ределении функции раздельной записи имени функции и списка параметров с указанием их типов («иепрототинный» формат описания заголовка функции) является устаревшим решением. (Рекомендация: используйте «прототипный» формат сейчас во избежании проблем в будущем.) array parameters (параметры массива) Использование двух па- раметров массива (до их «подстройки» в форме указателей) ь раздельных именующих выражениях (lvalue) для обозначе- ния одного и того же объекта является устаревшей практи- кой. 80
future library direction* future library directions (перспективы развития библиотек функ- ций) Стандарт языка Си содержит некоторое руководство для пользователей и разработчиков систем программирования, ос- вещающее области применения библиотечных функций, для которых может быть выполнена соответствующая ревизия Стан- дарта или дополнение расширениями в соответствии с требова ниямн приложений. Приводимый ниже перечень замечаний заимствован непосредственно из Стандарта языка Си. Перечис- ляемые названия сгруппированы под наименованиями объек- тов-заголовков (headers) для удобства. Все внешние имена, опи- сываемые ниже, зарезервированы независимо от того- какие объекты-заголовки включаются в текст программы. Character handling <ctype.h> (операции над символами) Функ- ции, имена которых начинаются иа is или to и строчные буквы (за которыми следует любая комбинация цифр, букв и знаков подчеркивания), могут быть добавлены к объявле- ниям (declarations) в <с+уре h>. Errors <errno.b> Макросы, имена которых начинаются с буквы Е и цифры либо с Е и прописной буквы (за которыми следует любая комбинация цифр, букв и знаков подчеркивания), могут быть добавлены к объявлениям в <errno.h>. Localization <locale.h> Макросы, имена которых начинаются с LC_ и прописной буквы (за которыми следует любая комби- нация букв, цифр и знаков подчеркивания), могут быть добавлены к объявлениям в <Iocale.h>. Mathematics <math.h> Имена всех существующих функций, объ- являемых в <math.h> и имеющих суффикс f или I, зарезерви- рованы для функций с параметрами и возвращаемыми зна- чениями типа float и long double соответственно. Slgnal handling <signal.h> Макросы, имена которых начинаются с SIG и прописной буквы, либо S1G_ и прописной буквы (за которыми следует любая комбинация цифр, букв или знаков подчеркивания), могут быть добавлены к объявлениям в <signal.h>. Input/output <stdlo.h> Строчные буквы могут быть добавлены к спецификаторам преобразований (conversion specifier) в fprintf и fscanf. Другие символы могут быть использованы в расширениях. General utilities <stdlib.h> (утилиты общего назначения) Функ- ции, имена которых начинаются с str и строчной буквы (за которыми следует любая комбинация цифр, букв и знаков подчеркивания), могут быть добавлены к объявлениям в <stdlib.h>. String handling <string.h> (операции co строками символов) Фун- кции, имена которых начинаются с str, mem или wcs и строч- ной буквы (за которыми следует любая комбинация цифр, букв и знаков подчеркивания), могут быть добавлены к объ- явлениям в <string.h>. 81
(write fwrite Эта функция помещает до nmemb элементов, каждый из которых размером size, из массива, адресуемого указателем ptr, в файл, на который указывает stream. •Xfindude<stdio.n> size_f fwrite( const void *ptr, s>ze_t size, size_t nmemb, FILE «stream); Если имеет место ошибка, значение индикатора позиции в файле не определено. Возвращаемое значение — это число ус- пешно прочитанных элементов. Это число может быть меньше, чем nmemb, если имеет место ошибка. (См. fread ) G general utility library (библиотека утилит общего назначения) (См. stdlib.h.) getc Эта функция извлекает очередной символ (при его наличии) из файла, на который указывает stream. #include<stdio.h> int getc(FILE «stream); Функция getc эквивалента функции fgetc за исключением того, что для де*с допускается существование одноименного «ненадеж- ного» (unsafe) макроса. getchar Эта функция извлекает очередной символ (при его нали- чии) из стандартного потока stdin. #indude <stdio.h> inf ge<char(void); Функция getchar эквивалента функции getc(sfdin). Следовательно, getchar может быть реализована в виде одноименного «ненадеж- ного» (unsafe) макроса. getenv Эта функция осуществляет поиск в списке переменных среды (environment list) строку символов, которая совпадает со строкой, на которую указывает name #includ-s <stdlib.h> char «getenv(const char «name); Список переменных среды поддерживается средой функциони- рования (host environment) системы программирования и спи- сок имен имеющихся переменных среды определяется конкрет- ной реализацией среды. Возможно, что последняя даже ие 82
goto поддерживает строки символов в списке и в подобном случае попытка выполнения getenv может всегда терпеть неудачу. Значения, которое возвращает getenv. — это указатель на строку символов, «совпадающую» со строкой, на которую указывает name. Если такое совпадение обнаружить яе удается, возвраща- емое значение равно NULL. Поведение функции не определено, если вы попытаетесь модифицировать содержимое строки, на которую указывает возвращаемое значение. (См. также ervp и putenv | gets Эта функция читает символы из stdin в массив, на который указывает s до тех пор, пока не встретится «новая строка» (new-line) или не будет достигнут конец файла. После записи последнего прочитанного символа в массив туда добавляется (appended) *\0'. #indude <stdio.h> cnar *gets(char *s); Если встречается «новая строка», она отбрасывается (в отличие от действия функции (gets, удерживающей «новую строку»). Если выполнение gets успешно, эта функция возвращает s. При обнаружении конца файла, когда не прочитан еще ни один символ, значением, которое возвращает gets, является NULL, а содержимое массива, адресуемого посредством s, сохраняется неизменным. NULL является возвращаемым значением также при обнаружении ошибки чтения, однако в этом случае содер- жимое массива не определено. gmtime Эта функция преобразует календарное время, на которое указывает timer в календарное время расчлененное на компонен- ты (broken-down time) и представленное в форме GMT (Greenwich Mean Time — среднее время по Гринвичу). #indude <time h> struct tm ♦gmtimeiconsf time_t «timer); Возвращаемым значением функции является указатель на пре- образованный объект или NULL, если GMT не доступна. В насто- ящее время GMT называется UTC (Universal Time Coordinated — универсальное скоординированное время) goto Это ключевое слово является частью команды безусловной передачи управления в какую-либо «точку» той же самой функ- ции, где находится та метка, которую программист указал после goto. Обобщенный формат команды и ее применение: goto идентификатор; идентификатор: команда (См. longjmp, где содержится информация о нелокальных перехо- дах.) 83
greater-than operator greater-than operator (знак операции отношения «больше*) Знак двухместной операции сравнения «больше» (>) позволяет сопо- ставлять два операнда арифметического типа, либо два указателя на объекты совместимых типов или объекты незавершенных типов. Порядок вычисления операндов не задан. Результат вы- полнения операции имеет тип int и принимает значение 0 («лож- но») или 1 («истинно»). Операция ассоциативна слева. greater- than-or-equal-operator (знак операции отношения «больше или равно») Знак двухместной операции сравнения «больше или равно» (>=) позволяет сопоставлять два операнда арифме- тического типа либо два указателя на объекты совместимых типов или объекты незавершенных типов. Результат выполне- ния операции имеет тип int и принимает значение 0 («ложно») или 1 («истинно»). Операция ассоциативна слева. grouping (группировка) Выражение может включать более одного знака операции. В таком случае действует правило приоритета выполнения операций, осуществляющее группировку членов выражения. Используя круглые скобки, можно менять правило группировки, устанавливаемое по умолчанию. Группировка не влияет на порядок вычисления отдельных членов выражения. (См. parentheses punctuator.) grouping Это член структуры Iconv, являющийся указателем на строку символов, элементы которой обозначают размер каждой группы цифр форматированной монетарной величины. Если строка символов имеет вид это свидетельствует об отсутствии значения в текущей «культурной среде» (locale) или равенстве ее размера нулю. Элементы строки интерпретируются следую- щим образом: CHAR_MAX Группировка в дальнейшем выполнению не подле- жит О Предыдущий элемент подлежит повторению для оставшихся цифр. other Целочисленное значение — число цифр, которые состав- ляют текущую группу. Очередной элемент подлежит анализу для определения размера следующей группы цифр перед текущей группой. н header (объект-заголовок) Это объект, содержимое которого стано- вится доступным посредством директивы препроцессора ^include. Объект-заголовок необязательно должен существовать в форме текстового файла; он может храниться как двоичный (бинарный) файл или быть определен в трансляторе. Обычно объект-заголовок содержит объявления функций (function decla- 84
header, standard rations) и определения макросов (macro definitions). Он может также содержать typedef и объявления структур, объединений и данных перечисляемого типа. Объекты-заголовки могут быть вложены один в другой до определенной глубины (по меньшей мере равной восьми), которая зависит от реализации системы программирования. Согласно Стандарту языка Си доступ к объ- ектам-заголовкам осуществляется посредством следующей нота- ции: #indude <имя_объекта- 1аголовка> Объекты-заголовки, сформированные пользователем, доступны следующим образом: #indude "имя_объекта -заголовка" header, name of (имя объекта-заголовка) Имя объекта-заголовка как препроцессорной лексемы имеет одну из следующих форм: <Л-сЛаг-последовательносгпь> "д char-последовательность" где h-char последовательность может содержать любой элемент набора символов, используемых в исходном тексте программы, исключая символ «новая-строка» (new-line) и знак «больше» (), а q-char-последовательность может включать любой элемент на- бора символов, используемых в исходном тексте программы, исключая символ «новая-строка» и двойные кавычки (") Имена объектов-заголовков распознаются как таковые только в контек- сте директивы #indude. Если в последовательности символов, заключенной между разде- лителями < и > встречается одинарная кавычка (')• наклонная черта влево (\), двойная кавычка (") или символы /♦, то действие директивы #mdude <последователыюсть-символов> или директивы #indude "последовательность -символов" соответственно не определено. Если в последовательности сим- волов, заключенной между разделителями " и " встречается одинарная кавычка ('), наклонная черта влево (\) или символы /♦, то действие этих директив также не определено. То же самое можно сказать о наличии символов, сочетание которых подобно одной из управляющих последовательностей (escape sequences). (Имена каталогов MS-DOS используют символ «наклонная чер- та влево» для отделения имени одного подкаталога от имени другого подкаталога. Поэтому директива типа #>ndude "\abs.h" не предсказуема в своем «поведении».) header, standard (стандартный объект-заголовок) Каждая библио- течная процедура, определенная Стандартом языка Си, имеет объявление в соответствующем объекте-заголовке. Ниже приво- 85
heap дится перечень наименований и назначений стандартных объ- ектов-заголовков. Объекты-заголовки для стандартных библиотек Объект- заго- ловок Назначение assert.h ctype.h errro.h float h limits, h Диагностика программ Преобразование и проверка символов Проверка ошибок Работа с данными с плавающей точкой Определение размеров целочисленных данных locaie.h mathub sefjmp.h signal, h stdarg.h stddef.h stdio.h stdlib.h string, h time.h Поддержка интернациональной среды Математические функции Возможности нелокальных переходов Обработка сигналов Поддержка переменных параметров Разное Функции ввода-вывода Утилиты общего назначения Функции работы со строками символов Функции дат и времени Все внешние идентификаторы, объявляемые в стандартных объ- ектах-заголовках, являются зарезервированными именами неза- висимо от того, имеет ли место в текущий момент обращение к соответствующему объекту-заголовку. Стандартные объекты-заголовки могут быть включены в текст программного модуля в любом порядке и несколько раз в пределах одной и той же области их действия без всяких отрицательных побочных эффектов. Исключением является assert.h, при много- кратном включении которого возможно различное «поведением этого объекта в зависимости от существования макроса NDEBUG. Вы должны включать стандартный объект-заголовок в Вашу программу только в пределах области действия одного файла. heap (куча) Речь идет о памяти, которая может быть динамически выделена и освобождена из программы пользователя посредст- вом библиотечных функций calloc, free, malloc и realloc. hexadecimal constant (шестнадцатеричная константа) (См. constant integer.) hexadecimal escape sequence (управляющая последовательность представления символа посредством его шестнадцатеричного кода) Речь идет об управляющей последовательности вида \xh..h, которая представляет символ, имеющий шестнадцатеричный код 86
HUGE VAL A..h. Как показано, длина такой последовательности шестнадца теричных цифр не ограничена Стандартом языка Си. чего нельзя сказать о подобной последовательности восьмеричных цифр. horizontal-tab characher (символ горизонтальной табуляции) Это один из символов-пробелов (white space characters), применение которых в исходном тексте программы допустимо. horizontal-tab escape sequence (управляющая последовательность «горизонтальная табуляция») Горизонтальная табуляция может быть представлена управляющей последовательностью вида \t. hosted environment (среда выполнения программ под управлением главной программы) (См. environment, hosted.) _huge Стандарт языка Си требует, чтобы ключевые слова расшире- ния языка начинались со знака подчеркивания. Начиная с версии 6-0, система Microsoft С дополнена ключевым словом _huge, являющимся синонимом huge. Ожидается широкое рас- пространение этого ключевого слова в реализациях системы программирования в среде MS-DOS. huge Это нестандартное ключевое слово имеет широкую поддержку в системах программирования, работающих в 1 6 битовом режи- ме на кристалле с сегментированной памятью таких, как микро- процессоры семейства Intel 80x86. Оно используется как моди- фикатор типа и может применяться только к объектам подобным следующим: char huge table]70000]; char huge *hpc; char huge »»hppc; char huge • huge «hphpc; long int huge *check(void); Данное, тип которого имеет модификатор huge, может разме- щаться в любом месте памяти, и не предполагается, что такое данное следует ожидать расположенным в текущем сегменте данных. Размер данных с модификатором типа huge может пре- вышать 64 Кбайт. Адрес местоположения таких данных является 32-битовым. Арифметика huge-указателей предполагает нормализацию их значений; для far-указателей нормализация не выполняется. Некоторые системы программирования располагают опцией компилятора, которая при использовании действует так, как если бы все указатели получили модификатор huge за исключе- нием указателей, уже имеющих модификаторы near far или huge. HUGE Это нестандартная версия макроса HUGE. VAL. HUGE_VAL Определение этого макроса дано в math.h. Макрос расширяет выражение типа double, имеющее положительное значение, при этом подобное выражение необязательно предста- вимо как имеющее тип float. Не требуется, чтобы оно было константным выражением. Имя HUGE_VaL является пововведе- 87
hyperbolic functions нисм Стандарта языка Си и заменяет то, что во многих системах программирования на языке Си ранее называлось HUGE. hyperbolic functions (гиперболические функции) Речь идет об объ- являемых в math.h функциях cosh, sinh, tanh и их вариантах для работы с данными типа float и long double I identifier (идентификатор) Это имя, формируемое в виде последо- вательности символов, может применяться для идентификации переменной, функции, константы перечисляемого типа, произ- водного типа, тега или члена структуры или объединения, а также перечисляемого типа, метки или макроса. Идентификатор должен начинаться с буквы или знака подчеркивания и может содержать алфавитно-цифровые символы и знаки подчеркива- ния. В то время как K&R утверждает, что значимыми являются первые восемь символов. Стандарт языка Си требует, чтобы идентифи- каторы имели значимыми по меньшей мере первый 31 символ и «различали» строчные и прописные буквы. (Отметим, что из-за ограничений со стороны компоновщика и по другим при- чинам длина значащей части внешних имен может быть равной 6 Эти имена можно приводить только к одному регистру, верх- нему или нижнему.) Как правило, во избежание конфликтов между идентификатора- ми программ пользователя и системных программ поставщика системы программирования, не создавайте имен, начинающих- ся знаком подчеркивания. Два идентификатора могут обозначать различные единицы про- граммы в пределах общей области действия, если они находятся в различных пространствах имен (name spaces). tdentldler, reserved (зарезервированные идентификаторы) Ключе- вые слова как специальные идентификаторы являются зарезер- вированными словами языка программирования. Их нельзя использовать в качестве идентификаторов программы, опреде- ляемых пользователем. Помимо этого все внешние имена, объ- являемые в стандартных объектах-заголовках являются зарезер- вированными независимо от того, включен или не включен их «родительский» объект-заголовок в текст программы. (См. future library directions ) identifier conflicts with C++ (конфликты с идентификаторами языка Сн++) Ниже перечисляются ключевые слова языка Си++. не входящие в состав средств Стандарта языка Си. Предполагая использование исходных текстов программ, написанных на язы- 88
if/else ке Си, в среде программирования на языке Сн++, вам следует избегать применения в качестве идентификаторов следующих имен: asm, catch, ciass, delete, friend, inline, new, operator, private, pro*ected, public, template, this, throw, try. virtu»1 identifier linkage (связь идентификаторов) (См. linkage.) identifier list (список идентификаторов) Речь идет о перечне иден- тификаторов, отделяемых друг от друга запятой. Identifier name space (пространство имен) (См. name space.) identifier scope (область действия идентификатора) (См. scope.) identifier type (тип идентификатора) (См. type.) IEEE 1003 POSIX (См. POSIX ) IEEE Floating-Point Arithmetic Standards (стандарты арифметики с плавающей точкой Американского Института Инженеров по Электронике и Радиоэлектронике) Речь идет о стандарте IEEE для двоичной арифметики с плавающей точкой (ANSI/1EEE Std 7 54-1985) и стандарте IEEE для арифметики с плавающей точ- кой при независимости от системы счисления (ANS1/1EEE Std 854-198?). Одной из задач рабочей группы NCEG является обеспечение прямой поддержки языком Си процессоров с пла- вающей точкой, ориентирующихся на перечисленные стандар- ты. #if Эта директива препроцессора предназначена для выполнения того блока компиляции по условию, который «базируется» на истинности целочисленного константного выражения, определя- ющего условие. Данная директива предполагает наличие соот- ветствующей директивы #endif, а также, ио необязательно, при- сутствие директив #else илн #elif. Рассматриваемая директива имеет следующий формат- #if целочпсленное_констанли<ое_выражение Если целочисле1шое_констаитное_выражение содержит какие- либо идентификаторы, которые в данный момент не определены как макросы, предполагается (и только для этой директивы), что такие идентификаторы являются макросами, имеющими нуле- вые значения. целочислеиное^констпантлое_выражение вычисля- ется так, как если бы его каждый элемент имел тип long int. (См. comment.) lf/else Конструкция языка в которой используются эти два ключе- вых слова, позволяет управлять ходом вычислительного процесса в зависимости от значения («истинно» или «ложно») скаллрного выражения-условия. Каждая из ветвей (одна выбирается по «истинно», другая — по «ложно») предполагает наличие только одной команды. Если же требуется выполнение не одной, а нескольких команд, из них формируется блок. Обобщенная форма конструкции: if (выражение) команда 89
# ifdef [ else команда ] Отметим, что здесь используется полное выражение. Если оно не содержит знаков операций отношения или тождества, выполня- ется проверка на равенство его нулю. Например, if (р) эквива- лентно if(p 1= О). #ifdef Это директива препроцессора используется для того, чтобы начать «блок» компиляции по условию, основанному на сущест вовании макроопределения Данная директива требует наличия соответствующей директивы #endif, между ними может (но не обязательно) размещаться директива #else нли #еМ. Рассматри ваемая директива имеет следующий формат: #>fdef идентификатор # Ifndef Эта директива препроцессора используется для того, чтобы начать «блок» компиляции по условию, основанному иа отсутст- вии макроопределения. Данная директива требует наличия со- ответствующей директивы #endif, между ними может (но не обязательно) размещаться директива #else или #elif. Рассматри- ваемая директива имеет следующий формат: #ifndef идентификатор implementation (система программирования на Сн) Речь идет прежде всего о среде трансляции программ, написанных на языке Си. Однако в это понятие помимо компилятора включа- ются также препроцессор и библиотека поддержки выполнения программ (run-time library) для заданной операционной систе- мы Первоначально данный термин подразумевал «компилятор» или «интерпретатор». implementation, conforming (адекватная система программирования) Речь идет о среде трансляции, удовлетворяющей спецификации Стандарта языка Си. Подобная среда, функционирующая под управлением операционной системы, должна содержать все бнб ли отечные функции. Если же имеет место среда, функциониру ющая самостоятельно (freestanding), то предоставляемый ею на- бор библиотечных средств определяется конкретной реализацией системы программирования при условии наличия средств float.h, limits.h, sfdargj, и stddef.h. implementation limits (пределы реализации системы) (См environ- mental limits.) implementation-defined behavior (поведение программы, определяе- мое реализацией системы) При условии корректно сконструи ровапной программы и корректных данных факт зависимости поведения программы на этапе выполнения от характеристик системы является свидетельством зависимости функционирова- ния программы от характеристик, определяемых конкретной реализацией системы программирования. Специфика подобно- го поведения программы документируется системой. Например, выполняется или нет. «расширение» знака при преобразовании 90
#include данного типа char в данное типа inf зависит от реализации системы программирования на языке Си: подобное можно ска- зать и о возможности появления знака в поле битов типа «чис- тый» int. (См bit-field, plain int.) Implicit conversion (неявное преобразование) (См. conversion, explicit; conversion, implicit.) implicit function declaration (явное объявление функции) Если ком- пилятор «наталкивается» на идентификатор, для которого нет соответствующего объявления в пределах сферы действия иден- тификатора, и если при этом последний является выражением которое непосредственно предшествует знаку вызова функции (function call operator), такой идентификатор имеет неявное объявление следующего вида- extern inf идентификатор^); Отметим, что никакой информации о прототипе нс предполага- ется. Рассмотрим следующий пример; void a(void) < void f(void); К); ) void b(void) { ini »; i — f(10); /* Ошибки не обнаружены */ ) Поскольку сфера действия объявления о функции f ограничена блоком, компилятор «забывает» об этом, переходя от определе- ния одной функции к определению другой функции. В резуль- тате. в сфере действия второго обращения к функции f ее прототип отсутствует, и компилятор не способен обнаружить несоответствие между типами параметров и возвращаемым зна- чением, как они объявлены в прототипе и определены при вызове функции. #include Эта директива препроцессора используется для включе- ния в текст программы объекта-заголовка, стандартного или определяемого программистом. Возможные варианты примене- ния директивы: #indude <лексемы_препроцессора> #include "лексемы_препроцессора" #<nclude идентификатор 91
inclusive OR assignment operator Здесь лексемы_препроцессора — это имя объекта-заголовка или серия лексем, которые после препроцессорного расширения совместно формируют имя объекта-заголовка. Третий вариант применения директивы относится к нововведе ниям Стандарта языка Си и позволяет, при усховии, что иден- тификатор — это макрос, расширить последний до последова тельности символов, форма которой определена первыми двумя вариантами. (См. header name of.) inclusive OR assignment operator (знак составной операции «ИЛИ» и «присваивание») (См. OR assignment operator, bitwise inclusive.) inclusive OR operator (знак операции «ИЛИ») (См. OR opera'or. bitwise, inclusive ) Incomplete type (незавершенный тип) (См. type, incomlete.) increment operator (знак операции «увеличение на единицу») Знак одноместной операции увеличения на единицу (++) может при- меняться как в префиксной, так и постфиксной записи. Операнд должен быть данным скалярного типа н быть модифицируемым именующим выражением (lvalue). Значение х++является значе- нием к перед выполнением операции увеличения х на единицу, в то же время значении ++х — это значение ж после выполнения подобной операции. Постфиксный вариант этой операции ассо- циативен слева, а префиксный вариант — справа. (До введения Стандарта языка Си оба варианта имели равный приоритет в очередности выполнения. Однако Стандарт повысил приоритет постфиксной операции. Это не должно внести нарушения в корректно написанные программы Более того, это дает возмож- ность сделать правильно функционирующими некорректные конструкции, разработанные ранее. Например, теперь p+-i—>m является корректной конструкцией. Существует соответствую- щий знак операции уменьшения на единицу (—). indirection (косвенность) Акт доступа к объекту или функции по- средством указателя па этот объект или функцию является актом косвенной адресации. Последняя реализуется с помощью знака операции «звездочка» (»). Этот процесс также известен как разыменование (dereferencing). Стандарт языка Си не наклады- вает ограничений на число уровней косвенности, требуя поддер- жки 1 2 уровней. Однако редко требуется более одного уровня. 1 [апример. в следующих определениях double d = 1.2; double *pd = &d; double **ppd = &pd; выражения »pd, »ppd и »»ppd являются разыменованиями ука- зателей pd, ppd и ppd соответственно. Аналогичным образом void f(void); void (»pf)(void) = f; 92
initializer выражение »pf обеспечивает доступ к функции f через разыме- нование указателя pf на эту функцию. indirection operator [знак операции косвенной адресации) Знак од- номестной операции «звездочка» (•) используется для доступа к объекту или функции косвенно посредством указателя на объект или функцию. Использование косвенной адресации (indirection) часто называют разыменованием (dereferencing). Эта операция ассоциативна справа. Будучи примененной к указателем на данные, она всегда порождает именующее выражение (lvalue). Так, например, в следующих определениях double d; double *pd = &d, double «ppd = &pd; double df(void); douole (*pf)(void) = df, выражение »pd обозначает объект типа double, на который ука- зывает pd: выражение »*ppd обозначает объект типа double, на который указывает »pd; выражение »pf обозначает функцию, на которую указывает р(. inequality орега1ог(знак операции отношения «неравенство») Речь идет о сочетании символов «восклицательный знак» (I) и «равенст- во» (=), используемых в качестве знака двухместной операции сравнения на неравенство значений операндов. Операнды должны быть скалярными данными арифметического типа, либо оба указа- телями на данные совместимых типов со спецификаторами или без спецификаторов типов, либо одйн операнд — void-указатель, а дру- гой операнд — указатель на объект или данное незавершенного типа, либо, наконец, один операнд — указатель, а другой — констан- та в виде null-указателя. Порядок вычисления операндов не опреде- лен. Результат выполнения операции имеет тип int и значение О («ложно») или 1 («истинно»). Данная операция ассоциативна слева. initialization (инициализация) Это акт присваивания объекту на- чального значения. Объекты класса памяти auto, для которых явно инициализация не выполнялась, имеют неопределенные исходные значения. Объекты класса памяти static, не получившие инициализацию явным образом, имеют нулевые исходные зна- чения, приведенные к типу этих объектов. (В случае составных объектов нулевые значения «распространяются» на все входя- щие в состав скалярные члены; для объединений это справедли- во только для первого члена каждого из них.) Стандарт языка Си дополняет эти характеристики возможностью явной инициали- зации объединений и агрегатированных (составных) данных класса памяти auto; однако такие инициализаторы должны быть константными выражениями фазы трансляции. (См. initializer.) initializer (инициализатор) Речь идет о конструкции, обеспечиваю- щей инициализацию согласно следующей форме: { список_иачалъных_значений } 93
initializer, tiring literal Если подлежащий инициализации объект имеет скалярный тип, то разделители в виде фигурных скобок могут быть опущены (что и делается на практике). список_начальных__зиачелий — это перечень начальных значений (инициализаторов), разделяемых запятыми. Вложенные инициализаторы предназначены для присваивания начальных значений вложенным структурам, массивам структур, многомерным массивам, т. п. Initializer, string literal (инициализатор в форме строкового литера- ла) Массиву символов можно присвоить начальные значения двумя способами: char d[] = {'о', 'п', 'е*, '\0'); char с2(] = "one"; В случае с2 инициализатор имеет форму строкового литерала. Можно было бы ожидать, что тип инициализирующего выраже- ния — это «массив из четырех символов» (array of 4 char). Однако этот тип массива не преобразуется в адрес первого элемента. Вместо этого он воспринимается как аббревиатура первого спо- соба инициализации. Следует, впрочем, обратить внимание на приводимый ниже пример массива, состоящего только из трех символов без замыкающего '\0'. char с3[3] = "one"; inline Это ключевое слово языка Си++ не входит в состав средств Стандарта языка Си. Планируя в будущем использование про- грамм написанных на языке Си. в среде C++, следует избегать применения inline в качестве идентификатора. Некоторые компи- ляторы с языка Си поддерживают это ключевое слово как рас- ширение я>ыка int Это ключевое слово обозначает тип «целое число». Стандарт языка Си требует для представления данного этого типа по меньшей мере 16 битов. Обычно это требование удовлетворяет- ся соответствующими типами данных вычислительных машин современной архитектуры (например, для данных этого типа отводится одно машинное слово или регистр). «Чистый» тип int предполагает наличие знака у числа. (См. integral type.) intcurrsymbol Этот член структуры Iconv является указателем на "строку символов, содержащую международный знак денежной единицы, применимый в данной «культурной среде» (locale). Первые три символа составляют алфавитно-цифровой междуна- родный знак денежной единицы в соответствии с тем, как этот монетарный символ специфицирован в ISO 4217 Codes for the Representation of Currence and Funds (Коды ISO 4217 для пред- ставления денежных единиц и фондов). Четвертый символ (не- посредственно предшествующий null-символу) предназначен для отделения международного знака денежной единицы от денеж- ной суммы (ее величины). Если строка символов имеет вид то это означает отсутствие соответствующего значения (содержи- 94
integral type мого строки) в текущей «культурной среде» или равенство нулю его длины. int_frac_digits Этот член структуры Iconv является ее неотрицатель- ным элементом, представляющим число цифр дробной части (после десятичной точки), которое подлежит отображению в монетарной величине согласно международному формату. Зна- чение CHAR-MAX указывает на отсутствие величины в текущей «культурной среде» (locale). INT_ МАХ Этот макрос, определяемый в limits.h, обозначает макси- мальное значение объекта типа mt. Оно должно быть равным по меньшей мере 32767 (16 битое). Это относится к нововведениям Стандарта языка Си. Данный макрос расширяется до целочис- ленного константного выражения пригодного к применению в директиве #if. INT MIN Этот макрос, определяемый в limits h, обозначает мини- мальное значение объекта типа int. Оно должно быть равным по крайней мере -32767 (16 битов). Это относится к нововведени- ям Стандарта языка Си. Данный макрос расширяется до цело- численного константного выражения, пригодного к применению в директиве #if. Integer arithmetic functions (функции арифметики целых чисел) Речь идет об объявляемых в stdlib.h функциях abs, div, labs и Idiv. Integer constant (целочисленная константа) (См. constant, integer.) integer suffix (суффикс целочисленного типа) (См constant, intege*.) integer type conversion (преобразование данных целого типа) (См. conversion, usual arithmetic.) Integral constant expression (целочисленное константное выраже- ние) Это выражение, включающее только целочисленные кон- станты, константы перечисляемого типа, символьные константы, выражения вида sizeof и константы с плавающей точкой, которые являются операндами приведения типов (operands of casts). В случае применения целочисленного константного выражения в директивах препроцессора (таких, как #if и #elif), на выражение накладываются дополнительные ограничения. А именно, исклю- чено использование констант перечисляемого типа и наличие знаков операций приведения типов. Использование s.reof-выра- жений допустимо, однако их поддержка здесь не является требо- ванием. integral promotions (продвижение по шкале целочисленных типов) (См. conversion integer type.) integral type (целочисленный тип) В это понятие входят следующие четыре типа данных: char, short inf, int и long. Эти типы перечисле- ны в неубывающем порядке точности представления целочис- ленных данных. Не исключается возможность использования одной и той же формы представления данных несколькими типами из числа перечисленных. Возможны варианты представ- ления числовых значений как со знаком (signed), так и без знака 95
internal name (unsigned). Для определения атрибутов реализации целочислен- ного типа можно использовать limits.h. Все целочисленные типы являются арифметическими. (См. char, plain.) Internal паше (внутреннее имя) Это имя, не экспортируемое за пределы текста исходного модуля. Следовательно, оно «не видно» компоновщику (linker), и последнему не приходится решать проблему перекрестных ссылок. Количество значащих символов в имени составляет не менее 31. Внутренние имена «чувстви- тельны» (case-distinct) к положению регистра (верхний и ниж- ний). (См. external name.) internationalization (интернационализация) Речь идет о процессе предоставлении поддержки, а также большей и лучшей интегра- ции системы трансляции и (или) выполнения программ за пределами традиционной «англо-американской» среды про- граммирования, для которой ранее было написано большинство программ на языке Си. (См. locale.) interrupt (прерывание) (См. signal.) _IOFBF Этот макрос, определяемый в stdio.h, можно использовать в качестве третьего параметра функции setvbuf для указания, что поток буферизуем полностью (fully buffered). (См _IOLBF и JONBF.) _IOLBF Этот макрос, определяемый в stdio.h, можно использовать в качестве третьего параметра функции setvbuf для указания, что поток буферизуем в пределах одной строки (line buffered). (См. _IOFBF и _'ONBF.) IONBF Этот макрос, определяемый в stdio.h можно использовать в качестве третьего параметра функции setvbuf для указания, что поток не буферизуем (not buffered). (См. _1OFBF и JOLBF.) is prefix (префикс is) (См. future library directions.) isalnum Эта функция, имеющая специфику конкретной «культур- ной среды» (local-specific), проверяет, является ли аргумент с алфавитным (isalpha) или десятично-цифровым (isdigit). #indude <ctype.h> int isalnum(int c); Если результат проверки — «ложно», возвращаемое функцией значение равно нулю; в противном случае, т. е. когда результат проверки — «истинно», возвращаемое значение — ненулевая величина. Isalpha Эта функция, имеющая специфику конкретной «культур- ной среды» (locale-specific), проверяет, является ли аргумент с символом алфавита. #indude <ctype.h> int isalpha(int с); 96
isgraph В «культурной среде Си» ("С" locale) это означает, что «истинно» supper или «lower. В других «культурных средах» в набор .saipha могут быть включены другие символы, определяемые конкрет- ной реализацией системы программирования на языке Си, при условии, что такие символы не принадлежат наборам1 iscntrl, isdigit, ispunct или isspace. Если результат проверки — «ложно», то значение, возвращае- мое функцией, равно нулю; в противном случае, т. е. когда результат проверки — «истинно», возвращаемое значение — ненулевая величина. isascli Эта нестандартная функция проверяет, принадлежит ли значение аргумента с диапазону допустимых значений ASCII-ко- да (0-127) # include <ctype.h> int isascii(int с); Если результат проверки — «ложно», то значение, возвращае- мое функцией, равно нулю; в противном случае т. е. когда результат проверки — «истинно», возвращаемое значение — ненулевая величина. Iscntrl Эта функция проверяет, является ли ее аргумент с элементом набора управляющих символов, определяемых конкретной реа- лизацией системы программирования на языке Си. #indude <ctype.h> int iscntri(int с); В таблице ASCII-кодов управляющие символы занимают пози- ции (их коды имеют значения) от 0 до Ox if. а также 0x7 f. Е таблице EBCDIC-кодов управляющие символы имеют значения меньшие, чем 0x40 (исключая 0x29, 0x30, 0x31 и ОхЗе, которые не являются кодами управляющих символов). Если результат проверки — «ложно», то значение, возвращае- мое функцией, равно нулю; в противном случае, т. е. когда результат проверки — «истинно», возвращаемое значение — ненулевая величина isdigit Эта функция проверяет, является ли ее аргумент с одной из десятичных цифр 0-9. #include <ctype.h> int isdigit(int с); Если результат проверки — «ложно», то возвращаемое функ- цией значение равно нулю; в противном случае, т. е. когда результат проверки — «истинно», возвращаемое значение — ненулевая величина. isgraph Эта функция, имеющая специфику конкретной «культур- ной среды» (locale-specific), проверяет, является ли ее аргумент 4 Заказ 677 97
isiower с каким либо воспроизводимым (printable) символом, исключая пробел (space). #indude <ctype.h> int isgraph(int c); Если результат проверки — «ложно», то возвращаемое функ- цией значение равно нулю; в противном случае, т. е. когда результат проверки — «истинно», возвращаемое значение - ненулевая величина. isiower Эта функция, имеющая специфику конкретной «культур- ной среды» (locale-specific), проверяет, является ли ее аргумент с строчной (lowercase) буквой. # include <ctype.h> int islowerfint с); В «культурной среде Си» ("С" locale) строчными являются ла- тинские буквы от а до г включительно. В других «культурных средах» в это понятие могут быть включены другие символы, которые становятся элементами набора isalpha при условии, что они не входят в набор iscntrl isdigit, ispunct или «space. Если результат проверки — «ложно», то возвращаемое функ- цией значение равно нулю; в противном случае, т. е. когда результат проверки — «истинно», возвращаемое значение — ненулевая величина. ISO Это аббревиатура наименования International Standards Organization (Международная Организация по Стандартам) ISO — это международный «партнер» организаций, ответствен них за национальные стандарты. WC14 (Working Group 14) является рабочей группой, занимающейся расширением ISO С Standard (Стандарт ISO языка Си). (Первоначально ISO С Stand ard был технически эквивалентен ANSI С Standard. Однако сейчас WG14 разрабатывает ряд дополнительных нормативов — Normative Addenda — для последующего включения в Стандарт языка Си.) ISO С Это формальное определение языка Си, препроцессора и библиотеки поддержки выполнения программ принятое Между народной Организацией по Стандартам (ISO — International Standards Organization). Этот стандарт выпущен в свет комите- том WG14; он эквивалентен стандарту ANSI С. разработанному комитетом X3J11. (См Standard С.) ISO 4217 Currency and Funds Representation (стандарт представле- ния валюты и фондов ISO 4217) На этот стандарт ссылаются при определении монетарной части структуры типа Iconv для конкретной «культурной среды» (locale). ISO 646 Invariant Code Set (набор инвариантных кодов ISO 646) Речь идет о схеме кодирования, используемой в основном в Европе; в ней отсутствуют девять символов для написания ис- 98
isspace ходного текста программы, которые принципиально необходимы при программировании на языке Си. (См. trigraph.) isprint Эта функция, имеющая специфику конкретной «культурной среды» (locale-specific), проверяет, является ли ее аргумент с каким-либо воспроизводимым (printable) символом, включая пробел. #inc!ude <ctype.h> int isprint(int с); Если результат проверки — «ложно», то возвращаемое функ- цией значение равно нулю; в противном случае, т. е. когда результат проверки — «истинно», возвращаемое значение — ненулевая величина. Функция isprint предоставляет часть возможностей функции isgraph. ispunct Эта функция, имеющая специфику конкретной «культур- ной среды» (locale-specific), проверяет, является ли ее аргумент с каким-либо воспроизводимым (printable) символом кроме про- бела или символом, для которого применение функций isalrum дает значение «истинно». #indude <ctype.h> int ispunet(int с); Если результат проверки — «ложно», то возвращаемое функ- цией значение равно нулю; в противном случае, т. е. когда результат проверки — «истинно», возвращаемое значение — ненулевая величина. isspace Эта функция, имеющая специфику конкретной «культур- ной среды» (locale-specific), проверяет, является ли ее аргумент с каким-либо символом пробела (white space) из числа возмож- ных. #indude <ctype.h> int ospace('nt с); В «культурной среде Си» ("С” locale) к указанным выше симво- лам относятся следующие: «пробел» (space), «перевод страни- цы» (form feed), «новая строка» (new-line), «возврат каретки» (carriage return), «горизонтальная табуляция» (horizontal tab) и «вертикальная табуляция» (vertical tab). В других «культурных средах» могут использоваться другие символы, определяемые конкретной реализацией системы программирования; они включаются в набор isspace при условии, что проверка их нали- чия посредством функции isalnum не дает «истинно» в качестве возвращаемого значения последней. Если результат проверки — «ложно», то возвращаемое функцией значение равно нулю; в противном случае, т. е. когда результат 99
isupper проверки — «истинно*, возвращаемое значение — ненулевая величина. Isupper Эта функция, имеющая специфику конкретной «культур- ной среды» (locale-specific), проверяет, является ли ее аргумент с прописной (uppercase) буквой. # include <ctype.h> int isupper(mt с); В «культурной среде Си» ("С" locale) прописными являются латинские буквы от А до Z включительно. В других «культурных средах» в это понятие могут быть включены другие символы, которые становятся элементами набора isalpha при условии, что они не входят в набор iscntrl, isdigit, ispunct или isspace. Если результат проверки — «ложно», то возвращаемое функ- цией значение равно нулю; в противном случае, т. е. когда результат проверки — «истинно», возвращаемое значение — ненулевая величина. isxdigit Эта функция проверяет, является ли ее аргумент с шестнад- цатеричной цифрой. Допустимыми шестнадцатеричными циф- рами являются десятичные цифры от 0 до 9. а также латинские буквы прописные от А до F и строчные от а до t. #include <stype.h> int isxdigit(int c); Если результат проверки — «ложно», то возвращаемое функ- цией значение равно нулю; в противном случае, т. е. когда результат проверки — «истинно», возвращаемое значение — ненулевая величина. Iteration statements (команды выполнения итераций) Это команды while, do и tor. J jmpbuf Это тип массива, размер которого «подходит» для записи на хранение «контекста текущей программы» («current program context»). Данный тип используется макросами setjmp и longjmp для записи на хранение и восстановления контекста программы соответственно. Этот тип определен в setjmp.h. jump statements (команды перехода или передачи управления) Речь идет о командах goto, continue, break и return. jump table Эта широко используемая в системном программирова- нии структура данных реализуется в языке Си как массив указателей на функции. При условии наличия объявлений вида 100
Kernighan В W. inf fra nsactO( void ♦); inf transact 1 (void *),* inf transact2(void ♦); inf transact?(void ♦); inf (♦jtable[])(void ») = { transacfO, transact 1, transact?, transact? }. функция обработки транзакций, соответствующая транзакции типа t, будет вызываться посредством value = (»jtable[f])(record); Стандарт языка Си также позволяет вызов такой функции, а именно: value = jtable[f](record); Следовательно, левый операнд операции вызова функции мо- жет быть или выражением, обозначающим функцию, или выра- жением, являющимся указателем иа функцию. К K&R Это условное обозначение книги Б. Кернигана и Д Ритчи «Язык программирования Си» (The С language programming by Brian W. Kernighan and Dennis M. Ritchie). Когда в 197 8 году появилось первое издание этой книги, оно действительно служи- ло справочником по языку Си. Хотя в 1 988 году было опубли- ковано второе издание книги, условное обозначение K&R обычно подразумевает ссылку на первое издание. К 1990 году второе издание книги претерпело дальнейшую ревизию с целью вклю- чения конечного варианта стандарта ANSI С. (Издание 1988 года базировалось на «почти законченном» проекте стандарта.) Приложение А первого издания было одним из основополагаю- щих документов, которым пользовался комитет X3J1 1 при выра- ботке стандарта ANSI С. Kernighan В. W. (Керниган Б.) Общепризнанный специалист, со- трудник научно-исследовательского вычислительного центра ла- боратории Bell (Bell Labs Computer Science Research Center), автор многочисленных публикаций и в том числе соавтор клас- сических книг по вычислительной технике, написанных совме- стно с рядом известных специалистов, среди которых Dennis 101
keyword Ritchie, P. J. Plauger, Rob Pike. В аббревиатуре K&R буква «К» обозначает Kermghan. keyword (ключевое слово) Это элемент набора лексем идентифика- торов (identifier token), имеющий предопределенный «смысл» и являющийся зарезервированным словом языка программирова- ния Ключевое слово нельзя использовать в качестве идентифи- катора, определяемого пользователем. Ключевые слова Стандарта языка Си Имя Значение auto Класс памяти break Команда перехода case Метка (только в команде switch) char Спецификатор типа const Модификатор типа continue Команда перехода default Метка (только в команде switch) do Команда цикла double Спецификатор типа else Необязательная ветвь в команде if entry См. ниже Примечание enum Спецификатор типа extern Класс памяти float Спецификатор типа for Команда цикла goto Команда перехода if Команда выбора int Спецификатор типа long Спецификатор типа register Класс памяти return Команда перехода short Спецификатор типа signed Спецификатор типа siieof Знак операции фазы трансляции static Класс памяти struct Спецификатор типа switch Команда выбора typedef Синоним объявления типа union Спецификатор типа unsigned Спецификатор типа void Спецификатор типа 102
label, case Имя Значение volatile Модификатор типа while Команда цикла Примечание: Ключевое слово entry, зарезервированное в перво- начальном определении языка Си, не входите состав зарезерви- рованных слов Стандарта языка Си. Это замечание справедливо и по отношению к таким расширениям языка, как asm и (ortran. kill Эта нестандартная функция может вызвать подачу сигнала для другой программы (но не для себя) <<< L prefix (префикс L) Используется для введения константы в виде символа расширенной формы (wide character constant) или стро- кового литерала расширенной формы (wide string literal). Это относится к нововведениям Стандарта языка Си. L suffix (суффикс Ц Предназначен для использования в константе с плавающей точкой (см constant, floating), а также в целочислен- ной константе (см. constant, integer) 1 suffix (суффикс I) Предназначен для использования в константе с плавающей точкой (см. constant, integer). Этот суффикс предназ- начен также для применения в именах математических библио- течных функций (см future library directions). L_tmpnam Этот макрос, определяемый в stdio.h, является целочис- ленным константным выражением, значение которого — размер массива символов, достаточно большой для размещения имени временного файла (temporary filename), создаваемого функцией tmpnam. label (метка) Речь идет об идентификаторе, определяемом пользова- телем; этот идентификатор размещается перед «помечаемой» командой и отделяется от нее двоеточием. Такая метка может применяться в сочетании с соответствующей командой goto. Два других формата представления метки — case и default — исполь- зуются только в конструкции switch и не могут быть объектами действия команды goto label, case (метка переключателя формата case) Подобная метка ис- пользуется только в контексте команды switch и требует наличия ключевого слова case Она состоит из целочисленного констант- ного выражения фазы трансляции (translation time) за которым следует двоеточие, предшествующее команде. В пределах одной и той же команды switch не допустимо применение двух одинако- вых меток формата case. Команда switch передает управление в «точку» расположения той case-метке, значение которой соответ- 103
label, default ствует (совпадает) значению управляющего выражения. (См labeled statement.) label, default (метка переключателя формата default) Подобная мет ка используется только в контексте команды switch и требует применения ключевого слова default. Команда switch передает управление в «точку» расположения метки default, если значению управляющего выражения не соответствует ни одна метка фор- мата case labeled statement (помечаемая команда) Речь идет о команде, кото- рой предшествует метка. Например: идентификатор : команда case выражение-константа : команда default : команда labs Эта функция вычисляет абсолютное значение своего аргумента j, тип которого — long mt. #indude <stdlib.h> long int labs(long inf j); Если результат не может быть представлен поведение функции не определено. (См. abs.) LC_* macros (макросы LC_*) Эти макросы расширяются до целочис- ленных константных выражений; они предназначены для ис- пользования в качестве первого параметра (категории) функции seilocale. Стандарт языка Си зарезервировал имена начинающи- еся с LC_, за которыми следуют прописные буквы, для примене- ния в реализации системы программирования с целью возмож- ности добавления других категорий «культурной среды» (locale) Стандартными макросами являются LC_ALL, LC_COLLATE. LC_CTY“E LC_MONETARY LC_NUMERIC и LC_TIME. Это относится к нововведениям Стандарта языка Си. (См future library directions । LCALL Этот макрос используется в качестве первого параметра функции setlocale для выбора «культурной среды» (locale) в целом. (Другие макросы обеспечивают только частичный выбор «культурной среды».) Применение этого макроса влечет за собой назначение всех других ЕС_«-категорий для данной «культурной среды». Это относится к нововведения Стандарта языка Си. LC COLLATE Этот макрос применяется в качестве первого парамет- ра функции setlocale для выбора той части «культурной среды» (locale), которая выполняет сравнение и объединение (collation) в функциях strcoll и sfrxfrm. Это относится к нововведениям Стан- дарта языка Си. LC CTYPE Этот макрос используется в качестве первого параметра -функции setlocale для выбора той части «культурной среды» (locale), которая имеет дело с функциями манипуляции симво- лами и многобайтовыми функциями (в sfype.h и stdlib.h соответ- ственно) Это относится к нововведениям Стандарта языка Си. 104
LDBL. MANT.DIG LC_MONETARY Этот макрос применяется в качестве первого пара- метра функции setlocale для выбора той части «культурной сре- ды» (locale), которая имеет дело с информацией о форматирова- нии монетарных данных, возвращаемой функцией localeconv. Это относится к нововведениям Стандарта языка Си. LC_NUMERIC Этот макрос используется в качестве первого пара- метра функции setlocale для выбора той части «культурной сре- ды» (locale), которая имеет дело с выбором символа десятичной точки в функциях форматированного ввода-вывода и преобра- зования строк символов, а также информацией о форматирова- нии монетарных данных, возвращаемой функцией localeconv. Это относится к нововведениям Стандарта языка Си LC_TIME Этот макрос применяется в качестве первого параметра функции setlocale для выбора той части «культурной среды» (locale), которая имеет дело с поведением функции strfiime. Это относится к нововведениям Стандарта языка Си. Iconv Это ключевое слово используется для описания типа структу- ры, определяющей «культурную среду» (locale); структура этого типа определена в loca'e.h и содержит члены (элементы), которые приводятся ниже в произвольном порядке (возможно наличие и других членов). currency .symbol decimal-point frac_digits grouping int_curr ..symbol int_frac_digits mon_decimal_poinf mon_grouping mon fhoLsands-Sep negative_sign n_cs „precedes n_sep_by _space n-sign_posn positive .sign p_cs_precedes p_sep_by_space p_sign_posn thousards sep Iconv относится к нововведениям Стандарта языка Си. LDBL_DIG Этот макрос, определяемый в float.Ь. обозначает количе- ство значащих десятичных пифр в числе типа long double, при котором это число может быть округлено в число с плавающей точкой без изменения указанных десятичных цифр. Это относит- ся к нововведениям Стандарта языка Си. LDBL EPSILON Этот макрос, определенный в float.h, обозначает разницу между 1.0 и наименьшим значением, превышающим 1.0, которое еще может быть представлено в формате long double. Это относится к нововведениям Стандарта языка Си. IDBL_MANT_DIG Этот макрос, определяемый в float.h, обозначает количество значащих цифр мантиссы числа с плавающей точкой 105
LDBL „МАХ типа long double имеющего основание системы счисления FLT_RADfX. Это относится к нововведениям Стандарта языка Си. IDBL МАХ Этот макрос, определяемый в float.h, обозначает макси- мальное число типа long double, представимое в конечной форме. Это относится к нововведениям Стандарта языка Си. LDBL_MAX_10_EXP Этот макрос, определяемый в float.h, обозначает максимальное целое число, которое, будучи степенью числа 10, порождает число, не выходящее за диапазон допустимых значе- ний чисел с плавающей точкой, представляемых в конечной форме. Это относится к нововведениям Стандарта языка Си. LDBI._MAX_EXP Этот макрос, определяемый в float.h. обозначает максимальное целое число, уменьшенное на единицу значение которого, будучи степенью числа FLT_RADIX, порождает число с плавающей точкой не выходящее за диапазон допустимых зна- чений чисел с плавающей точкой, представляемых в конечной форме. Это относится к нововведениям Стандарта языка Си. LDBL_MIN Этот макрос, определяемый в float.h, обозначает мини- мальное нормализованное положительное число типа long double. Это относится к нововведениям Стандарта языка Си. LDBI. MIN10 EXP Этот макрос, определяемый в float.h, обозначает минимальное отрицательное целое число, которое, будучи сте- пенью числа 10, порождает число, не выходящее за диапазон нормализованных значений чисел с плавающей точкой. Это относится к нововведениям Стандарта языка Си. LDBL_MIN_EXP Этот макрос, определяемый в float.h, обозначает минимальное отрицательное целое число, уменьшенное на еди- ницу значение которого, будучи степенью числа FLT_RADIX. по- рождает нормализованное число с плавающей точкой Это отно- сится к нововведениям Стандарта языка Си. Idexp Эта функция умножает число с плавающей точкой х на 2 в целочисленной степени ехр #indude <ma‘h.h> double ldexp(double x, int exp}; Результат может оказаться за диапазоном допустимых значений (range error). Значение, возвращаемой этой функцией, равно хх2^Р. Idexpf Эта дополнительная функция (опция) является вариантом функции Idexp, оперирующим данными типа float. Данная фун- кция относится к нововведениям Стандарта языка Си. Idexpl Эта дополнительная функция (опция) является вариантом функции Idexp, оперирующим данными типа long double. Данная функция относится к нововведениям Стандарта языка Си. Idiv Эта функция вычисляет частное и остаток от деления numer на denom. 106
left-shift operator #indude <stdlib.h> ldiv_t ldiv(long int numer, long int denom); Если деление неточное (выполнить без остатка не удается), знак результирующего частного — это знак алгебраического частно- го, а величина результирующего частного — это наибольшее целое число, которое меньше, чем величина алгебраического частного. Если результат представить не удается, поведение функции не определено. Значение, возвращаемое функцией, представляет собой структуру типа ldiv_t, которая содержит два числа типа long int — quo! и rem — в любом порядке. Это относит- ся к нововведениям Стандарта языка Си. (См. div.) ldiv_t Этот тип, определяемый в sfdlib.fi, является типом структуры, используемым в качестве типа результата, возвращаемого фун- кцией Idiv; тип этого результата определяется реализацией сис- темы программирования. Возможное определение ldiv_t: typednf struct ( long inf quof; long int rem; } ldiv_f; Порядок членов структуры задавать необязательно. Это относит- ся к нововведениям Стандарта языка Си. (См. div_t.) left-shift assignment operator (знак составной операции г сдвиг вле- во» и «присваивание») Знак двухместной операции «= позво- ляет объединить операцию «сдвиг влево» с операцией «присва- ивание» таким образом, что выр! «= выр2 эквивалентно выр! = выр/ « выр2 за одним исключением: в первом случае выражение выр! вычисляется только один раз. Оба операнда должны быть целочисленными данными, и при этом левый операнд должен быть модифицируемым именующим выражени- ем (lvalue). Порядок вычисления операндов не специфицирован. Если правый операнд является отрицательным числом, либо он больше или равен числу битов в левом операнде, тип которого «продвинут» (promoted) по шкале типов, то поведение операции не определено. Тип результата операции — это тип выражения выр1. Операция ассоциативна справа. (См assignment operator, compound ) left-shift operator (знак операции «сдвиг влево») Знак двухместной операции « обеспечивает сдвиг значения левого операнда влево на число битов, задаваемых значением правого операнда. Оба операнда должны быть целочисленными данными. Порядок вы числения операндов не специфицирован. Данная операция ассо- циативна слева. 11ад операндами выполняются обычные арифме- тические преобразования. Тип результата операции — это тип левого операнда после его «продвижения» (promotion) по шкале типов. Если правый операнд является отрицательным числом, либо он больше или равен числу битов в левом операнде после «продвижения» его типа, поведение операции не определено. 107
less-than operator less-than operator (знак операции отношения «меньше») Знак < — это знак двухместной операции «меньше», выполняющей срав- нение значений своих операндов. Оба операнда должны быть данными арифметического типа, либо оба — указатели на объ- екты совместимых незавершенных типов. Порядок вычисления операндов не специфицирован. Результат имеет тип int, а значе- ние 0 (если отношение «ложно») и 1 (если отношение «истин- но»). Данная операция ассоциативна слева. less-than-or-equal-to operator (знак операции отношения «меньше или равно») Двухместная операция, имеющая знак <=, сравни- вает значения своих операндов. Оба операнда должны быть данными арифметического типа, либо указателями на объекты совместимых и ьи незавершенных типов. Порядок вычисления операндов не специфицирован. Результат имеет тип int, а значе- ние 0 (если отношение «ложно») и 1 (если отношение «истин- но»). Данная операция ассоциативна слева. letter 'буква) Речь идет об одной из 52 прописных (uppercase) и строчных (lowercase) букв алфавита, которые Должны быть в наборе символов, используемых в тексте выполняемого програм- много модуля. Это понятие не следует «смешивать» с понятием многобайтового символа (multibyte character), который может использовать» я для представления «неанглийских букв» (напри- мер, символы Kanji), или с понятием «расширенных» (extended) символов (например, символы алфавитов Западно-Европейских стран, включающие диакритические знаки). lexical element (лексическим элемент) Это один элемент из набора базовых единиц языка программирования, сочетание которых в должной последовательности позволяет сформировать коррект- ный текст Си-программы. (См. token.) life (время жизни) Это альтернативный термин для понятия «про- должительно'тъ хранения» (storage duration). limits, environmental (ограничения среды) (См. environmental limits.) limits, numerical (ограничения на представление числовых данных) (См environmental lim’ts, floa* h и limits б,) limits, translation (ограничения трансляции) (См. environme-tal limits.) limits.h Этот объект-заголовок содержит семейство макросов, кото- рые описывают характеристики данных целого типа системы программирования. (Имеется также один макрос, предназначен- ный для обработки многобайтовых символов.) В то время как Стандарт языка Си выдвигает некоторые предельные требования (minima, maxima), предполагается, что конкретная реализация системы npoi раммирования будет документировать конкретные значения Ниже приводится полный набор макросов. 108
linkage CHAR_BIT CHAR_MAX CHAR MIN INT_MAX INT.MIN LONG_MAX lONG_MIN MB LEN MAX SCHAR-MAX SCHAR-MIN SHRT_MAX SHRT_MIN UCHAR.MAX UINT. MAX ULONG_MAX USHRTMAX Гарантируется расширение всех этих макросов до константных выражений фазы трансляции, пригодных для использования в директиве #rf. Этот объект-заголовок и его макросы относятся к нововведениям Стандарта языка Си __LINE _ Этот макрос, предопределенный Стандартом языка Си. расширяется до номера текущей строки исходного текста про- граммы; номер имеет вид десятичной константы. (Тип константы ие специфицирован, однако ее значение должно по меньшей мере не выходить за диапазоны допустимых значений данных типа int.) Примеры применения макроса: char line [] =_LINE_; pnntf("%lu", /unsigned long)_LINE_); #line Эта директива препроцессора используется для того чтобы в процессе трансляции заменить наименование текущего файла исходного текста программы и (или) номер строки этого текста. Эту директиву применяют согласно следующему формату ее записи: #Гше номер_строки ["имя_ исходного_файла"] Эту директиву можно «встретить» сравнительно редко, за ис- ключеиием случая, когда генерация машинного кода управляет- ся программой посредством какого-либо препроцессора line, logical (логическая исходного текста строка) Речь идет о воз- можности соединения (concatenation) физических строк исход- ного текста программы каждая из которых (кроме последней физической строки) завершается символом «новая строка» (new- line character). line, physical (физическая исходного текста строка) Это строка ис- ходного текста программы, завершающаяся символом «новая строка» (new-line character). Несколько физических строк можно соединить в одну логическую строку. line buffered stream (поток с буферизацией строки) Понятие «бу- феризация строки» не специфицировано. (См. _IOLBF и setvbuf.) linkage (связь между идентификаторами) Речь идет об установле- нии взаимосвязи (если она существует) между «появлениями» (использованием) одного и того же идентификатора в качестве 109
linkage, external имени объекта или функции. Стандарт языка Си определяет три формы связи между идентификаторами (linkage): внутренняя (internal), внешняя (external), «никакая» (попе) Примерами этих трех форм связи являются статическая функция (static function), внешняя переменная (external variable) и автоматическая пере- менная (automatic variable) соответственно. (См. scope и storage duration.) l.nkage, external (внешняя связь между ид нтификаторами) Если два или более объявления (declarations) данного идентификатора обозначают один и тот же объект или функцию, то такой иден- тификатор имеет внешнюю связь. Подобные идентификаторы «экспортируются» из объектного модуля, создаваемого трансля- тором, и объекты или функции, которые они обозначают, могут быть доступны по имени из любой единицы трансляции, в которой эти идентификаторы объявлены. Примерами могут слу- жить нестатические (non-static) функции и внешние (external) переменные. linkage, internal Идентификатор, имеющий в качестве области оп- ределения файл (file scope) и обозначаюший объект или функ- цию, а также являющийся статическим (static), имеет внутрен- нюю связь (internal linkage). Такие идентификаторы не «экспортируются» из объектного модуля, создаваемого трансля- тором, и объекты и функции которые они обозначают, не доступны по имени ни из одной единицы трансляции, за исклю- чением той. в которой эти идентификаторы определены. linkage, по (никакой связи между идентификаторами) Речь идет об идентификаторе, который обозначает некоторый объект, однако не имеет связей с другими одноименными идентификаторами Примерами являются формальные параметры, идентификаторы иные, чем обозначающие объекты и функции, а также иденти- фикаторы, область действия которых ограничена «не-внешним» (non-extern) блоком. Такие идентификаторы являются локальны- ми в пределах блоков, где они определены. local (локальный) Этот термин используется для обозначения ло- кальности идентификатора, т. е. той области его действия за пределами которой идентификатор «невидим» ни «родитель- ским» (parent), ни подчиненным (subordinate) блоком. (См linkage.) locale («культурная среда») Стандарт языка Си ввел понятие locale, которое является описанием культурной (cultural) или некоторой другой среды. По умолчанию Си-программа выполняется в «культурной среде Сн» ("С" locale), если не была вызвана фун- кция setlocale (или нормальной, функционирующей по умолча- нию «культурной средой» явчяется среда, отличная от "С")- В «культурной среде Си» процедуры stype.h имеют то же значение, что и всегда. Если же выбрана среда, отличающаяся от "С", набор символов, прошедший определенную проверку и отбор, может быть расширен с целью включения других символов, определя- емых конкретной реализацией системы программирования. На- 110
localeconv пример, предназначенные для использования в Западной Евро- пе системы вероятно будут включать символы с диакритически- ми знаками такими, как umlaut, caret и tilde. Следовательно- примененне функции isalpha к а дает значение «истинно» при условии определения этой функции в конкретной системе про- граммирования с учетом специфики текущей (местной) «куль- турной среды». (См locale-specific behav or и MB_LEN_MAX.) locale-specific behavior (поведение согласно специфике «культур- ной среды») Речь идет о «поведении» системы программнрова ння с учетом особенностей конкретной «культурной среды». Стандартными функциями, имеющими специфику поведения в определенной «культурной среде», являются atof. atoi, atoi, isalnum, isa'pha, isg-aph, isiower isprint, ispunct. isspace, (supper, strcoll, strftime, strtod, strtol, strtoul, strxfrm, folower И toupper. locale.h Этот объект-заголовок создан в Стандарте языке Си для хранения объявлений (declarations) о процедурах и типах дан- ных. которые могут быть полезными при создании библиотеки поддержки выполнения программы в «культурной среде» (locale) отличной от традиционной «культурной среды Си» ("С" locale), обеспечивающей так называемый «американо-английский» ре- жим («U.S. English» mode) использования языка. locale, h содержит объявления или определения для следующих идентификаторов. Имя Назначение LC-ALL LC-COLLATE LC_CT¥PE LC_MONETARY LC_NUMERIC LC_TIME / s’ruct Iconv localeconv NULL setlocale Категория se'locale Категория setlocale Категория setlocale Категория setlocale Категория setiocale Категория setlocale Структура числового формата Информация установки locale Константа null-указатель Установка новой locale Ключом к определению «культурной среды» (locale) является тип структуры Iconv. (См future library directions.) localeconv Эта функция вызывает инициализацию структуры типа Iconv значениями, соответствующими текущей «культурной сре- де» (locale). При этом программист может «опрашивать» элемен- ты (члены) структуры и при необходимости форматировать представление валюты (currency), данных с плавающей точкой и т. д. Возвращаемым значением функции является адрес этой структуры. Это относится к нововведениям Стандарта языка Си. 111
localtime #mdude <locale.h> struct Icon* »localeconv(void); Поведение функции не определено, если структура, на которую указывает значение, возвращаемое функцией, модифицируется вызывающим модулем. localtime Эта функция преобразует календарное время, на которое указывает timer, в расчлененное на части календарное время (broken-down time), выраженное как местное время. #indude <time.h> struct tm ♦!ocaltime(const time_t *timer). Значение, возвращаемое функцией, указывает на объект «ка- лендарное время, расчлененное на части». log Эта функция вычисляет натуральный логарифм своего аргу- мента х. #indude <math.h> double logfdouble x); Если аргумент — отрицательное число, то имеет место ошибка «выход за пределы области определения» (domain error). Если аргумент равен нулю и логарифм нуля оказывается непредста- вимым (он мог бы быть представлен как —<»), имеет место ошибка «выход за диапазон допустимых значений» (range error). Это соответствует стандарту IEEE Р854. Некоторые реализации системы программирования могут выдавать ошибку «выход за пределы области определения» вместо «выход за диапазон допу- стимых значений». logarithmic and exponential functions (логарифмические и экспонен- циальные функции) Речь идет об объявляемых в math.h функци- ях ехр, frexp, Idexp, log, loglO и modi, а также их эквивалентах, оперирующих данными типа float и long double. logf Эта дополнительная функция (опция) является вариантом фун- кции log, оперирующим данными типа float. Это относится к нововведениям Стандарта языка Си. logical AND operator (знак операции «логическое И») (См. AND operator, logical.) logical negation operator (знак операции «логическое НЕ») Воскли- цательный знак (I) является знаком одноместной операции «ло- гическое отрицание» значения операнда, который должен иметь скалярный тип. Результат операции — данное типа int. Если значение х равно нулю, то 1х равно единице. Если х имеет ненулевое значение, то !х равно нулю. Эта операция ассоциатив- на справа. logical OR operator (знак операции «логическое ИЛИ») (См. OR operator, logical.) 112
LONG.MIM Л' logical source line (логическая строка исходного текста) (См. line, logical.) logl Эта дополнительная функция (опция) является вариантом фун- кции log, который оперирует данными типа long double. Это относится к нововведениям Стандарта языка Си loglO Эта функция вычисляет десятичный логарифм своего аргу- мента х. #indude <math.h> double Iog10(double x); Если аргумент имеет отрицательное значение, имеет место ошибка «выход за пределы области определения». Если аргу- мент равен нулю и логарифм нуля оказывается непредстави- мым (он мог бы быть представлен как —«), имеет место ошибка «выход за диапазон допустимых значений». loglOf Эта дополнительная функция (опция) является вариантом функции logl 0, который оперирует данными типа float. Это отно- сится к нововведениям Стандарта языка Си loglOl Эта дополнительная функция (опция) является вариантом функции logl 0, который оперирует данными типа long double Это относится к нововведениям Стандарта языка Си. long Это допустимая аббревиатура для long int Данное ключевое слово используется также в нотации типа long double long double Эти ключевые слова применяются для представления одного из трех типов с плавающей точкой. (Двумя другими типами являются float и double.) Этот тип относится к нововведе- ниям Стандарта языка Си (См. floating type.) long double suffix (суффикс указания типа long double) (См constant, floating.) long float Архаичная (нестандартная) альтернатива double. long Int Эти ключевые слова обозначают целочисленный тип. Стан- дарт языка Си требует, чтобы для целого числа этого типа было предоставлено не меньше 32 битов. «Чистый» тип long int пред- полагает указание знака числа. (См integral type ) long int suffix (суффикс указания типа long inf) (См. constant, :nteger.) LONG_MAX Этот макрос, определяемый в limits.h, обозначает мак- симальное значение объекта типа long int. Оно должно быть равным по меньшей мере 2147483647 (32 бита). Это относится к нововведениям Стандарта языка Си Этот макрос расширяется до целочисленного константного выражения, пригодного к при- менению в директиве #if. LONG_MIN Этот макрос, определяемый в limits.h, обозначает мини- мальное значение объекта типа long int. Оно должно быть равным по крайней мере —2147483647 (32 бита). Это относится к ново- введениям Стандарта языка Си Этот макрос расширяется до 113
longjmp целочисленного константного выражения, пригодного к исполь- зованию в директиве #if. longjmp Эта функция восстанавливает контекст программы (или вызывающую среду), которая предшествующим обращением к sefjmp была записана на хранение в определяемый пользователем объект типа jmp_buf. #include <setjmp.h> void longjmp(jmp_buf env, int val); Функция longjmp не возвращает значение вызывающему моду лю; вместо этого она передает возвращаемое значение функции, которая первоначально вызывала sefjmp для записи на хранение соответствующий контекст Осуществляя это, longjmp передает val обратно функции sefjmp, чтобы последняя могла вернуть это значение своему вызывающему модулю. Если значение val рав но нулю, оно делается равным единице, чтобы прямое обраще- ние к setjmp (которая возвращает нуль) нельзя было «спутать» с актом возвращения нуля, который выполняет longjmp посредст- вом setjmp. Поведение функции не определено, если longjmp вызывается из вложенного обработчика сигналов (nested signal handler). Не следует вызывать longjmp из обработчика exit, подобного регист- рируемому функцией atexif. lvalue (именующее выражение) Это выражение используется для обозначения объекта. Чтобы быть lvalue, выражение должно быть пригодным к использованию со знаком & (операция адре- сации), исключая объекты класса памяти register н поля битов. Наиболее широко используемыми формами именующих выра- жений являются имена переменных и выражения вида *р, где р — указатель на объект. Знаки операций [] ♦ (одноместная операция) и — > всегда порождают именующее выражение, это же обычно делает . (точка) как знак операции. Другие знаки операций не создают именующие выражения. (См lvalue, modifiable; lvalue, non-modifiable.) lvalue, modifiable (модифицируемое именующее выражение) Это выражение, посредством которого значение может быть записа- но на хранение. Некоторые операции используют модифициру- емые именуюшие выражения в качестве операндов. Речь идет об операциях, знаками (operator) которых являются ++, —. а также все знаки присваивания, слева от которых размещается имену- ющее выражение. (См. lvalue; lvalue, non-modifiable ) lvalue, non-modifiable (немодифицируемое именующее выражение) Это выражение, посредством которого нельзя записать значение на хранение. Примерами таких выражений являются имя мас- сива и любое выражение, обозначающее объект типа const (См. lvalue; lvalue, modifiable.) 114
macro, function-like M macro (macros) Это идентификатор, которому посредством директи- вы # define ставится в соответствие последовательность лексем (token), называемая списком замещения, или макроподстанов- кой. В течение препроцессорной обработки каждое «появление» имени макроса заменяется соответствующим ему определением. Следовательно, макрос (его имя) — это аббревиатура его значе- ния. Иногда макрос рассматривается как символическая кон- станта, поскольку его имя обычно выбирается как символическое обозначение «скрывающегося» за ним определения макроса. Например: tfdefine PI 3.1415926 #define МАХ_ VALUE 100 # define Clear_Screen() printf("\033[2J") Отметим, что макрос можно определить без соответствующего значения. Например: #define NAME Поскольку NAME определяется не имеющим значение, все слу- чаи «появления» этого макроса в исходном тексте программы будут удалены в течение препроцессорной обработки. Определение макроса может включать другие, ранее определен- ные макросы. Это может явиться источником ошибок, трудно уловимых в процессе отладки программы. Многие компиляторы предоставляют опцию командной строки (command line option), позволяющую записать на хранение результат работы препро- цессора это дает возможность точно «рассмотреть», как расши- ряется макрос. (См. macro, function-like; macro, object-like; macro, predefined, macro, replacement.) macro, function-like (макрос, подобный функции) Это макрос, опре- деляемый со списком параметров (возможно, пустым). Напри- мер: #define Clear_5creen() printf("\033[2J") #define INTSWAP(a, b) {int t = (a); (a) = (b); (b) = t;) # define Isdigit(c) ((c) >= '0' && (c) <= '9') Лексема «открывающая круглая скобка» ( должна следовать непосредственно за именем макроса, подлежащего определе- нию. Что же касается других препроцессорных лексем в опреде- лении макроса, то между ними могут быть пробелы. Например: #define М( а ) (а ) определяет подобный функции макрос с одним аргументом (па- раметром), в го время как #define М ( а ) ( а ) 115
macro, object-like определяет подобный объекту макрос, «содержание» которого (»)(») macro, object-like (макрос, подобный объекту) Это макрос, опреде- ляемый без списка параметров. Макрос подобной формы часто называют символической константой. Например- #define PI 3.1415926 #define Мах_Value 100 (См. macro, (unction-like ) macro, predefined (предопределенный или встроенный макрос) Это макрос, автоматически определяемый в трансляторе. Стандарт языка Си требует наличия следующих макросов:_______________FILE_, __UNE______DATE__,___TIME__,__STDC___Они не могут быть под- вергнуты воздействию директивы #urdef, их нельзя переопреде- лить. Конкретные реализации систем программирования на языке Си часто имеют также свои встроенные макросы. Так, компилятор, работающий под управлением операционной сис- темы UNIX, может предопределить, например, макросы UNIX, SVID и BSD. Адекватная реализация Стандарта должна уметь «читать по складам» (spell) любые дополнительные встроенные макросы, имена которых имеют два ведущих знака подчеркивания, за которым следует прописная буква. Многие компиляторы поддерживают опцию фазы трансляции, определяющую макросы до начала обработки. Это расширяет возможности пользователя по определению встроенных макро- сов. macro, redefinition of (переопределение макроса) Макрос, подоб- ный функции, может быть переопределен как некоторый другой макрос, подобный функции, при условии что все подобные определения содержат одинаковое количество одинаково «про- износимых» (spelling) параметров, а их списки замещения иден- тичны. (Два списка замещения идентичны, если они содержат одинаковый набор лексем и то же самое число наборов раздели- тельных пробелов Однако символы, определяющие пробелы, — white space characters — могут варьироваться.) Аналогично мак- рос, подобный объекту, может быть переопределен как некото- рый другой макрос, подобный объекту, при условии, что все такие определения содержат идентичные списки замещения (макроподстановки). Например: #define А 10 +tabS # define A 10tab+ 5 #define А 10 + 5 #deftne В(а, Ь) a +tabb #de‘ine В(а, b) atab+ Ь #define В(а. Ь) а + Ь Однако, полагая заданными приведенные выше определения, следующие переопределения недействительны: 116
macro replacement # define A 1O+tab5 #define A 10+ 5 #define A 10+5 #define A 15 # define B(a, b) a+fabb #define B(a, b) a+b #define B(x, у) x + у Причина ошибочности переопределения в том. что отсутствие пробелов ие соответствует их присутствию. macro, safe (макрос «надежный») Это макрос, подобный объекту, определение которого обеспечивает вычисление каждого пара- метра (аргумента) только один раз. (См. maro, unsafe.) macro, unsafe (макрос «ненадежный») Этот макрос, подобный фун- кции может быть определен так, что при его расширении ре зультирующий текст содержит один или несколько параметров, появляющиеся более одного раза. Например: #define Isdigit(c) ((c) >= 'О' && (с) <= ’9') Однако вызов этого макроса с параметром, имеющим побочный эффект, может привести к неожиданным действиям. Так, попыт- ка использования lsdig't(x++) при х. равном 9. потерпит неудачу, поскольку значение х будет увеличено на 1 прежде, чем оно подвергнется проверке во второй раз. К тому же значение х должно было бы дважды быть увеличенным на 1. По этой причине подобное определение макроса получило название не- надежного (unsafe). Такой макрос должен вызываться только с параметрами без побочных эффектов или от его услуг следует отказаться, заменив на макрос, подобный функции. За исключением случаев явного указания Стандарт языка Си допускает существование всех библиотечных функций также и в форме определений макросов при условии, что последние являются «надежными» (safe). macro replacement (макроподстановка) Речь идет о правилах, соглас- но которым выполняется так называемое расширение макроса при каждом обращении к нему. В случае макросов, подобных объектам, при каждом вызове макроса его имя просто замещает- ся соответствующим списком замещения из определения макро- са. Для макросов, подобных функциям, каждое обращение к макросу также предполагает замену его имени соответствующим списком замещений (замен), однако этот процесс сопровождает- ся заменой каждого формального параметра соответствующим фактическим. Если макрос расширяется до набора лексем, вклю- чающего имя самого расширяемого макроса, дальнейшая замена не выполняется. Стандарт языка Си требует, чтобы макрорасши- рение не имело характера бесконечной рекурсии. (См. stnngire и token pasting preprocessor орет a tors ) 117
main main Каждая программа, выполняемая под управлением другой программы (операционной системы), должна включать в свой состав функцию, именуемую mam и являющуюся логической точкой входа в программу. Функция main необязательно должна быть первой в списке функций, образующих единицу трансля- ции. Си-программа, выполняемая вне управляющей програм- мы, не нуждается в наличии функции main. Хотя main — это эквивалент PROGRAM в языке Фортран и program в языке Паскаль, это только еще одна функция, и следовательно опа (main) может получать передаваемые ей параметры. Функцию main можно вызывать даже рекурсивно, если для этого имеются достаточные основания. (См. argc, argv и env.) malloc Эта функция динамически выделяет непрерывную область памяти размером size байтов. #indude <sfdlib.h> void *malloc($ize_t size); Нет гарантии, что будет выделена область памяти требуемого размера. Возвращаемое функцией значение имеет тип void * и, следова- тельно. совместимо по операции присваивания (assignment compatible) с указателем на объект любого типа или незавер- шенного типа. Как следствие, нет необходимости в явном зада- нии приведения типа (cast). Значение, которое возвращает malloc, — это адрес начала выделенной области памяти; при этом гарантируется соответствующее выравнивание этого адреса на границу памяти, обеспечивающуто хранение в области любого объекта. Если память не может быть выделена, возвращаемое значение равно NULL. Если size равно нулю, от конкретной реализации системы про- граммирования на языке Си зависит, будет ли возвращаемым значением NULL или указатель с уникальным значением. Если в качестве первого параметра функции realloc использовать NULL, то можно использовать эту функцию для получения того же эффекта, который достигается посредством malloc с тем же значением size. (См. calloc и (гее.) manifest constant (самообъявляющаяся константа) Это синоним макроса, подобного объекту. Примерами в Стандарте языка Си могут служить NULL и EOF matb.h Этот объект-заголовок содержит средства поддержки библио- течных математических функций. Реализация Стандарта языка Си требует поддержки для каждой функции только такого ее варианта, который оперирует данными типа double. При нали- чии поддержки вариантов математических функций, манипули- рующих данными типа (loaf или long double, имена соответствую- щих функций имеют суффиксы f или I (например sqrl, sgrif и sqrtl). 118
matherr math.h содержит объявления и определения для следующих иден- тификаторов: Имя Значение acos asin atan atan2 ceil Арккосинус Арксинус Арктангенс Главный арктангенс Наименьшее целое не меньше ар- гумента COS cosh Косинус Гиперболический косинус exp fibs Экспонента Абсолютное значение числа с плавающей точкой floor fmod Наименьшее целое Остаток от деления чисел с плава ющей точкой frexp Расчленение аргумента на норма- лизованную мантиссу и целочис- ленный порядок HUGE-VAL Очень большое значение числа с плавающей точкой Idexp Произведение первого параметра и 2 в степени второго параметра log logic modf Натуральный логарифм Десятичный логарифм Расчленение аргумента на целую и дробную части pow sin sinh sqrf tan tanh Возведение в степень Синус Гиперболический синус Квадратный корень Тангенс Гиперболический тангенс (См. future library directions ) matherr Эта нестандартная функция позволяет снабжать информа- цией обработчика математических ошибок, предоставляемого пользователем. Эта функция манипулирует структурами типа struct exception и макросами DOMAIN, OVERFLOW, PLOSS, SING.TLOSS и UNDERFLOW. 119
MB CUR MAX MB_CUR_MAX Этот макрос, определяемый в stdlib.h, расширяется до положительного целочисленного выражения значение кото- рого — это максимальное число байтов в многобайтовом символе (multibyte character) для расширенного набора символов, зада- ваемого текущей «культурной средой» (locale) с помощью кате- гории LC_CTVpE; при этом указанное значение никогда ие пре- вышает MB_LEN_MAX (определяемый в limits.h). Это относится к Нововведениям Стандарта языка Си. MB_LFN_MAX Этот макрос, определяемый в limits.h, обозначает максимальное число байтов в многобайтовом символе (multibyte character) для любой поддерживаемой «культурной среды» (locale). (Ойо должно быть равным по меньшей мере 1.) Этот макрос расширяется до целочисленного константного выраже- ния пригодного к использованию в директиве #if. Это относится к нововведениям Стандарта языка Си. (См. MB_CUR_MAX.) mblen Эта функция подсчитывает количество байтов в многобайто- вом символе (multibyte character), на который указывает s. #include <stdlib.h> int mblen(con$t char •$, $ize_t n); Функция mblen относится к нововведениям Стандарта языка Си. mbstowcs Эта функция преобразует последовательность многобай- товых символов (multibyte character) в строку соответствующих символов расширенной формы (wide character). #inc!ude <$tdlib.h> int mbstowc$(wchar_t »pwcs, const char *s, size_t n); Функция mbstowcs относится к нововведениям Стандарта языка Си. mbtowc Эта функция подсчитывает количество байтов в многобай- товом символе, на который указывает s. Затем она определяет код для значения данного типа wchar_t, которое соответствует указанному многобайтовому символу. #include <sfdlib.h> int mbtowc(wchar_t »pwc, const char *s, size ,t n); Функция mbtowc относится к нововведениям Стандарта языка Си. mem prefix (префикс mem) (См. (uture library directions.) member (член, или элемент) Речь идет об идентификаторе, объявля- емом как часть (член) шаблона структуры или объединения. К таким членам (элементам) обращаются (адресуются) посредст- вом знака «точка» (.) илн «стрелка» (—>). Этот термин реже применяется к константам перечисляемого типа, которые явля- ются элементами определения данных перечисляемого типа. 120
memirove Вместо «член» или «элемент» в таких случаях говорят «перечис- ляемая константа». member selection operators (знаки операции «выбор элемента») (См arrow operator и dot operator.) memchr Эта функция осуществляет поиск символа с среди первых п символов строки t. #indude <string.h> void »memchr(const void int c, size_t n); Если символ с найден, функция memchr возвращает указатель на его местоположение в строке s; в противном случае значением, возвращаемым функцией, является NULl. Символ с преобразует- ся в данное типа unsigned char прежде, чем начинается поиск. memcmp Эта функция сравнивает п символов, на местоположение которых указывает s2 с символами, на местоположение которых указывает s1. #indude <string.h> int memcmpfconst void «si, const void »s2, size_t n); Значение, возвращаемое функцией, может быть меньше нуля, равным нулю или больше нуля. Это означает, что первые п символов, начинающиеся с адреса st имеют двоичные значения меньшие, равные или большие соответственно, чем символы, местоположение которых начинается с адреса s2. memcpy Эта функция копирует п символов из области памяти, на которую указывает s2. в область хранения символов, на которую указывает st. #include <string.h> void •memcpy(void »s1, const void »s2, $ize_t n); Возвращаемым значением функции являются значение st Если объекты, расположенные по адресам si и s2 перекрываются, поведение memcpy не определено. Для копирования перекрыва- ющихся объектов следует использовать функцию -nemmove. memmove Эта функция копирует п символов из области памяти, на которую указывает s2. в область памяти для хранения символов, на которую указывает s1 #indude <$tring.h> void *memmove(void «st, const void «s2, size_t n); Возвращаемым значением функции является значение si. Фун- кция memmove выполняется корректно даже когда объекты, рас- положенные по адресам si и s2 перекрываются. Если известно, что объекты не перекрываются, более эффективно применение функции memcopy функция memmove относится к нововведени- ям Стандарта языка Си. 121
memory management functions memory management functions (функции управления памятью) Это объявляемые в stdlib.h функции calloc, free, malloc и realloc memset Эта функция присваивает значение с первым п символам объекта, на который указывает s. #indude <string.h> void *memset(void *s, inf c, size_t n). Перед началом копирования значения с в первые п позиций объекта, адресуемого указателем s, выполняется преобразование с в данное типа unsigned char. Возвращаемым значением функции является s. minus operator, unary (знак одноместной операции «минус») (См. unary minus operator.) mktime Эта функция преобразует расчлененное на компоненты (broken-down time) календарное время (как это определено типом struct tm) в структуре, на которую указывает timepfr, в календарное время. #indude <time.h> time_f mktime(sfrucf tm *timepfr); Значением, которое возвращает функция, является календарное время, получаемое в результате преобразования. Если данное время представлено быть не может возвращаемым значением является (fime_t)(—1). Все члены, необходимые в структуре tm (за исключением trr_wday и tm_yday) должны быть инициализирова- ны. При успешном выполнении функции mktime эти два члена оказываются заполненными. modf Эта функция разделяет число с плавающей точкой на целую и дробную части. #indude <math.h> double mod4(doub,a value, double *iphj. Каждая часть имеет тот же знак, что и исходное число. Целая часть записывается в область памяти, на которую указывает iptr, а дробная часть является значением, возвращаемым функцией. modff Эта дополнительная функция (опция) является вариантом функции modf, оперирующим данными типа float. Это относится к нововведениям Стандарта языка Си. modfl Эта дополнительная функция (опция) является вариантом функции modf. который оперирует данными типа long double. Это относится к нововведениям Стандарта языка Си. modifiable lvalue (модифицируемое именующее выражение) (См. lvalue; lvalue, modifiable; lvalue, non-modifable.) modulus function (функция вычисления абсолютного значения) (См. modf для модулей чисел с плавающей точкой; для модулей целых чисел см. remainder operator.) 122
mulfibyte string mon_decimal_potnt Этот член структуры Iconv является указателем на строку, содержащую десятичную точку, применяемую при фор- матировании монетарных величин. Бели содержимым строки является это означает, что требуемое значение отсутствует в текущей «культурной среде» (locale) или оно имеет нулевую длину. mongrouping Этот член структуры Iconv является указателем на строку, элементы которой обозначают размер каждой группы цифр в форматированных монетарных величинах. Если строка имеет вид это означает, что в текущей «культурной среде» (locale) значения нет или его длина равна нулю. Элементы указанной строки символов интерпретируются следующим об- разом: CHAR_MAX В дальнейшем никакая группировка не может быть выполнена. О Предшествующий элемент подлежит повторному использо- ванию для остатка цифр. other Целочисленное значение — количество цифр, составля- ющих текущую группу. Следующий элемент подлежит ана- лизу для определения размера следующей группы цифр перед текущей группой. mon_thousands_sep Этот член структуры iconv является указателем на строку, содержащую разделитель (separator) для группы цифр перед десятичной точкой в форматированных монетарных вели- чинах. Если строка имеет вид это означает, в текущей «куль- турной среде» (locale) значения нет или его длина равна нулю. multlbyte character (многобайтовый символ) В некоторых «культур- ных средах» (locale) многие символы не могут быть представлены в «рамках» того, что в Западных странах именуется байтом. (В Западных странах термин «байт» применяется как эквивалент термина «символ», даже когда когда речь идет о вычислительных машинах, архитектура которых ориентирована на машинное слово ) Более одного байта необходимо для представления упо- мянутых выше символов, в результате чего многобайтовый код используется для представления многобайтового символа. Метод кодирования байтов зависит от «культурной среды». Многобай- товый символ хранится в памяти в виде массива одного или нескольких символов (данных типа char). Следует отличать мно- гобайтовые символы от символов расширенной формы пред- ставления (wide characters). (См. MB_CUR„*AAX .4B_LEN_MAX, mblen. mbtowc и wetomb.) multlbyte character functions Это объявляемые в stdlib.h функции mblen, mbtowc и wetomb. Поведение этих функций зависит от текущей «культурной среды» и в частности от категории LC_CTYPE. multlbyte string (строка многобайтовых символов) Это строка, со- держащая один или несколько многобайтовых символов. (См. mbstowcs и westorrbs.) 123
muftibyte string functions multibyte string functions (функции многобайтовых строк) Это объ- являемые в stdlib.h функции mbstowcs и wcstombs. Поведение этих функций зависит от текущей «культурной среды» и в частности от категории LC.CTYPE. multiplication assignment operator (знак операции «умножение с присваиванием») Знак двухместной операции *= позволяет со- вместить умножение с присваиванием так, что выр/ *= выр2 эквивалентно выр/ = выр/ • выр2. за исключением того, что в первом случае выражение выр/ вычисляется только один раз Порядок вычисления операндов не указан. Оба операнда долж- ны быть данными арифметического типа, а левый операнд должен быть модифицируемым именующим выражением (lvalue). Тип результата — это тнп выражения выр/ Данная операция ассоциативна справа. (См. assignment operator, compound.) multiplication operator (знак операции «умножение») Знак двухме- стной операции «умножение» (•) обеспечивает перемножение значений операндов. Порядок вычисления значений операндов не задан. Оба операнда должны быть арифметического типа. Над операндами выполняются обычные арифметические преобразо- вания. Данная операция ассоциативна слева. N n cs_precedes Этот член структуры Iconv является неотрицательным числом, равным t или 0 в зависимости от того, предшествует currency_symbol (денежный знак) отрицательному значению фор- матированных монетарных данных или следует за этим значе- нием соответственно. CHAR-MAX указывает на отсутствие значе- ния в текущей «культурной среде» (locale). n_sep_by space Этот член структуры Iconv является неотрицатель- ным числом, равным 1 или 0 в зависимости от того, отделен currency_symbol (денежный знак) пробелом от отрицательного зна- чения форматированных данных или не отделен соответственно. CHAR-MAX указывает на отсутствие значения в текущей «куль- турной среде» (locale). n sign_posn Этот член структуры Iconv является неотрицательным “ числом, значение которого — позиция nega‘ive_sign (знака отри- цания) в форматированной монетарной величине. Это значение интерпретируется следующим образом: О Круглые скобки охватывают величину и currency_$vmbol (де- нежный знак) 1 Строка знака предшествует величине и currency-symbol 2 Строка знака следует за величиной и currency, symbol 124
NCEG (Numerical С E (tensions Group) 3 Строка знака непосредственно предшествует величине и currency _symbol 4 Строка знака непосредственно следует за currercy_symbol CHAP _М АХ указывает на отсутствие значения в текущей "куль- турной среде" (locale) name space (пространство имен) Речь идет о возможности исполь- зования одного и того же идентификатора для различных целей в пределах той же самой сферы действия (хотя это и нельзя считать хорошим стилем Программирования) при условии, что каждое объявление этого идентификатора принадлежит другому (отличному) пространству имен. Стандарт языка Си определяет для идентификаторов следующие пространства имен. 1 Имена формальных параметров в прототипе 2. Имена меток 3. Структуры, объединения и теги перечисляемых типов 4. Набор членов в структуре или объединении 5. Все прочие имена (переменных, функций, элементов typedel и констант перечисляемого типа) Сюда не включены имена макросов, поскольку после работы препроцессора они перестают существовать и. следовательно, "не видны" компилятору. Однако, с точки зрения программиста, имена макросов рассматриваются как имена, которые разделяют с другими идентификаторами то же самое пространство имен. В приводимом ниже примере каждое применение идентификато- ра х — это использование другого пространства имен. Благодаря этому следующий фрагмент программы корректен void v(inl х); struct х (int х) si; struct у {int x) s2; void f() { int x; goto x; x: x = st .x; x = $2.x; ) nan ow type (узкий тип) (См type narrow.) NCEG (Numerical C Extensions Group) Созданная в начале 1 989 го- да автором этой книги Р. Жешке (Rex Jaeschke), рабочая группа NCEG призвана определить набор расширений Стандарта языка Си, которые должны помочь программистам в решении число- вых задач. Основу интересов группы NCEG составляет следую- щее: совмещение имен (aliasing), массивы переменных разме- ров, синтаксис массивов, поддержка векторов, арифметика комплексных чисел, информация IEEE и обработка исключи- 125
NDEBUG тельных состояний (exception handling) (Для получения более детальной информации следует обращаться посредством элект- ронной почты к Rex Jaeschke по адресу rex@aussie.com или к Тош MacDonald по адресу tam@cray.com.) Группа NCEG официально признана как рабочая группа X3J111 стандартов ХЗ (the ХЗ standards working group X3J11.1). Рабочая группа WG14 также наблюдает за деятельностью NCEG на международном уровне. NCFG планирует публикацию технического отчета (Technical Report), а не стандарта. Расширения Стандарта языка Си, име- ющие отношение к параллельной обработке, являются объектом деятельности комитета ХЗН5. NDEBUG Если объявление об этом макросе, определяемом пользо- вателем присутствует в точке включения assert.h, макрос assert принимает определение как выражение типа ((void)0). Если NDEBUG не определен к моменту включения указанного объекта- заголовка, макрос assert определяется так, чтобы достигался эф- фект утверждения (assertion), результатом которого может быть аномальное завершение работы программы. near Стандарт языка Си требует, чтобы ключевые слова расшире- ний начинались со знака подчеркивания. Начиная с версии б.О, система Microsoft С пополнена ключевым словом _пеаг в качестве синонима слова near. Ожидается широкое распространение _пеаг в реализациях системы программирования на языке Си, функ« ционирующих в среде MS-DOS. near Это нестандартное ключевое слово широко поддерживается реализациями системы программирования на языке Си, функ- ционирующими в 16-битовом режиме на микропроцессоре с сегментированной памятью, подобном микропроцессорам се- мейства Intel 80x86. Ключевое слово rear используется в качестве модификатора типа и может применяться как к объектам, так и к функциям. Например: double near table[100]; char neai *+nppc: char near * near anpnpc; long int near * near check(char near ♦); int (near *funptr)(void); Данные или функция с модификатором типа near размещаются в заданном по умолчанию сегменте данных или текущего кода соответственно. Адрес данных или функции имеет длину рав- ную 16 байтам. Некоторые реализации системы программирования на языке Си предоставляют в распоряжение программиста опцию ком пи. лятора, именуемую near. Использование этой опции приводит к тому, что все указатели, не имеющие модификаторов типа near far или huge, «ведут себя» так, как будто бы их типы были определены с модификатором near. 126
NUlL nearest integer functions (функции ближайшего целого) Речь идет об объявляемых в math.h функциях ceil и floor и их эквивалентах, оперирующих с данными типа float и long double. negative_sign Этот член структуры Iconv является указателем на строку символов, используемую для задания отрицательного значения форматированных монетарных данных. Если содержи- мым строки является это означает, что значение отсутствует в текущей «культурной среде» (locale) или оно имеет нулевую длину. new Это ключевое слово языка Си-Н не является частью Стандарта языка Си. Планируя использование исходных текстов программ, написанных на языке Си, в среде Син-, следует избегать при- менения new в качестве идентификатора. new-line character (символ «новая строка») Речь идет об одном из возможных символов пробела (white space characters), допусти- мых к применению в исходном тексте программы, а также в качестве входных данных некоторых библиотечных функций. Символ «новая строка» используется для представления символа «конец строки» (end-of-line character), который генерируется при нажатии клавиши ENTER или RETURN (или подобной клавиши) на клавиатуре машины. Во многих вычислительных системах «из- вне» признак «конца строки» выглядит как пара символов carriage-return (возврат каретки) и line-feed (перевод строки) или как просто line-feed. Однако «внутри» язык Си всегда обраща- ется с ним как с одним символом. new-line escape sequence (управляющая последовательность «новая строка») «Новая строка» (new line) может быть представлена в программе в виде управляющей последовательности \п. noalias Это ключевое слово для обозначения модификатора типа было предложено комитетом X3J11 и просуществовало некото- рое время в одном из вариантов проекта ANSI С. Это ключевое слово должно было снабжать компилятор информацией о совме- щении имен (aliasing), позволяя последнему выполнять оптими- зацию более «агрессивно», noalias не входит в состав средств Стандарта языка Си nonlocal Jumps header (объект-заголовок нелокальных переходов) (См. setjmp.h.) not-equal-to operator (знак операции «не равно») (См. inequality ope-ator.) NULL Этот макрос расширяется до определяемой реализацией системы константы в виде null-указателя (null pointer constant). Обычно макрос NUlL имеет значение 0. 0L или ((void *)0) и идентично определен в следующих объектах-заголовках: locale h. stddef.h, stdio.h, stdlib.h, string.h и time.h. Стандарт языка Си не требует, чтобы значение константы в виде null-указателя имело внутреннее представление в формате «все биты равны нулю»; необходима только гарантия, что адрес (зна- 127
rull character чение этого указателя) не может быть использован в качестве адреса какого-либо объекта или функции. NULL не должен никогда применяться в качестве null-символа (null character), потому что по определению NULL не всегда раьен нулю. null character (null-символ) Это символьная константа '\0', применя- емая для завершения строки символов. Строковый литерал (на- пример. имеющий форму ABCD) неявно включает в себя замы кающий null-символ. Исторически так сложилось, что многие программисты использовали NULL в контексте, требующем null- символ поскольку они «знали», что NULL был определен как О. Это всегда было плохим стилем программирования, а при ис- пользовании Стандарта языка Си такое решение действительно влечег за собой неудачу, так как NULL может быть определен иным образом. null pointer constant (константа «null-указатель») (См. constant, null pointer.) null preprocessing directive # (null-директива препроцессора) Эта директива имеет следующий формат: # Она ничего не выполняет. null statement (null-команда) Это команда, состоящая только из сим- вола «точка с запятой». Numerical С Extensions Group (См. NCEG.) numerical limits (пределы числовых значений) (См. float.h и limits.h.) О object (объект) Это область памяти, содержимое которой может представлять значения, соответствующие заданному типу дан- ных. obsolescent (выходящий из употребления, устаревший) Речь идет о любом термине, применение которого становятся «несовремен- ным». «Наклеивание» подобного ярлыка на какой-либо элемент Стандарта является типичным признаком изъятия этого элемен- та (термина) из будущих версий Стандарта. Ниже перечисляются характеристики С.андарта языка Си, по- лучившие оценку как выходящие из употребления: • Ограничение количества значащих символов во внешнем имени значением меньше, чем 31 и использование только букв верхнего или нижнего регистров (only one case). 128
onexit_t • Размещение в объявлении (declaration) спецификатора класса памяти где-либо, кроме начала спецификаторов объявления. • Применение «деклараторов» функций (function declarators) с пустыми круглыми скобками (т. е. не в форме прототипа функции). • Применение определений функций (function definitions) с отделенными друг ст друга списком параметров и описанием идентификаторов последних (т. е. описание заголовка функ- ции не в форме ее прототипа). • Использование двух параметров, объявляемых массивами (до их «подгонки» к типу указателей), в виде отдельных именую- щих выражений (lvalue) с целью обозначения одного и того же объекта. (См. future language directions.) octal constant (восьмеричная константа) (См. constant, integer.) octal escape sequence (управляющая последовательность представ- ления символов в восьмеричной форме) Это последователь- ность символов вида \ddd, позволяющая представить символ посредством эквивалентного ему восьмеричного значения ddd (последовательность из 1, 2 или 3 цифр). Управляющая после- довательность \0 обычно применяется для представления null- символа, поскольку для этой последовательности требуется внут- реннее представление посредством двоичных нулей. Максимальное количество цифр в восьмеричном представлении фиксировано и равно трем. Однако максимальное количество пифр для шестнадцатеричного представления (посредством уп- равляющей последовательности) не фиксировано. offsetof Этот макрос, определяемый в stddef.h, относится к нововве- дениям Стандарта языка Си. Он позволяет найти измеряемое в байтах значение смещения (offset) члена структуры относитель- но начала последней. Этот макрос расширяется в целочисленное константное выражение, тнп которого — size_t. Если членом структуры является поле битов, поведение макроса не определе- но потому, что нельзя получить адрес поля битов. Пример ис- пользования макроса: #inc!ude <stddef.h> struct tag { int i; double d: }; size_t va’ue = oftsetoffstruct tag, d); onexit Это нестандартный вариант функции atexit, предложенный на начальном этапе разработки Стандарта языка Си. onexit_t Это тип значения, возвращаемого нестандартной функ цией onexit 5 Заказ 677 129
OPEN MAX OPEN_MAX Это нестандартный вариант макроса ЕОРЕЬСМАХ. operand Операнд) Это выражение, над которым выполняется one рация, определяемая соответствующим знаком (operator). Одно- местные операции имеют один операнд, двухместные операции манипулируют двумя операндами, в трехместной операции уча ствуют три операнда. (См order of evaluation.) operator Это ключевое слово языка Си++ не входит в состав средств Стандартов языка Си Планируя использование исходных тек- стов программ, написанных на языке Си, в среде Си++, следует избегать использования operator в качестве идентификатора. operator (знак операции) Течь идет об одной или нескольких взятых вместе лексемах (tokens) языка программирования, используе- мых как средство задания определенных операций над одним или несколькими операндами с целью получения результата в виде значения некоторого данного, обозначения объекта или функции, побочного эффекта или комбинации перечисленного. (Хотя большинство операций — это одиночные лексемы, т е. один знак — одна лексема, некоторые знаки представляют собой сочетание лексем. Например: [] — знак, используемый при индексации; () — знак, используемый для вызова функции; ?. — знак формирования «условного» выражения). Знаки операций, включенные в состав средств Стандарта языка Си, представлены в приводимой ниже таблице. Знак Значение 1 1= % & && 0 * + ++ > Логическое отрицание Не равно Вычисление остатка деления Побитовое И и вычисление адреса Логическое И I (реобразование типа и вызов функции Умножение и обращение по адресу Сложение и плюс одноместной операции Увеличение на 1 постфиксное или префиксное Запятая — Вычитание и минус одноместной операции — Уменьшение на 1 постфиксное или префиксное -> Выделение элемента структуры (объединения) • Выделение элемента структуры или объедине- ния / Деление 130
operator precedence Знак Значение Л Л Л Меньше Сдвиг влево <= Меньше или равно = Присваивание > Равно Бол в ше Больше или равно » ?: Сдвиг вправо Вычисление выражения по условию [] 1 Выделение элемента массива Побитовое исключающее ИЛИ Побитовое (включающее) ИЛИ II Логическое ИЛИ Побитовое отрицание (дополнение до 1) ор— Составная операция присваивания (ор—знак операции сложения s.zeof Вычисление размера объекта на этапе трансля- ции Знак, именуемый «плюс одноместной операции», относится к нововведениям Стандарта языка Си. operator, binary (’нак двухместной операции) Такой знак связывает между собой два операнда, участвующие в операции. Примеры таких знаков: /, « и && operator, ternary (знак трехместной операции) Такой знак связыва- ет между собой три операнда, участвующие в операции. В языке Си имеется только одна трехместная операция и соответственно один знак трехместнон one рапии. а именно: 1:. operator, unary (знак одноместной операции) Такой знак имеет в своем «распоряже яии> только один операнд Например: ++, f и operator precedence (иерархия знаков операций согласно приорите- ту их выполнения) Иерархия знаков операций, определяемая приоритетом выполнения последних определяет правило попар- ной группировки членов вычисляемого выражения. Знак опера- ции занимающий более высокую позицию (строку с меньшим номером) в таблице приоритетов операций, имеет предо ^чтение при определении порядка вычислений. Группировка членов выражения для знаков операций равного приоритета выполня- ется согласно правилу ассоциативности операций. Ниже приво- дится таблица приоритета операций и их ассоциативности, т е. очередности и порядка выполнения. 131
OR assignment operator, bitwise exclusive Приоритет операций Знак операции О [] ->.++ — I ~ ++ — Ч— • & (тип) sizeof . / % + - « » <<=>>= = 1= А I II ? = +=-=*= /= %- »= «= &= ’= |= Порядок выполнения Слева направо Справа налево Слева направо Слева направо Слева направо Слева направо Слева направо Слева направо Слева направо Слева направо Слева направо Слева направо Справа налево Справа налево Слева направо Отметим, что согласно Стандарту языка Си постфиксные вари- анты операций ++ и — имеют более высокий приоритет, чем их префиксные эквиваленты. Это не должно нанести ущерб уже разработанным программам. В то же время это может позволить конструировать некоторые новые выражения. Иерархия знаков операций не имеет отношения к порядку вы- числения отдельных членов выражения. Например, в выраже- нии t() + g() очередность вычислений очевидна, однако порядок вызова функций не специфицирован. OR assignment operator, bitwise exclusive (знак составной операции «побитовое исключающее ИЛИ» и «присваивание») Знак этой составной двухместной операции ('=) позволяет объединить one рации побитового исключающего ИЛИ и присваивания таким образом, что выр! '= выр2 эквивалентно выр/ = выр/ ' выр2 за исключением того, что в первом случае выражение выр! вычисляется только один раз. Оба операнда должны быть дан- ными целочисленного типа. Левый операнд должен быть моди- фицируемым именующим выражением (lvalue). Порядок вы- числения операндов не специфицирован. Тип результата — это тип выражения выр/. Данная операция ассоциативна справа. (См. assignment operator, compound.) OR assignment operator, bitwise inclusive (знак составной операции «побитовое ИЛИ» и «присваивание») Знак этой составной двухместной операции (|=) позволяет объединить операции по- битового (включающего) ИЛИ и присваивания таким образом. 132
overload что выр! |= выр2 эквивалентно выр! = выр! | выр2 за исклю- чением того, что в первом случае выражение выр! вычисляется только один раз. Оба операнда должны быть данными целочис- ленного типа. Левый операнд должен быть модифицируемым именующим выражением (lvalue). Порядок вычисления операн- дов не специфицирован. Тип результата — это тип выражения выр1. Данная операция ассоциативна справа. (См assignment operate*-, compound | OR operator, bitwise exclusive (знак операции «побитовое исключа- ющее ИЛИ») Знак этой двухместной операции (*) позволяет вычислить побитовое исключающее ИЛИ двух операндов цело- численного типа. Порядок вычисления выражений, представля- ющих операнды, не специфицирован. Над операндами выпол- няются обычные преобразования арифметических типов. Данная операция ассоциативна слева. OR operator, bitwise inclusive (знак операции «побитовое ИЛИ») Знак этой двухместной операции (I) позволяет вычислить поби- товое (включающее) ИЛИ двух операндов целочисленного типа. Порядок вычисления выражений, представляющих операнды, не специфицирован. 11ад операндами выполняются обычные пре образования арифметических типов. Данная операция ассоциа- тивна слева. OR operator, logical (знак операции «логическое ИЛИ») Знак этой двухместной операции (||) позволяет вычислить логическое ИЛИ двух операндов скалярного типа. Результат операции — это данное типа int, значение которого равно 0 (если «ложно») или 1 (если «истинно»). После вычисления левого операнда имеет место точка следования (sequence point). Сначала вычисляется левый операнд, и, если результат проверки — «истинно», вычис ление правого операнда не выполняется. Данная операция ассо- циативна слева. order of evaluation (порядок вычислений) Речь идет о порядке, в котором вычисляются значения членов выражения. В языке Си имеется очень немного операций, для которых специфицирован порядок вычисления операндов. К операциям, указывающим порядок вычисления операндов, относятся «логическое ПЛИ», «логическое И», операция «запятая* и «условное выражение» (?:). Эти четыре операции содержат точки следования (sequence point). (См evaluation.) ordinary identifier паше space (пространство имен идентификато- ров) Это пространство имен, используемое переменными, фун- кциями, именами typedet и константами перечисляемого тип а. OVERFLOW Этот нестандартный макрос используется с функцией mafherr overload Это архаичное ключевое слово языка Си++. <<<> 133
p cs preced«s P p cs_precedes Этот член структуры Iconv является неотрицательным членом р_а precede» получает значение 1 или 0 в зависимости от того, как расположен currency „symbol (символ валюты) в поле представления неотрицательных форматированных монетарных данных: перед числовой величиной или после нее. Значение p_cs_precedes, равное CHAR_MAX свидетельствует об отсутствии значения в текущей «культурной среде» (locale). р вер by «расе Этот член структуры Iconv является неотрицатель- ным числом, а именно, единицей или нулем в зависимости от того, отделяется или не отделяется eurrency_symbo. (символ валю- ты) пробелом от неотрицательного значения форматированных монетарных данных. Значение р _sep „Ьу „space, равное CHAR_MAX, свидетельствует об отсутствии значения в текущей «культурной среде» (locale) p_sign_posn Этот член структуры konv является неотрицательным числом; ему присваивается значение, указывающее позицию positrve„s>gn (знака «плюс») в неотрицательных форматирован- ных монетарных данных. Значение p_sign .posn интерпретирует- ся следующим образом- О Круглые скобки охватывают величину и currency „symbol сим вол валюты) 1 Строка знака предшествует величине и currency „symbol 2 Строка знака следует за величиной и currency „symbol 3 Строка знака непосредственно предшествует currency „symbol 4 Строка знака непосредственно следует за currency „symbol CHAR „МАХ означает что значение отсутствует в текущей «куль- турной среде» (locale). parameter (параметр или аргумент) (См. argument, formal ) parameter, ellipsis (параметр «многоточие») (См. ellipses.) parameter type list (параметр в виде списка типов) Это перечень разделяемых запятой типов (сопровождаемых, но не обязательно идентификаторами параметров), как это имеет место в прототипе фу нкции. parentheses punctuator (круглые скобки как знак препинания) Речь идет о возможности применения группирующих круглых скобок в качестве знака препинания. Эти скобки можно использовать в выражениях для изменения приоритета (естественной очередно- сти) выполнения операций. Например, в выражении а + (Ь»с) группирующие скобки являются лишними (они «избыточны»): этого нельзя сказать о выражении (а + Ь)*с. Значение выраже- ния, заключенного в круглые скобки, имеет тот же тип, что и значение этого выражения без охватывающих скобок. Напри- мер. (I) = (((6))) эквивалентно i = 6. Отметим, что группировка членов выражения не имеет отношения к порядку, в котором производится вычисление каждого отдельного члена выражения. 134
phases of anslafion parenthesized expression (выражение, заключенное в круглые скоб- ки) (См. expression, par» ntnesized expression, primary.) jpascal Стандарт языка Си требует, чтобы ключевые слова расши- рений начин=1лч< ь со знака подчеркивания. Начиная с версии 6.0, набор средств системы программирования Microsoft С по- полнился ключевым словом .pascal в качестве синонима слова pascal Ожидается широкое распространение .pascal в реализаци- ях системь. программирования, функционирующих под управ- лением MS-DOS. pascal Это нестандартное ключевое слово имеется в наборе средств систем^’ программирования на языке Си, функционирующих в среде MS-DOS 1и других операционных системах). Ключевое слово pascal применяется для обозначения факта иегюл! зования Pascal-метода межпроцедурных взаимосвязей (inter-procedure linkage). Выбор того или иного метода влияет на способ прочте- ния (spelling) внешних имен в сгенерированном коде (напри- мер, возможно добавление к именам ведущих знаков подчерки- вания иди преобразование строчных букв в прописные! Кроме того, выбранный метод может «заставить» вызываемый модуль очищать стек после возврата управления в точку вызова. Клю- чевое злово pascal широко используется при программировании в среде OS/2, где библиотечные функции системы должны вызываться в соотве гствии с Паскаль-соглашениями (Pascal convention). (См cded, fortran и .pascal.) Perennial Это поставщик набора нормативов, выбранных Нацио- нальным Институтом Науки и Техники (NIST-National Institute of Science and Technology) для тестирования Стандарта языка Си по заказу правительства США. (См. compliance и Plum Hall.) perror Эта функция записывает в s*derr сообщение, соответствую- щее .текущему значению errno. Сообщение включает определяе- мую пользователем строку символов, адресуем^ ю указателем s. #indude <stdio.h> void perror(const char *s). Выходному сообщению предшествует адресуемая указателем s строка символов за которой следует двоеточие и пробел, при условии, чтэ значением s не является NULL и не указывает на пустую строку. Содержимое и формат сообщения определяются реализацией системы программирования и являются такими же как в случае значения, возвращаемого функцией sfrerror с параметром errno. phases of translation (фазы трансляции) В Стандарте языка Си фа- зы трансляции определяются следующим образе м. «Порядок применения синтаксических правил трансляции оп- ределяется следующими фазами*: Релли. t> транелрт, ров должны функционировать так, как будто бы з™ фазы осуществ ляютгя порознь даже хотя многие из них, как правило, совмег е ш 135
phases of translation 1 Физические символы исходного файла трансформируются в символы набора исходных символов (с введением символов «новая строка» (new-line) для индикаторов конца строки), если это необходимо. Триграфы (tngraph) заменяются cool ветствующими односимвольными внутренними представле- ниями. 2 Каждое включение символ 1 «новая строка» и непосредствен- но предшествующего ему символа «наклииная черта влевох. удаляются, в результате чего физические строки исходного файла «сцепляются» для формирования логичес ких строк исходного файла Если исходный файл непустой, он будет заканчиваться символом «новая строка», которому не будет непосредственно предшествовать символ «наклонная черта влево». 3 . Выполняется декомпозиция исходного файла на препропес- сорные лексемы и последовательности символов пробела (white-space characters! ; к последним относится и текст ком ментария. Исходный файл не бчдет заканчиваться логи гески расчлененной препроцессорной лексемой или комментари- ем. Каждый комментарий заменяется одним символом про- бела (one space character). Символы «новая строка» сохраня- ются. Сохраняется ли каждая непустая последовательность символов пробела (while space characters), а не символ «но- вая строка», или выполняется замена на один символ пробе- ла (one space character', зависит от реализации транслятора. 4 . Выполняются препроцессорные директивы и расширяются макросы. Прегроцессорная директива #indude инициирует обработку указанного объекта заголовка (header) или исход- ного ф 1йла, начиная с фазы 1 до фазы 4 включительно: обработка директив носит рекурсивный характер. 5 . Каждый член набора исходных .-имв злов и каждая управля- ющая последовательность в символьных константах и стро- ковых литералах (str.ng literals) преобразуется в член набора символов этапа *ыполнения. 6 Смежные лексемы строковых литералов соединяются (concatin ated); смежные лексемы строковых литералов с сим- волами, расширенной формы (wide string literal) также сое- диняются. 7 . Символы пробела (white-space characters), разделяющие лек- семы более не имеют значимости. Каждая препроцессорная лексема преобразуется в лексему языка Си. Результирующие лексемы синтаксически и семантически анализируются и транслируются. 8 Все внешние ссылки на внешние объекты и функции «раз- решаются» Библиотечные компоненты связываются для со- гласования внешних ссылок на функции и объекты, не определяемые в текущей трансляции. Весь подобный про- дукт трансляции собирается в образ программы (program 136
po’nrer subtraction image), содержащий информацию, необходимую для его вы- полнения в соответс гвующей среде выполнения » plain char (char без модификаторов типа) (См char, plair | plain Int bit-field (поле битов типа int без модификаторов типа) (См. bit-field, plain int.) PLOSS Этот нестандартный макрос используется с функцией matherr Plum Hall Это поставщик набора нормативов, выбранных различ- ными Европейскими организациями, ответственными за опре- деление национальных стандартов, для тестирования Стандарта языка Си в своих странах. (См xompliance и Perennial ) plus operator unarv (знак одноместной операции «плюс») (См unary plus operator ) pointer (указатель) Это объект содержащий адрес объекта или фун- кции, либо выражение, обозначающее адр« с объекта или функ ции. Например, во фрагменте inf i = JO; int *pi = 6 pi — это указате ^ь-объект, a &i — указатель выражение. Указа- тель-выражение можно ра именовать (dereference), используя знак одноместной операции «разыменования» (•) или знак вы- деления элемента массива ([]). Для разыменования указателей на структуры или объединения используется знак «стрелка вле- во» (<—). Указателю может быть присвоено значение посредст- вом одноместной операции «вычисление адреса» (знак опера- ции &). Если «инициализатор» указателя имеет тип некоторой функции, в знаке операции вычисления адреса нет необходимо- сти. Фу нкцич может выть вызвана путем «разыменования» указате- ля на нее. pointer, null (null-указатель) [См. constant null pointer ) pointer declarator (объявители, указателя) Речь идет об использова- нии производтого типа (derived type) «указатель на некоторый ТИП». (См. declarator, punctuation in.) pointer subtraction (вычитание указателей) Из одного указателя можно вычесть другой указатель при условии что оба адресуют- ся к элементам одного н того же массива или один указатель адресуется к элементу массива, а другой — к несуществующему элементу, расположенному непосредственно вслед за последним элементом того же массива. Тип результата — это ptrdiff.t. этот тип определяется в s'ddef.h. Заметим, что разница между двумя такими указателями нс является ни «включающей», пи «исклю- чающей» для объектов, к которым адресуются указателем На- пример, для фрагмента int i[10]; 137
pointer to function int *p1 = &i|[3]; int *p2 = &i[5]; значение выражения p2 — pt равно 2, что является числом элементов между началом элемента i[3] и началом элемента i[5]. pointer to function (указатель на функцию; Это выражение или п< - ременная используемая для представления адреса функции. По определению, указатель на функцию содержит адрес первого байта или слова выполняемого кода для этой функции. Однако в некоторых системах подобный указатель содержит адрес объ- екта, который в свою очередь указываем на функцию Вы не можете выпг-нятъ арифметические операции над указателями на функции. (См jump table.) pointer to void (void- указатель) (См. void pointer ) pointer type conversion (преобразование типа указателя) (См. conversion, pointer.) portability (переносимость или мобильность программ) Речь идет о степени простоты, легкости переноса программы из одной вы- числительной системы в другую, имеющую определенные отли- чия. Главное препятствие на этом пути для машинных кодов протрамм на языке Си заключается в зависимости многих свойств языка Си от реализации системы программирования на этом языке. (См. program, str dly conforming.) positive_sign Этот член структуры Iconv является указателем на строку символов, используемую для обозначения неотрицатель- ного значения форматированных монетарных данных. Если со- держимым строки является это означает отсутствие значения в теку щей кщчлътурной среде» (locale) или равенство его размера нулю. POSIX Американский Институт Инженеров по Электротехнике и Электронике IEEE (Institute of Electrical and Electronics Engineers) уполномочен формулировать стандарты на аппарат- ные средства и программное обеспечение. Один из его комите- тов, Р1003, работает над определением стандарта переносимой операционной системы, в основу которой положена система UNIX. Речь идет о системе POSIX, ч соответствующий стандарт получил наименование Portable Operating System Interface for Computer Environments (Интерфейс переносимой операционной системы для вычислительных сред). В POSIX имеется много библиотечных функций, зам аяющих и пополняющих номенк- лату ру библиотечных функций, определяемых Стандартом язы - ка Си. pow Эта функция возводит х в степень у. #incLde <math.h> double pow(double x, double y); Если x имеет отрицательное значение, а у не является целым числом, то имеет место ошибка выхода за область определения 138
preprocessing direct ves (domain error). Если значение x равно нулю, а значение у мень- ше или равно нулю, и результат не может быть предст хвлен, имеет место ошибка выхода за область определения (domain error; Возможна также ошибка выхода за пределы диапазона допустимых значений (range error). power functions (степенные функции) Это объявляемые в rr.afh.h функции pow и sqrt и их эквиваленты, оперирующие данными типа (lost и long double powf Это дополнительная функция (опция) является вариантом функции pow, оперирующим данными типа (lost. Это относится к нововведениям Стандарта языка Си. pow] Это дополнительная функция (опция) является вариантом функпии pow, оперирующим данными типа long double. Это относится к нововведениям Стандарта языка Си. #pragma Это директива препроцессора, определяемая реализацией системы программирования. Прагма относится к нововведениям Стандарта языка Си Если реализация системы программирова- ния, обнаружив прагму, не «узнает» эту директиву система ее игнорирует. Стандартных прагм не существует Обобщенная форма подобный директивы. #рragma лексемыпрепроцессора] Некоторые компиляторы узнают прагму, которая указывает, как плотно смежные члены упакованы в структуре Например: #piragma pad( п ) где п может быть 1, 2 или 4, указывая, что имеет место выравни- вание на границу банта слова или двойного слова соответствен нс . Др утие компиляторы определяют прагмы, чтобы менять спо- соб передачи параметров функциям и помогать компилятору расчленять код (программу) на ветви для среды параллельной обработки. precedence (очередность выполнения операций) Речь идет об иерархии и ассоциативности операций. (См operator precedence ) predefined macro (предопределенный макрос) (См. macro, predefined ) preprocessing directives (директивы препроцессора) Это строки ис- ходного текста программы, имеющие следующий обобщенный формат: # [ имя_ директивы ] [ лекеечы_препроцессора ] Горизонтальные пробелы могут быть перед #, между # и име- немс^рективы. а также перед лексемами_препроцессора, между ними и после них. При отсутствии пары символов «наклонная черта влево» и «новая строка», обозначающих налив ие продол- жения текста, строка исходного текста ,для препроцессора (preprocessing source line) завершается в конце текущей физи- ческой строки. Ниже перечисляется полный набор таких дирек- тив. 139
preprocessing ope ator Директивы препроцессора Имя Назначение # define Определение макроса #undef Удаление определения макроса #indude Включение объекта-заголовка #if Компиляция, если выражение истинно tfifdef Компиляция, если макрос определен #'ndef Компиляция, если макрос не определен #else Компиляция согласно ветви для условия «ложно» #elif Составная директива else/if #endif Окончание группы компиляции по ус- ловию #Iine Замена новым значением номера строки или имени исходного файла #error Формирование ошибок трансляции # pragma Действие определяется реализацией си- стемы программирования . # null-директива preprocessing operator (знаки операций препроцессорной обработ- ки) Имеются только три операции препроцессорной обработки. Они приведены ниже. Операции препроцессорной обработки Знак операции Назначение 11ридание операнду формы стро- ки символов (stnngize) Склеивание лексем (token pasting) defined Представление #ifdef в форме выражения preprocessing token (препроцессорная лексема) Это лексема, суще- ствующая в фазах 3—6 трансляции. Полный набор препроцес- сорных лексем включает символьную константу, имя объекта-за- головка, идентификатор, знак операции, препроцессорное число, знак препинания (punctuator), строковый литерал и каж- дый символ, не являющийся пробелом (non-white-space), кото- рый нельзя отнести к перечисленному выше. preprocessor (препроцессор) Это программа, «сканирующая» исход- ный текст программы на языке Си в поиске строк, начинающих- ся с # которые, как предполагается, должны быть директивами Последние указывают действия которые необходимо предпри- нять прежде, чем строки исходного текста программы будут 140
printf «вручены» компилятору. Как правило, препроцессор встроен в компилятор. printf Эта функция пишет форматированные выходные данные в stdout согласно строке форматирования format. #indude <stdis Ь> int printf(consf char «format, ...); Символы в строке форматирования format, за исключением % и спецификаторов преобразований подлежат передаче «на выход один к одному» (output verbatim). Если ну.кио вывести символ %, необходимо в строку форматирования включить %%. Значение которое возвращает printf — это количество передан- ных (на вывод) символов. В случае возникновения ошибки при выводе, функция printf возвращает отрицательное значение. Вызов функции printf эквивалентен вызову fprintf если в послед- нем случае в качестве выходного потока используется stdout Обобщенный формат спецификатора преобразования в строке форматирования функции printf: %[флажхи][ширина][.пючносли>][моуифихал1ср]специфш<ал1ор Флажки для printf Символ Значение Выравнивание по левой границе + Наличие ведущего знака пробел Наличие ведущего пробела # Альтернативная выходная Форма 0 Наличие ведущих нулей Модификаторы для prtntf Символ Значение h 1 short inf long int L long double Спецификаторы для printf Символ Значение С Символ d Десятичное число со знаком е Строчный символ экспоненты Е Прописной символ экспоненты f Число с дробной частью (6 десяти- чных разрядов) 141
private Символ Значение 9 G i Короткое число из двух: е или f Короткое число из двух: Е или F Десятичное число со знаком n Запись счетчика запн< энных сим- волов в int о Восьмеричное число со знаком р $ и Указатель на void Строка символов Десятичное число без знака X Шестнадцатеричное число без зна- ка строчными буквами X Шестнадцатеричное число без зна- ка прописными буквами % Вывод символа % (См future library directions.) private Это ключевое слово языка Сн++ не входит в состав средств Стандарта языка Си. Планируя использование программ на языке Си в среде Си++, следует избегать применения private в качестве идентификатора. program (программа) Это одна или несколько (возможно раздельно компилируемых) функций, одна и? которых должна именоваться main. Эти функции вместе с внешними данными образуют еди- ницу выполнения (execution unit). Программа может включать функции из внешней библиотеки. program conforming (адекватная программа) Речь идет о программе, адекватной требованиям совместимой реализации системы про- граммирования. program, strictly conforming (строго адекватная программа) Речь идет о программе, язык текста которой строго соответствует синтаксису языка программирования н библиотек, как это опре- деляется Стандартом языка Сн. Выходные параметры програм- мы не должны зависеть от неспецифицированного, неопределен- ного или определенного реализацией поведения. (См. conforming implements! on; program, conforming.) program name (имя программы) (См. argv.) program parameters (параметры программы) (См. argc, argv и envp ) program startup (программа пуска) Это машинный код (программ ный модуль), поставляемый с системой программирования, ко- торый выполняется прежде, чем управление передается функ- ции main, при работе в среде под управлением внешней программы (in a host environment) или некоторой функции, определяемой реализацией системы программирования, при работе в «независимой» среде (in a free-standing environment). 142
putc program termination (завершение работы программы] Ре гь идет о прекращении выполнения команд программы. Существует не- сколько способов npei ращения работы программы: проход сквозь замыкающую скобку функции main, выполнение команды return в функции main, обращение к функции abort или exit, вследствие возникновения прерывания, вызывающего заверше- ние работы программы. (См. exit code.) program termination, abnormal (аномальное завершение работы про- граммы) (См. abort.) program termination, normal (нормальное завершение работы про- граммы) (См. exit.) promotions, default argument (продвижение задаваемых по умолча- нию параметров по шкале типов) (См. conversion, function arguments.) promotions, integral (продвижение по шкале целочисленных типов) (См. conversion, integer type.) protected Это ключевое слово языка Си++ не входит в состав средств Стандарта языка Си. Планируя использование программ на языке Сл в среде Си++, следует избегать применения protectee в качестве идентификатора. prototype (прототип) (См functio prototype.) pseudo-random sequence fucntions (функции псевдослучайных по- следовательностей) Это объявляемые в stdlib.h функции 'and и srand. ptrdiff_t Это тип разницы между двумя указателями одного и того же типа. Данные этого типа целочисленные и имеют знак (На практике оба указателя должны адресоваться к элементам одного и того же массива, чтобы вычитание имело смысл или было надежным.) ptrdiff_t определен в stddef.h и относится к нововве- дениям Стандарта языка Си. (См. pointer subtraction.) public Это ключевое слово языка Си-Н- не входит в состав средств Стандарта языка Сн. Планируя использование программ на языке Си в среде Си++, следует избегать применения public в качестве идентификатора. punctuator (знак uvhktj ации' Это одна из следующих лексем: [ J ( ), {. }, ♦, .. =. ... и #. putc Эта функция записывает символ, задаваемый параметром с (преобразуемым в данное типа unsigned char), в файл, на который указывает stream. #iiiclude <stdio.h> int putc(int c, FILE ♦stream); Функция putc эквивалента функции fp-itc, за исключением того, что putc «позволеноч быть «ненадежным» макросом (unsafe macro). 143
putchar putchar Эта функция записывает символ, задаваемый параметром с (преобразуемым в данное типа unsigned char', в stdcui. #>nclude <stdio.h> int pulchar'int c); Ф /нкция putchar эквивалентна функции putc, записывающей символ в stdout. Следовательно, putchar может быть реализована как «ненадежный» макрос (unsafe macro). putenv Эта нестандартная функция предоставляется для определе- ния и (или) изменения строк (параметров) среды (environment strings). (См. envp и getenv.) puts Эта функция записывает адресуемую указателем s строку символов, за которой следует «новая строка», в stdout. #indude <stdio.h> int puts(const char *s); Завершающий строку символ '\0' не записывается. В отличие от fputs функция puts дополняет (append) запись «новой стрской» (new line). Если имеет место ошибка, puts возвращает EOF; иначе значение, возвращаемое этой функцией, — неотрицательное число. <<< Q qsort Эта функция выполняет сортировку массива объектов nmemb, на начальный объект которого указывает base. # include <stdlib,h> void qsort(void «base, size t nmemb, size_t size, int (*compar)(co'’S> void *, consi void ♦)); Параметр size задает размер каждого элемента в массиве. Члены (элементы) массива сортируются в порядке возрастания соглас- но результатам выполнения функции, на которую указывает compar. Эта функция, осуществляющая сравнение, получает два параметра, которые указывают на подлежащие сравнению объ- екты. В зависимости от результатов сравнения по критерию «меньше», «равно» или «больше», функция, адресуемая сото?-, возвращает отрицательное, равное нулю или положительное значение соответственно. Если по результату сравнения дьа члена массива равны, их взаимное расположение в массиве не специфицировано. qualified type (специфицированный тин) (См. type, onst-qualified; type, volatile quali'ied.j 144
quiet change Quality of Implementation (качество реализации) Речь идет о воз- можностях реализации проекта удовлетворить требования, предъявляемые заказчиками, особенно в том, что ие специфици- ровано стандартом Например в тех случаях, когда от системы программирования требуется выдача диагностических сообще- ний, возможно простое решение: появляется сообщение «Где-то в программе ошибка». Однако, если реализация системы пре- тендует на определенное качество технического решения, реги- страция факта ошибки должна сопровождаться указанием соот- ветствующей строки исходного текста программы и возможной причины появления ошибки. question mark escape sequence (управляющая последовательность «восклицательный знак») Стандарт языка Си включает в состав своих средств триграфы (trigraph) в форме fix, где х — это один из символов. Триграфы «распознаются» и получают соответст- вующую замену на первой фазе трансляции. Поскольку ??( является триграфом для символа [, строковый литерал, содержа- щий "??(ххх)" , интерпретируется как "[ххх)“. Подобные последова- тельности символов могут существовать в строковом литерале, однако не восприниматься как триграфы при использовании управляющей последовательности «восклицательный знак» (\?). Например, "?\?(ххх)" интерпретируется как "1?(ххх)", т. е. управля- ющая последовательность «вопросительный знак» воспринима- ется как одиночный символ «вопросительный знак». quiet change («скрытое» изменение) Речь идет об изменениях в се- мантике языка без изменений его синтаксиса. Хотя комитет X3J1 1 старался избегать каких-либо «скрытых» изменений при определении Стандарта языка .Си, некоторые из них имели место. Согласно официальному документу «Standard С rationale» Стандарт языка Си содержит следующие «скрытые» изменения.: • Программы с последовательностями символов, подобными ??1, в строковых константах, символьных константах или именах объектов-заголовков будут порождать результаты, отличные от прежних, поскольку язык Си пополнился триграфами. • Программа, зависящая от внутренних идентификаторов, ко- торые считаются идентичными по первым восьми символам, может измениться, превратившись в программу, содержащую отличающиеся друг от друга объекты согласно полному набо- ру символов в имени каждого из них. ♦ Целочисленные константы без суффиксов могут иметь раз- дичные типы. В K&R десятичные константы без суффиксов большие, чем INT_MAX, а также восьмеричные и шестнадцате- ричные константы без суффиксов большие, чем UINT_MAX, имеют тип long. • Константа вида *\078' корректна по форме, однако имеет те- перь иное значение («смысл»). А именно, она обозначает символьную константу, значение которой — это (определяе- мая реализацией системы) комбинация значений двух симво- t, 145
quiet change лов: *\07‘ и '8*. В некоторых реализациях старое значение — это символ, код которого 078 s 0100 = 64. • Константа вида \а‘ или *\х* может иметь теперь иное значе- ние. Прежде значение подобной коистан~ы (если оно сущест- вовало) определялся ь реализацией системы программирова- ния. • Строка вида "\078" корректна по форме, однако теперь интер- претируется как содержащая два символа \07 и 8. • Строка вида "\а" или ”\х" имеет теперь иное значение («смысл»). • Не запрещается и не требуется, чтобы идентичные строковые литералы были представлены в памяти единственным экзем- пляром строки символов; программа, зависящая от выбора того или иного правила, может вести себя по-разному • Выражения вида х=—3 и х=+у меняют свое значение («смысл») с потерей старомодных знаков операции «присваивание». • Программа, зависящая от беззнаковых арифметических пре- образований предохраните хьного свойства (unsigned preserv ing arithmetic conversions), будет вести себя иначе, воз- можно без «выражения претензий» к некорректности. Это рассматривается как наиболее серьезное семантическое изме- нение, сделанное комитетом X3J11 в отношении текущей практики, получившей широкое распространение. • Выражения с операндами типа float теперь можно вычислять с меньшей точностью. Базовый Документ (Base Document) спе- цифицировал выполнение всех операций с плавающей точ- кой в «режиме double». • Выполнение сдвига посредством «счетчика» типа long более не препятствует преобразованию сдвигаемого операнда в тип long. • Пустое объявление struct х; не является более «безобидным». • Код, «полагающийся» на синтаксический анализ «снизу вверх» агрегатированных идентификаторов с частично опу- щенными (игнорируемыми) скобками, не создаст ожидаемый инициализированный объект. • Выражения и константы типа long в командах switch более не усекаются до размера типа int. • Функции, зависящие от параметров типа char или short рас- ширяемых до типа int или float, расширяемых до double, могут вести себя иначе при вызове в области действия прототипа, содержащего «узкие» типы. • Макрос, «полагающийся» на замену формального параметра строковым литералом, будет производить иные результаты. • Пр ог раммы, «полагающиеся» на возвращение не null-указате- ля на запросы о выделении памяти нулевого размера, могут вести себя иначе. 146
range error quot Это имя одного из двух членов структуры типа div_‘ или ldiv_t. Оно применяется для представления частного целочисленного деления и имеет тип mt или long int соответственно. (См, rem.) R radix point (точка отделения целой части числа от дробной) Это точка, которая отделяет целую часть числа от его дробной части. В константах с плавающей точкой язык Си всегда использует точку в качестве подобного символа-разделителя В стандартной «культурной среде» Си (standard "С" locale) точка применяется также, как десятичная точка в таких функциях, как printf, scanf и strtod. К стандартным процедурам, использующим подобную точку определяемую «культурной средой», относятся a*of, fprintf, (scan», localeconv, printf, scanf, sprintf, sscanf, strtod. vfprintf. vprinif и vspnntf. raise Эта функция применяется для посылки сигнала sig программе. Это полезно при тестировании написанных пользователем обра- ботчиков сигналов. #indude <signal.h> int raise(int sig); Функция raise возвращает нуль, если операция выполнена ус- пешно; в противном случае возвращаемое значение не равно нулю. rand Повторный вызов этой функции генерирует последователь- ность псевдослучайных “целых чисел в диапазоне значений от О до RAND_MAX Одиночный вызов генерирует только одно число. #indude <stdlib.h> int rand(void): (См srand.) RAND_MAX Этот определяемый в stdlib макрос является целочис- ленным константным выражением, представляющим макси- мально возможное значение, возвращаемое функцией rand, Стандарт языка Си требует, чтобы значение RAND.MAX было по меньшей мере равным 32767 Его целочисленный тип не спе- цифицирован, и поэтому следует использовать явный специфи- катор типа (explicit cast) или прототип при передаче его в качестве параметра range error (ошибка «выход за диапазон допустимых значений») Это имеет место, когда результат, порождаемый функцией, не может быть представлен как данное типа double. Если происходит пере- полнение (overflow), функция возвращает значение HUGE_VAl с 147
realloe HUGE_Val с тем же знаком, который имело бы корректное зна- чение. errno получает значение ERANGl Если у результата потеря значимости (underflow), функция возвращает 0 a errno может быть присвоено значение ERANGE, но, возможно, и нет — в зависимости от того как зто определено в реализации системы программирования. realloc Эта функция меняет размер динамически выделяемой обла- сти памяти, адресуемой указателем ptr, на site (новый размер) Функция возвращает адрес (возможно) новой области памяти. #melude <stdlib.h> void *realloc(void «ptr, size_t size); Если ph- равен NULL realloe ведет себя подобно функции malloc. Иначе, если значение ptr ие является значением, которое прежде было возвращено функцией calloc, таЯое или realloe. поведение функции не определено. Это же справедливо для случая, когда ptr указывает на пространство памяти, которое было освобождено функцией tree Значение size является абсолютным, а не относительным. Если size больше чем размер существующего пространства, новое неиници- ализированное непрерывное пространство выделяется в конце; предыдущее содержимое пространства сохраняется. Если геаМос не может выделить требуемое пространство, возвращаемое значение равно NULL, а содержимое пространства, на которое указывает ptr, остается нетронутым. Если ptr — это не NULL, а значение size равно нулю, realloe действует как функция free. Когда бы размер пространства ни подвергся изменению под воздействием функции realloe новое пространство может начи- наться с адреса, отличного от заданного, даже если realloe «усека- ет» память. Следовательно, если Вы используете realloe подобным образом, необходимо проявлять внимание к указателям, которые адресуются к этому, возможно перемещаемому, пространству Например если Вы создаете связный список (linked list) и применяете realloe для выделения большего (или меньшего) про- странства памяти для цепочки, может оказаться, что пространст- во будет перемещаться. В последнем случае указатели адресуют- ся туда, где размещались последовательные звенья пепочки. а не в место их расположения в настоящий момент. Всегда следует использовать realloe так. как это показано ниже. р2 = realloc(pt, new_size); if (р2 1= NULL) pl = р2; Действуя подобным образом. Вам никогда не придется заботить- ся. выделялось ли для объекта новое пространство, так как р1 обновляется при каждом следующем вызове функции, которая указывает на область памяти (возможно, новую). recursion (рекурсия) Рекурсивной называется функция, вызываю- щая саму себя прямо или косвенно. При каждом обращении к такой функции создается новый набор автоматических объектов 148
remainder operator (если их создание предусмотрено определением функции). (См recursion.) redefinition of macro (переопределение макроса) (См. benign redefinition и macro, redefinition of .) redirection characters (символы переназначения) UNIX и MS-DOS (а также другие операционные системы) позволяют дать новые назначения (переназначить] стандартным потокам stdin и stdout, используя символы командной строки <, > и ». Они также предоставляют возможность переназначить stderr. register Это ключевое слово для обозначения класса памяти. Оно применяется для объявления об объекте внутри определения функ- ции с целью обозначения продолжительности автоматического хра- нения. Ключевое слово register — это «намек» компилятору о жела- тельности размещения объекта в какой-либо «высокоскоростной» области памяти, как, например, регистр машины. Если компилятор не может выполнить это пожелание или предпочитает ие делать этого, register трактуется как ключевое слово auto. Ключевое слово register может использоваться в прототипе и при объявлении пара- метра функции. Отметим, что к переменной класса памяти register нельзя применять операцию вычисления адреса (А). Объект класса памяти register, не может иметь свой адрес по- лученным ни явно (посредством знака операции А). ни косвенно (например, путем передачи массива в функцию). Это облегчает работу оптимизатора, поскольку ему известно, что объект класса памяти register не имеет псевдонимов (aliases). rem Это имя одного нз членов структур типа div_t и ldiv_t Оно используется для представления остатка целочисленного деления н имеет тип inf и long inf соответственно в этих структурах. (См. quot.) remainder assignment operator (знак составной операции «вычисле- ние остатка» и «присваивание») Знак двухместной операции %= позволяет объединить вычисление остатка и присваивание таким образом, что выр/ %= выр2 эквивалентно выр/ = выр/ % выр2. за исключением того, что в первом случае выражение выр/ вычисляется только один раз. Порядок вычис- ления операндов не специфицирован Левый операнд должен быть модифицируемым именующим выражением (lvalue). Тип результата — это тип выражения выр/ Данная операция ассо- циативна справа. (См. assignment operator compound ) remainder function (функция вычисления остатка) Это объявляемая в math.h функция fmod. remainder operator (знак операции «вычисление остатка») Двухме- стная операция, использующая знак %, вычисляет остаток от деления левого операнда на правый. Оба операнда должны быть данными целого типа. (Для вычисления остатка с плавающей точкой следует пользоваться библиотечной функцией (mod.) Над операндами выполняются обычные преобразования арифмети- ческих типов. Порядок вычисления операндов не спецмфициро- 149
remove ван. Данная операция ассоциативна слева. Если один из операн- дов является отрицательным числом, формирование знака остат- ка определяется реализацией системы программирования. remove Эта функция делает недоступным файл, имя которого адре- суется указателем filename. #mclude <stdio.h> mt -emovefconit char ♦filename); Во многих системах файл удаляется. Однако возможно решение, при котором удаляется не файл, а синоним его имени. В таких случаях при удалении последнего синонима имеет место удале- ние файла. В случае успешного выполнения функция remove возвращает нулевое значение в противном случае возвращае- мое значение не равно нулю. Функциональность remove аналогична (или очень близка) функ- циональности нестандартной функции unlink. rename Эта функция меняет старое нмя файла на которое указы- вает old на новое имя. адресуемое указателем new. #indude <stdio.h> inf rename(const char ♦old, const char ♦new); Если уже существует файл под именем, на которое указывает new. поведение функции определяется реализацией системы программирования. Если выполнение rename завершается ус- пешно, возвращаемое ею значение равно нулю; иначе функция возвращает ненулевое значение. В случае неудачи файл сохра- няет прежнее значение. replacement list, macro (список замещений макроса) (См. macro ) reserved Identifier (зарезервированный гЬ,ентификатор) (См. identi- fier. reserved | restore call'ng environment function (функция восстановления среды вызова) (См. fongjmp ) return Эта команда передаст управление в вызывающую функцию. Команда return выр; в функции main эквивалентна команде ехй(выр); Функция тип возвращаемого значения которой — не void, может возвращать значение, используя синтаксис вида return выр; Команда return имеет следующий формат геЬт[выражение]; 150
Ritchie, Dennis M Выход (falling through) за пределы самой внешней закрываю- щей скобки тела функции предполагает неявное выполнение return без «выражения». Если тип значения, возвращаемого фун- кцией. отличен от void, гначение, которое действительно возвра- щает функция в последнем случае, является не определенным. Указанное в формате команды return выражение является полным выражением. rewind Эта функция устанавливает индикатор положения в файле на начало файла. #include Csfdio h> void rewind(HLE «stream); Вызов функции rewind идентичен вызову функции (seek со сме- щением offset, равным 0L, и «точкой отсчета», равной SEEK_SET. Однако rewind выполняет также «очистку» индикатора ошибок. right-shift assignment operator (знак составной операции «сдвиг вправо» и «присваивание») Знак двухместной операции »= позволяет объединить операцию сдвига вправо с операцией присваивания таким образом что выр! »= выр2 эквивалентно выр! = выр! » выр2, за исключением того, что в первом слу- чае выр1 вычисляется только один раз. Оба операнда должны иметь целый тип, причем левый операнд должен быть модифи- цируемым именующим выражением (lvalue). Порядок вычисле- ния операндов не специфицирован. Тнп результата — это тип выражения выр! Данная операция ассоциативна справа. Если значение правого операнда меньше нуля, либо оно равно или больше числа битов в левом операнде (после его «продвижения» по шкале типов), поведение операции не определено. Если левый операнд — данное целого типа со знаком, имеющее отрицатель- ное значение, результат операции определяется реализацией системы программирования (См. assignment operator, compound.) ngth shift operator (знак операции «сдвиг вправо») Знак двухмест- ной операции » обеспечивает сдвиг значения операнда слева от знака на число битов задаваемое значением операнда справа от знака. Оба операнда должны иметь целый тип. Порядок вычисления операндов не специфицирован. Данная операция ассоциативна слева Над операндами выполняются обычные преобразования арифметических типов. Если значение правого операнда меньше нуля, либо оно равно или больше числа битов в левом операнде (после его «продвижения» по шкале типов! поведение операции не определено. Если левый операнд — данное целого типа со знаком, имеющее отрицательное значение, результат операции определяется реализацией системы про- граммирования. Ritchie, Dennis М Широко известный и общепризнанный специа- лист, сотрудник научно-исследовательского вычислительного центра Bell Labs Computer Science Research Center. Он — глав- ный разработчик языка Си, который внес также основной вклад 151
rvalue в создание операционной системы UNIX. В аббревиатуре K&R буква R представляет его фамилию. пга1ие(«правое» выражение) Под этим термином понимают «ре- цепт» получения значения выражения объекта при условии, что тип выражения не является типом массива. Каждое именующее («левое») выражение (lvalue) является «правым» выражением (rvalue), однако не каждое «правое» выражение — именующее. S save calling environment function (функция сохранения среды вызо- ва) (См. sefjmp.) scalar (скаляр) Это объект простого типа, как, например, inf, char, fioaf или указатель. Нескалярны.чи данными являются объедине- ния и агрегатированные данные (структуры и массивы). scanf Эта функция читает форматированные входные данные из stdin согласно строке форматирования на которую указывает format #include <stdio.h> int scan((const char «format, ...); Символы, задаваемые в строке форматирования исключая про- белы и спецификаторы определенного преобразования входных данных, предполагаются быть введенными согласно строке фор- матирования. Присутствие % % в строке форматирования пред- полагает появление % во входном потоке. 1 [роизвольное число следующих друг за другом пробелов (white spaces) в строке форматирования вызывает пропуск пробела при вводе. Когда scanf завершает выполнение преобразований, любой оставший- ся во входном буфере пробел, непосредственно следующий за последним преобразованным входным данным, остается там. Обобщенный формат спецификатора преобразования в строке форматирования функции scanf. %(«][ширш<а][модифиха7пор]спецпфикал1ор Модификаторы для scanf Символ Значение h Указатель на short inf 1 Указатель на long int или double L Указатель на long double 152
scope Спецификаторы для scanf Символ Значение с Символ(ы) d Десятичное число со знаком е Число с плавающей точкой 1 Число с плавающей точкой 9 Число с плавающей точкой i Десятичное число со знаком п Запись счетчика прочитанных символов в inf о Восьмеричное число р Указатель на void S Строка символов U Десятичное число X Шестнадцатеричное число Строка с шаблоном (которому не- обходимо соответствие) % Ввод символа % Возвращаемым значением функции scanf является число элемен- тов, получивших значение при вводе. Оно ие включает элемен- ты, которые пропускаются благодаря указанию символа подав- ления ввода • (assignment-suppression character), или входные поля, соответствующие п символам преобразования Если имеет место ошибка при вводе, значение, которое возвращает scanf, равно EOF. Все параметры, передаваемые функции scanf, должны быть адре- сами. Вызов функции scarf эквивалентен вызову функции fscanf, ис- пользующей поток stdin. (См future library directions.) SCHAR MAX Этот макрос, определяемый в limits.h, обозначает мак- симальное значение объекта типа signed char. Оно должно быть равным по меньшей мере 127 (8 битов). Это относится к ново- введениям Стандарта языка Си. Этот макрос расширяется до целочисленного константного выражения, пригодного к исполь- зованию в директиве #if. SCHAR MIN Этот макрос, определяемый в limits.h, обозначает мини- мальное значение объекта типа signed char. Оно должно быть равным по крайней мере —127 (8 битов). Это относится к нововведениям Стандарта языка Си. Этот макрос расширяется до целочисленного константного выражения, пригодного к ис- пользованию в директиве #if scope (область действия) Это область (часть) программы, на кото- рую распространяется объявление об идентификаторе. Различа- 153
scope, block тот следующие виды таких областей: блок, файл, функция и прототип функции. (См linkage storage duration.) scope block (область действия «блок») Область действия, ограни- ченную блоком, имеют объявляемый внутри блока идентифика- тор или список параметров определения функции. Такая область действия заканчивается у закрывающей фигурной скобки ). завершающей блок; в случае идентификатора — параметра функции — его область действия заканчивается у конца тела функции. В приводимом ниже примере все идентификаторы внутри функции (имеют в качестве области действия блок (хотя для самой функции 1 областью действия является файл). void f(inf j) { int i. g(void); static int si; if (j > 5) < double d, inf i; } } scope, tile (область действия «файл») Область действия в пределах файла имеют идентификатор, объявляемый вне всех блоков, и списки параметров. Эта область действия завершается там, где заканчивается единица трансляции В приводимом ниже приме- ре все идентификаторы имеют область действия в пределах файла. inf I; static inf si; extern double ed; void f(void); void g() { } scope, function (область действия «функция») Метки, определяе- мые пользователем. — это единственные идентификаторы, об- ласть действия которых — функция Говоря иначе, метки «вид иы» из любого места функции, в которой они определены. Следовательно, в пределах дайной функции имена меток должны быть уникальными scope, prototype (область действия «прототип») Прототип функции является областью действия идентификатора, объявленного внутри него. Эта область действия завершается там, где закан- чивается объявление функции. Хотя задание идентификаторов в прототипах не является обязательным, при их наличии следует 154
setbuf соблюдать требование уникальности их наименования в преде- лах данного прототипа. Например: int f(int i, double J); int g mt i, douoie d); int i; long d; Здесь имена i и d, определяемые в прототипах, теряют к силу» при выходе за пределы определения соответствующего прототипа. search functions (ф'ткции поиска) Это объявляемые в string h фун- кции memcnr jtrchr strcspn, strpbrk, strrchr strspn, strstr и strtok. SEEKCUR Этот макрос, определяемый в stdio.h, является целочис- ленным константным выражением, кото] ое может использовать- ся в качестве третьего параметра функции tseek. Макрос указы- вает позицию относительно текущего положения в файле. (См. SEEK_END и SEEK_SET.) SEEK END Этот макрос, определяемый в stdio.h, является целочислен- ным константным выражением, которое может использоваться в качестве третьего параметра функции tseek Макрос указывает позицию относительно конца файла. (См. SKK_CUR и SEEK_SET.) SEEK SET Этот макрос, определяемый в stdio.h, является целочислен- ным константным выражением, которое может использоваться в качестве третьего параметра функции tseek. Макрос указываем по- ложение относительно начала файла. (См SEFK_CclR и SEEK_END) selection statement (команда выбора) (См. rt/else и switch.) semicolon punctuator (знак пунктуации сточка с запятой») Этот знак пунктуации применяется для завершения (как «термина- тор») команды или объявления (declaration). Он также применя- ется для отделения друг от друга трех (необязательных к исполь- зованию) выражений в команде for. Пустая (null) команда состоит только из знака «точка с запятой». sequence point (точка следования) В определенных точках програм- мы все побочные действия (side effects) предшествующих вычис- лений должны быть завершены, и никакие побочные эффекты последующих вычислений не будут иметь место. Такие точки назыв нот «точками следования». Подобная точка находится в конце полного выражвчия 'full expression) Точки следования имеют также следующие операции: && и || после вычисления левого операнда; J: после вычисления первого операнда; опера- ция "запятая» после вычисления левого операнда; обращение к фупкгии (ее вызов) после вычисления всех параметров и иден- тификатора функции, однако перед дейстгительным вызовом функции (началом ее операций). setbuf Эта функция эквивалентна функции setvbuf. если последняя вызывается либо с парапетом mode равным _IOFBF и парамет- ром size равным BUFSIZ, либо с параметром mode равным JONBF и параметром buf равным NULL. 155
setimp #irc ude <sfd.o.h> void setbi iFILL «stream, char »buf); Функция sefbuf не возвращает никакого значения. Программист должен позаботиться о том чтобы параметр stream указывал на открытый файл, а параметр but был равным NULL или указателем па достаточно большой б) фер. setjmp Этот макрос записывает текущий контекст программы (или среду вызова) в определяемый пользователем объект типа jmp_buf так. что программа может быть восстановлена в виде это.'о контек- ста по< редством последующего обращения к функции longjn р. #inc'ud* <sefjmp.h> int sefjmp(jmp_Ejf env); Еудучи макросом (хотя возможно и объявление в качестве фун- кции), sefjmp имеет некоторые ограничения. Например seijmp не 1ьзя вызвать посредством указателя на функцию. (См. руко- водство по пользованию библиотекой системы программирова- ния ) Когда программист явно обращается к setjmo возвращае- мое значение равно нулю. Когда же set jmp возвращает значение посредством безусловного перехода из longjmp. это — число не- равное нулю и определяемое пользователем. Отметим, что seijmp действительно сохранят свой собственный контекст, а не контекст, который его вызывает. С \едовательно. когда вызывается longjmp для восстановления записанного на хра нение контекста, угравление передается обратно в setjmp который затем возвращает управление исходному вызывающему модулю. setjmp.h В этом объекте-заголовке определен тиь imp ,buf и содержатся объявления setimp и longjmp, т. е. все необходимое для сохранения и восстановления контекста программы. Собранные вместо эти средства предоставляют возможность выполнения нелокального перехода non-local goto), а именно, способность передать управ- ление из одной функции В середину другой при условии, что в иерархии вызовов функция-приемник находится выше. se*jmp.h содержит определения или объявления для идентифика- торов, перечисленных в следующей таблице: Имя Назначение jmp_buf Тип буфера для записи кон- текста посредством sefjmp longjmp Восстановление среды, за- писанной на хранение setjmp Сохранение среды фазы вы- полнения 156
setvbuf setlocale Эта функция дает программе возможность изменить «куль- турную среду» (locale) полностью или только ее подкатегорию, либо наити «имя» текущей «культурной среды» tfindude <locale.h> char *settoc«le(inf category. char «locale). Параметр category должен быть одним из ЕС_«-макросов, стандар- тных или определяемых пользователем. Параметр locale — это стандартная «культурная среда Си» ("С" locale) или какая-либо другая «культурная среда», определяемая реализацией системы. При пуске последней (program startup) автоматически устанав ливается «культурная среда Си». Если для параметра locate задан указатель на строку «культурной среды» и последняя имеется, возвращаемым значением является указатель на строку соответствующей категории «культурной среды». Эта строка может быть возвращена setlocale при последу- ющих обращениях к этой функции. Если запрашиваемая «куль- турная среда» отсутствует или неизвестна, возвращаемым зна- чением является NULl. и locale не претерпевает изменений. Если указатель <ос«1е имеет значение NULL, возвращаемое значение — это строка, определяющая текущую «культурную среду». Функ- ция seflocale относится к нововведениям Стандарта языка Си. setvbuf Эта функция позволяет изменить тип буферизации для заново открываемого файла. Она также дает пользователю воз- можность предоставить файлу свой (назначаемый пользовате- лем) буфер. #indude <stdio.h> int setvbuf(FILE *strearr char «but, int mode, size_t sire); Функция setvbuf должна вызываться прежде, чем будут выполне- ны какие-либо операции чтения или записи для вновь открытого потока. Параметр mode может принимать одно из следующих значений: JOFBF (полная буферизация). JCuBF (буферизация строк) или JONBF (без буферизации). Если значением парамет- ра but является NULL, функция se*vbu( использует свой собствен- ный внутренний буфер; иначе исподьзуется буфер, на который указывает buf. и в этом случае значение параметра size должно быть по меньшей мере таким же, как размер массива, на кото- рый указывает buf. Если mode равен JOFBF, a size равен BUFSIZ, вместо setvbuf следует применять функцию setbd Сказанное справедливо и в том случае, когда buf равен NUuL a mode равен JONBF. В результате успешного выполнения setvb f возвращаемое зна- чение равно нулю; в противном случае оно отлично от нуля. Причиной неуспеха може^ быть недопустимое значение пара- метра mode. 157
shift state shift state (состояние сдвига) Значение многобайтового символа (multlbyte charactei) может кодироваться с учетом состояния сдвига, что влечет переключение между различными состояния- ми сдвига. Изменение в состоянии сдвига обозначается одним или несколькими символами со специальными значениями. При обнаружении изменения в состоянии сдвига последующие сим- волы интерпретируются в соответствии с текущим состоянием сдвига до тех пор, пока не произойдет изменение состояния сдвига или не закончится последовательность символов. (См. shift state initial.) shift state, initial (начальное состояние сдвига) Это устанавливае- мое по умолчанию исходное состояние сдвига, при котором система начинает просмотр многобайтовых символов. short Это допустимая аббревиатура для short inf. short int Это целочисленный тип. Стандарт языка Си требует, чтобы объект такого типа имел размер, равный по меньшей мере 16 битам. Обычный short int предполагает наличие знака. Традици- онно short int расширялся до inf при использовании в выражениях и в качестве параметров функций. Однако Стандарт языка Си допускает использование объектов этого типа без указанного расширения поля представления при условии достижения того же самого результата. (См. conversion, function arguments и integral type.) SHRT_MAX Этот определяемый в limifs.h макрос обозначает макси- мальное значение для объекта типа short inf. Оно должно быть равным по меньшей мере 32767 (16 битов). Это относится к новсвведениям Стандарта языка Си. Данный макрос расширя- ется до целочисленного константного выражения, пригодного к использованию в директиве #if. SHRT_MIN Этот определяемый в limifs.h макрос обозначает мини- мальное значение для объекта типа short inf. Оно должно быть равным по крайней мере —32767 (16 битов). Это относится к нововведениям Стандарта языка Си. Данный макрос расширя- ется до целочисленного константного выражения, пригодного к использованию в директиве #if. side effects (побочные эффекты) Речь идет об акте доступа к объекту со спецификатором типа volatile, модификации объекта, модифи- кации файла иди вызове функции, выполняющей указанные действия (акты). По сути дела, результатом побочного эффекта является изменение в состоянии среды выполнения программы. Каждое из приводимых ниже выражений содержит побочные эффекты: ++• j---- х - 4 j ♦= a f() При обращении к функции f мы полагаем, что тело функции само по себе (или благодаря обращениям к другим функциям) имеет один или несколько побочных эффектов. Любая команда, результатом выполнения которой не является прямо или косвен- 158
SIG IGN macro но какой-либо побочный эффег.г. — пустая, бессмысленная ко- манда. (См. sequence point.) SIG_» Так начинаются имена макросов-указателей на функции; три подобных макроса определены в Стандарте языке. Си: SIG_DEL SIG JGN и SIG_EPR. Эти макросы расширяются до отличающихся друг от друга константных выражений, тип которых совместим с типом второго параметра функции signal, а их значение — это значение, возвращаемое этой функцией. Доггу.тимо определе- ние (средствами системы программирования) макросов с други- ми значениями: для них целей в Стандарте языка Си зарезер- вирован формат имен SIG_*, где ♦ — это прописная буква конкретного имени. (См future library directions.) sig_atomic_t Это целочисленный тип, определяемый в signal.h. Га- рантируется, что объекты такого типа доступны как “атомарные единицы» даже в присутствии сигналов. Говоря иначе, при возникновении сигналов исключается ситуация лишь частично- го обновления объектов, оии обновляют ся полностью, или обнов- ление не выполняется вовсе. Этот тип относится к нововведени- ям Стандарта языка Си. SIG_DFL macro (макрос S1G_DFLJ Этот макро-, определяем ий в signal.Ь, расширяется до константного выражения, пригодного к использованию в ка [естве второго параметра функции signal. Его значение не до окно быть равным адресу никакой объявленной функции1 оно не должно совпадать со значением SIG_=RR или SIGJGN. Значение S'G_DFL используется для того, чтобы сообщить функции signal, какой задаваемый по умолчанию (и определяе- мый реализацией системы программирования) обработчик под- лежит использованию для прерывания заданного типа. SIG ERR macro (макрос SIG_ERR) Этот макрос, определяемый в signal.Ь, расширяется до константного выражения, пригодного к использованию в качестве второго параметра функции signal. Его значение не должно быть равным адресу никакой объявленной функции оно не должно совпадать со значением SIG_DFL или SIG_iGN. Значение SIG .ERR возвращается функцией signal, что свидетельствует о возникноьении ошибки щ и попытке задать обработку прерывания определенного типа. SIG_IGN macro (макрос SIGJGN) Этот макрос, определяемый в signal.h, расширяется до константного выражения, пригодного к использованию в качестве второго параметра функции signal. Его -качение не должно быть равным адресу никакой < бъявляемой Функции, оно не должно совпадать со значением SIG_DFL или SIG_ERR. Макрос SIGJGN используется, чтобы сообщить функции signal о необходимости игнорирования заданного прерывания. В некоторых реализациях системы программирования в то время как вы посылаете запрос иа игнорирование определенных сиг- налов, они еще продолжают перехватываться. Например, если не имеющая привилегий программа прог нт игно1 ировать все привилегированные попытки унич: ожить ее. и это будет разре- шено, налицо изъяны в надежности функционирования. 159
SIG* SIG* Так начинаются имена макросов, обозначающих типы сигна- лов; они могут использоваться в качестве первого параметра функции signal. Этот параметр задает определенный тип сигнала, который по воле программиста должен быть обработан функ- цией signal. Стандарт языка Си определяет следующие макросы, задающие тип сигнала: SIGABRT SIGFPE, SIGiLL, SIG1NT, SIGSEGV и SIGTERM. Помимо этого, зарезервирован формат имен SIG*, где ♦ — это прописная буква конкретного имени. (См. future library directions.) SIGABRT Этот макрос задает тип сигнала, означающий аномальное завершение работы программы (подобное вызову функции abort). (См. assert.) SIGFPE Этот макрос задает тип сигнала, означающий обнаружение ошибочной арифметической операции, такой, как «деление на нуль» (zero-divide) или операции, приводящей к переполнению (overflow). (Имя макроса — это сокращение от «Floating-Point Exception».) SIGILL Этот макрос задает тип сигнала, означающий наличие недействительного образа функции (invalid function image), возможной причиной которого может быть обнаружение недопу- стимой команды. SIGINT Этот макрос задает тип сигнала, указывающего на прием сигнала интерактивного предупреждения (такого, как CTRL/C или CTRL/D). signal (сигнал) Это асинхронное или синхронное событие, преры- вающее выполнение программы. Некоторые сигналы могут быть перехвачены нлн могут игнорироваться. Это осуществляется посредством механизма, предоставляемого объектом-заголовком singal.h. Стандарт языка Си определяет шесть специфических типов сигналов (именуемых SIG*): аномальное завершение; ошибки при выполнении арифметических операций, такие, как «деление на нуль» нли «переполнение»; недействительный об- раз функции (возможно, вследствие обнаружения недопустимой команды); прием сигнала внимания к интерактивным действи- ям; недействительный доступ к памяти; запрос о завершении работы, посланный программе. signal Эта функция используется для указания типа действий, которые должны быть предприняты, когда встречается сигнал определенного типа. Возможно игнорирование сигнала, его об- работка системой, как это определено по умолчанию, или обра- ботка процедурой, определяемой пользователем. #indude <signal.h> void (*signal(int s>g, void(*func)(int)))(int); Здесь sig — это тип сигнала, подлежащего обработке; обычно в качестве параметра sig используется макрос, имя которого под- чиняется формату SIG* (например, SIG1NT). Параметр func — это способ обработки сигнала, задаваемый, как правило, посредст- 160
s.gral h bom макроса, имя которого подчиняется формату SIG_* (напри- мер, SIG_IGN). В качестве func может использоваться адрес напи- санной пользователем функции обработки сигнала Если функция signal не может выполнить запрашиваемые опера- ции, возвращаемым ею значением является SIG_ERR. Иначе signal возвращает значение, переданное ей (в качестве второго пара- метра) во время предыдущего вызова для сигнала этого номера. Говоря иначе, можно сохранить текущий контекст обработки сигнала, изменить его иа время, а затем восстановить, используя это возвращаемое значение. Начальное состояние «механизма» обработки сигналов при пуске системы определяется ее реали- зацией. (См. raise ) signal handler (обработчик сигнала) Эта функция, получившая уп- равление при обнаружении сигнала соответствующего типа. Функция обработки сигнала должна получить один параметр (типа mt); тип возвращаемого ею значения — void. Регистрация обработчика сигнала осуществляется посредством функции signal После того, как тип данного сигнала обнаружен, библиоте- ка действует так, как будто бы для сигнала данного типа функция signal осуществляется со вторым параметром равным SIG.DFL, и это имеет место до тех пор, пока управление не будет передано обработчику, написанному пользователем. Говоря иначе, реги- стрируемый обработчик сигнала «имеет силу» только для одного факта обнаружения сигнала. Каждый раз, когда выполняется обработчик, он должен перерегистрировать себя, если необходи- мо, чтобы продолжать «перехват» сигналов этого типа. signal Ь Этот объект-заголовок содержит объявление типа sig_atomic_f, а также объявления нескольких функций (signal и raise) и макросов (SIG* и SIG_*), которые оказываются полезными при обработке сигналов. Последние часто называют исключи- тельными состояниями (exceptions) или прерываниями (interrupts). signal.h содержит определения и объявления идентификаторов, приводимых в следующей таблице: Ими Назначение raise sig „atomic—t SIG_DFL Синхронное генерирование сигнала Наименование типа Использование обработчика по умолча- нию SIG_ERR Возвращение значения ошибки функцией signal SIGJGN SIGABRT S1GFPE Игнорирование сигнала данного типа Аномальное завершение Индикация ошибочной арифметической операции 6 Заказ 677 161
signed Лмя Назначение SIGILL Индикация недействительного образа функции SIGINT Индикация сигнала внимания к интерак- тивным действиям signal SIGSEGV Установка обработчика сигнала Индикация недействительного доступа к памяти SIGTERM Индикация запроса о завершении работы (См future library directions.) signed Это ключевое слово используется с типами целочисленных данных для обозначения наличия знака у этих чисел. Ключевое слово signed применимо к следующим типам: char, short int, inf и long int. Оно дает возможность выполнять арифметические опе- рации с учетом знаков операндов. Будучи используемым без сопутствующего имени типа, signed подразумевает тип int. Добав- ление signed к short, int и long является избыточным, поскольку данные этих типов всегда имеют знак. Стандарт языка Си пред- лагает этот модификатор типа для язного задания «знаковых» вариантов char н полей битов типа int. До этого нововведения Стандарта программисты располагали только простым (plain) типом char и типом char без знака: от реализации системы программирования зависело, как (со знаком или без него) опре- ' делились простые типы char и int для полей битов. (См. ntegral type.) signed char Это тип char с явным указанием представления значения со знаком. Простой тип char, задаваемый без модификатора signed или unsigned, может представлять данные со знаком или без знака, и это определяется реализацией системы программирования. (См signed.) signed char type conversion (преобразование типа signed char) (См. conversion, integer type, unsigned preserving rule; value preserving rule.) signed Integer types (типы целочисленных данных co знаком) Речь идет о типах signed char, signed short, short inf, signed int, long и signed long. (Cm. bit-field, plain int; char, plain.) significant part, floating constant (значащая часть константы с плава- ющей точкой) Это часть константы с плавающей точкой, пред- шествующая не обязательно присутствующей экспоненте и суф- фиксу. SIGSEGV Этот макрос определяет тип сигнала, указывающего на недопустимое обращение к памяти (нарушение условий доступа к сегменту). SIGTERM Этот макрос определяет тип сигнала, указывающий, что программе был послан запрос на завершение выполнения. 162
si zest simple assignment operator (знак операции «присваивание») (См assignment operator, simple.) sin Эта функция вычисляет синус своего аргумента х (измеряемого в радианах) #mclu Je <niath.h> double sin(<Jouble x); Если значение аргумента велико, функция sin может дать резуль- тат крайне мадый или без значимости. sinf Это дополнительная функция (опция) является вариантом фун- кции sin, который оперирует данными типа float. Это относится к нововведениям Стандарта языка Сн. SING Этот нестандартный макрос применяется с функцией matherr single quote escape sequence (управляющая последовательность «одиночная кавычка») Символ «одиночная кавычка» может быть в в мочен в символьную константу только в форме управля- ющей последовательности, а именно: \'. В строковом литерале одиночная кавычка может использоваться в обеих возможных формах, т. е. ' или \*. sinh Эта функция вычисляет гиперболический синус своего аргу- мента х (измеряемого в радианах). #irdude <math.h> double sinh(double к); Если значение аргумента слишком велико, имеет место ошибка «выход за диапазон допустимых значений». sinhf Эта дополнительная функция (опция) является вариантом функции sinh, который оперирует данными типа float. Это отно- сится к нововведениям Стандарта языка Си. "tnhl Эта дополнительная функция (опция) является вариантом функции sinh, который оперирует данными типа long double. Это относится к нововведениям Стандарта языка Си. sinl Эта дополнительная функция (опция) является вариантом фун- кции sin, который оперирует данными типа lorg double. Это относится к нововведениям Стандарта языка Си. size_t Это тип результата, порождаемого операцией вычисления размера объекта (sizeof). Многие стандартные биб/ иотечные функции 'например, sHen и cahoc) предполагают, что их аргумен- ты и (или) возвращаемые значения — данные этого типа. Тип size.t относится к нововведениям Стандарта языка Си. Значение выражения sizeof может быть воспроизведено (в танспортабель- ной форме) следующим образом: pnnH("%lu", (unsigned long)sizeof(int)); Тип size_t определяется в каждом из следующих объектов-заго- ловков: stddef.h, stdio.h, stdlib.h, string.h и time.h. 163
sizeof sizeof Это ключевое слово применяется для представления знака операции, выполняемой при трансляции программы. Данная операция формирует в качестве результата значение размера операнда (в байтах). Роль операнда могут выполнять выражения илн типы, исключая типы функций и void. В качестве операнда нельзя использовать поля битов. Эта операция не вычисляет значение своего операнда; она определяет только его тип. Тип результата данной операции — size_t. sizeof может использоваться одним из следующих образов: sizeof( тип ) sizeof выражение Во втором случае выражение часто размещается в круглых скобках, хотя в этом нет необходимости. sort function (функция сортировки) (См. qsort,) source file inclusion (включение исходного файла) (См. #include.) Spirit of С (Основополагающие принципы языка Си) Речь идет об основополагающем принципе, которым руководствовался Ко- митет X3J11 принимая решение, что следует изменять и добав- лять при определении стандарта языка В документе «Standard С Rationale» (Размышления о Стандарте языка Си) это формули- руется следующим образом. Имеется много аспектов того, что называется духом языка Си, однако его сущность — это сочувствие сообщества (программи- стов) основополагающим принципом, на которых базируется язык Си. Некоторые аспекты духа языка Си можно подытожить фразами, подобными следующим: • Доверяй программисту. • Не препятствуй программисту делать то, что требуется. • Сохраняй малые размеры и простоту языка. • Предоставляй только один способ выполнения операции. Одна из целей Комитета заключалась в стремлении не «мешать» трансляторам генерировать компактные эффективные коды. Комитет предложил ряд нововведений (дополнительные свойст- ва языка) для улучшения возможной эффективности генериру- емого кода; например, операции с плавающей точкой можно выполнять с одинарной точностью, если оба операнда типа float, а не double. sprinlf Эта функция записывает форматированные выходные дан- ные в строку символов, на которую указывает s, в формате, задаваемом строкой форматирования, на которую указывает format. #mdude <stdio.h> inf sprintf(char *s, const char *formaf, ...); Значение, возвращаемое функцией sprintf, — это количество символов, записанных в строку. Это число не включает символ ’\0’, добавляемый автоматически в конец строки. В случае обна- 164
sscanf ружения ошибки возвращаемое значение — отрицательное чис- ло, как и в случае применения функций scanf и fprintf. (См. фун- кцию print!, где дана детальная информация о форматировании выводимых данных.) sqrt Эта функция вычисляет неотрицательный квадратный корень своего аргумента х. #indude <mafh.h> double sqrtfdouble x); Если аргумент — отрицательное число, имеет место ошибка «выход за пределы области определения» (domain error). Некото- рые реализации системы программирования (например, в соот- ветствии со стандартом IEEE Р854) поддерживают работу с ну- левыми значениями, имеющими знак (signed zero), и в том числе в форме с плавающей точкой; в подобном случае может потребоваться, чтобы sqrt(—О) возвращала —0. Стандарт языка Си требует, чтобы генерировалась ошибка «выход за пределы обла- сти определения», однако допускает, чтобы функция возвраща- ла значение, определяемое реализацией системы (т. е. допуска- ется результат выполнения функции, равный —0). sqrtf Эта дополнительная функция (опция) является вариантом функции sqrt. который оперирует данными типа floaf. Это отно- сится к нововведениям Стандарта языка Си. sqrt! Эта дополнительная функция (опция) является вариантом функции sqrt, который оперирует данными типа long double. Это относится к нововведениям Стандарта языка Си. srand Эта функция использует свой аргумент seed в качестве «зер- нышка», из которого «прорастает» новая последовательность псевдослучайных чисел, возвращаемых при следующих друг за другом обращениях к -and. #indude <sfdlib.h> void $rand(unsigned inf seed); Если функция rand никогда не вызывалась, то при обращении к ней имеет место ситуация, подобная вызову rand(l), т. е. исполь- зование в качестве «зерна-зародыша» единицы. Идентичные «зернышки» порождают идентичные последовательности псев- дослучайных чисел. sscanf Эта функция читает форматированные входные данные из строки символов, на которую указывает s, используя строку форматирования, на которую указывает format. #indude <stdio.h> int sscanf(const char *s, const char «format, ...); Значение, которое возвращает функция sscanf, равно числу эле- ментов ввода, которым присвоены значения. Если имеет место ошибка, возвращаемое значение равно EOF 165
stack Все параметры, подлежащие передаче функции sscanf, должны быть адресами. (См. scant, где дается детальное описание строки форматирования.) stack (стек) Это область памяти, в которой (в зависимости от архи тектуры вычислительной системы) размещаются для хранения автоматические объекты и списки параметров функций. В зави- симости от величины требуемого пространства памяти (а также существования рекурсии), может потребоваться задание размера стека для компиляции и компоновки (compiling and linking). Может оказаться очень затруднительной оценка размера стека, необходимого для выполнения программы, поскольку определя- ющими факторами являются объем памяти для автоматических переменных, пространство памяти для организации вызова фун- кции. глубина рекурсивных вызовов и потребности библиотеч- ных функций в памяти. Standard С (Стандарт языка Си) Это обобщенный термин, именую- щий текущее формальное определение языка Си, препроцессора и библиотеки поддержки выполнения программы (run-time library). Хотя предшественником стандарта ISO С является стан- дарт ANSI С, после принятия (адаптации) ISO С в США про- изошла замена ANSI стандарта на ISO-стандарт. Поскольку предполагается техническая эквивалентность этих двух стандар- тов и в будущем, следует считать предпочтительным термин «Стандарт языка Си» (Standard С) во избежании предположений, что эти стандарты могут отличаться. standard header (стандартный объект-заголовок) (См. header, stand- ard.) standard streams (стандартные потоки) (См. stderr, stdin и stdout.) Многие реализации системы программирования на языке Си, функционирующие под управлением MS-DOS, опре- деляют также еще два «стандартных» потока: stdaux и stdprn. state-depend"ng encoding (кодирование, зависящее от состояния) (См multiby*e character и shift state.) statement (команда) Команда (предложение или утверждение) язы- ка Си — это одна из конструкций, определяемых языком про- граммирования (например, it/else, for или while), выражение как команда, блок или null-команда (пустая команда). statement, compound (составная команда) (См. block.) static Это ключевое слово, используемое для обозначения класса памяти, применяется при объявлении объекта, имеющего стати- ческую форму хранения в памяти. Статический объект может не иметь связей или иметь только внутренние связи с другими объектами. Это ключевое слово используется также и с функци- ями. Статическую функцию можно вызывать только из функ- ций, определяемых в том же самом файле исходного текста программы или в любом объекте-заголовке, включаемом в этот файл. 166
stderr static storage duration (продолжительность хранения класса static) (См. storage duration, static.) stdarg.h Этот объект-заголовок предоставляет средства доступа к списку переменного числа параметров, как это имеет место в функциях семейств printf и scant. Здесь определяются тип va_list и макросы va_start, va_arg и va_end. Объект-заголовок stdarg h отно- сится к нововведениям Стандарта языка Си; он во многом «повторяет» возможности varargs.h операционной системы UNIX. stdarg h содержит определения и объявления приводимых ниже идентификаторов. Имя Назначение va arg va_end vajist Получение параметра из списка Завершение обработки списка параметров Обозначение (имя) типа для манипуляции списком параметров va_slart Подготовка к обработке списка параметров stdaux Этот нестандартный макрос, определяемый в stdio.h, является выражением типа FILE *, значение которого — указатель на объект типа FILE, соответствующий «стандартному внешнему устройству». Этот макрос обычно существует в реализациях системы программирования, функционирующих в среде MS- DOS. __STDC___ Это макрос, предопределенный в Стандарте языка Си. Он устанавливается равным 1 для реализации систем програм- мирования, согласованных со Стандартом языка Си. Это отно- сится к нововведениям Стандарта языка Си. stddef.h Этот объект-заголовок содержит определения макросов и типов не вошздшие в состав других объектов-заголовков. Это макросы NULL и offsetof, а также типы size_t, ptrdiff_* и wchar_t. stddef.h содержит определения и объявления идентификаторов, приводимых ниже. Имя Назначение NULL oHsetof ptrdiff_f size_t wchar_* null-указатель в форме константы Макрос смещения структуры Тип разницы указателей Тип размера или счетчика Тип символа расширенной формы (wide character) stderr Этот макрос, определяемый в stdio.h, является выражением типа FILE *, значение которого — указатель на объект типа FILE, 167
stdin соответствующий «стандартному устройству (приема) ошибок». Это не обязательно константа фазы трансляции (translation-time constant). stdin Этот макрос, определяемый в stdio.h, является выражением типа FILE * значение которого — указатель на объект типа FILE, соответствующий стандартному устройству ввода. Это не обяза- тельно константа фазы трансляции stdio.h Этот объект-заголовок определяет несколько типов и макро- сов и объявляет многочисленные функции, полезные при работе с файлами и устройствами ввода вывода, stdio.h содержит опре- деления и объявления идентификаторов, приводимых ниже в таблице. Имя Назначение BUFS1Z clearcrr Задание размера буфера для setbuf Очистка (сброс) флажков ошибок и кон- ца файла EOF (dose feof terror Индикатор конца файла Закрытие файла Проверка достижения конца файла Проверка наличия ошибки при работе с файлом • {flush fgetc fgetpos Принудительная запись (сброс) в файл Чтение символа из файла Получение информации о позиции в файле (gets FILE Чтение строки символов из файла Тип блока с контекстом информации о файле FILENAME _MAX Задание максимальной длины имени файла FOPEN_MAX Задание максимального числа открытых файлов fopen fpos_t fprintf fputc fputs tread (reopen fscanf fseek Открытие файла Тип позиции в файле Форматированная запись в файл Запись символа в файл Запись строки символов в файл Бинарное чтение файла Повторное использование FlLE-указателя Форматированное чтение из файла Установка произвольной позиции в файле 168
stdio.h Имя Назначение fsetpos Установка произвольной позиции в файле ftell Получение информации о позиции в файле fwrtte getc getchar gets JOFBF JOI BF JONBF I t-npnam Бинарная запись в файл Чтение символа из файла Чтение символа из stdin Чтение строки символов из stdin Тип буферизации для setvbuf Тип буферизации для setvbuf Тип буферизации для setvbuf Задание максимальной длины имени временного файла NULL null-указатель в форме констан-ы perror print! putc putchar puts remove Форматирование сообщения об ошибке Форматированная запись в stdout Запись символа в файл Запись символа в stdout Запись строки символов в stdout Удаление или уничтожение файла rename rewind scanf SEEK_CUR Переименование файла Позиционирование файла в начало Форматированное чтение из stdin Параметр позиционирования в файле для fseek SEEK .END Параметр позиционирования в файле для fseek SEEK_SET Параметр позиционирования в файле для fseek sefbuf setvbuf sixe_f sprintf Установка характеристик буфера файла Установка характеристик буфера файла Тип значения Форматированная запись в строку сим- волов sscanf Форматированное чтение из строки символов stderr Указатель на объект типа FILE для стан- дартного приемника ошибок s*din Указатель на объект типа FILE для стан- дартного устройства ввода 169
staiib.h Имя Назначение stdout Указатель на объект типа FILE для стан- дартного устройства вывода ТМР-МАХ Задание максимального числа уникаль- ных временных файлов tmpfile tmpnam ungefc vfprintf vprintf vsprinif Открытие временного бинарного файла Создание уникального имени файла Посылка символа обратно в stdin Форматированная запись в файл Форматированная запись в stdout Форматированное чтение из stdin _ _ (См future library directions.) stdllb h Этот объект-заголовок содержит определения четырех ти- пов (div_t, ldiv_t, sire.t, wchar_t) и пяти макросов (EXIT-FAILURE, EXIT-SUCCESS, MB. CUR-MAX. NULL. RAND-MAX' Здесь также нахо- дятся объявления (declarations) многочисленных функций, stdlib.h содержит определения и объявления идентификаторов, приводимых ниже. Имя Назначение abort Аномальное завершение работы про- граммы abs atexi* a*of Вычисление абсолютного значения Регистрация функции Преобразование строки символов в чис- ло с плавающей точкой atoi Преобразование строки символов в це- лое число afol Преобразование строки символов в це- лое число bsearch calloc div div_t exit Выполнение бинарного поиска Выделение и инициализация памяти Выполнение деления Тип результата деления div Нормальное завершение работы про- граммы EXIT-FAILURE EXIT-SUCCESS free getenv labs wctomb Уровень ошибки (failure value) для exit Уровень успеха (success value) для exit Освобождение выделенной памяти Получение переменной среды Вычисление абсолютного значения Преобразование символа расширенной формы _ 170
stdprn Имя Назначение Idiv !div_t mallee MB_CUR_MAX Выполнение деления Тип результата деления Idiv Выделение Памяти Задание максимального размера много- байтового символа mblen Вычисление длины многобайтового сим- вола mbstowcs Преобразование многобайтовой строки символов mbtowc Преобразование многобайтового симво- ла NULl □sort rand RZNC MM realloc null-указатель в ферме константы Выполнение быстрой сортировки Генерирование случайного числа Задание максимального значения Расширение или сжатие выделенной па- мяти size_t srand Тип значения Установка «зародыша» последовательно- сти случайных чисел strtod Преобразование строки символов в чис- ло с плавающей точкой strtol Преобразование строки символов в це- лое число strtoul Преобразование строки символов в це- лое число system wchar_t westombs Передача управления системе Тип символа расширенного формата Преобразование строки символов рас- ширенного формата wetomb Преобразование символа расширенной формы (См. future library directions ) stdout Этет макрос, определяемый в stdio.h, является выражением типа FILE •, значение которого — указатель на объект типа FILE, соответствующий стандартному устройству вывода. Это не обя зательно константа фазы трансляции. .stdprn Этот нестандартный макрос, определяемый в stdio.h, является выражением типа FILE ♦ значение которого — указатель на объект типа FILE, соответствующий «стандартному устройству Печати». 171
storage class storage class (класс памяти) Класс памяти объекта или ф} нкции обозначает область действия (scope) и характер связей (linkage) между объектами или функциями. Для объектов класс памяти задает также время их жизни. Класс памяти указывается в объявлении посредством одного из ключевых слов auto, static, extern или register. Внутри определения функции объект, объяв- ление которого не содержит одно из перечисленных ключевых слов, полагается имеющим класс памяти auto. Конкретное клю- чевое слово класса памяти, а также расположение объявления в исходном файле (внутри или снаружи определения функции) задают продолжительность хранения («жизни») идентификатора в памяти и его связи (linkage). Технически typedef также можно отнести к ключевым словам класса памяти, однако оно не задает ни продолжительности хранения в памяти, нн связи идентифи- катора. Класс памяти переменных или функций не является частью их гипа. Объявление может содержать не более одного ключевого слова класса памяти. А поскольку технически typedef — ключевое слово класса памяти, в него нельзя включать ключевое слово класса памяти. Поэтому ошибочны следующие команды. typedef static int si; typede* auto int ai; storage class keyword, position of (местоположение ключевого класса памяти) Размещение спецификатора класса памяти ие в начале перечня спецификаторов объявления является устаревающей практикой, выходящей из употребления. Например: long int static i; struct { int i; double d; ) typedef stru; Этот текст не содержит ошибок, однако ключевые слова static и typedef следовало бы разместить в начале соответствующих объ- явлений. storage duration (продолжительность хранения) Понятие «жизнь объекта» применимо только к объектам-данным и характеризует время в течение которого гарантируется существование объек- та. (Реализация системы программирования на языке Си может обеспечить объекту и более долгую «жизнь».) Стандарт языка Си трактует «жизнь» объекта как продолжительность его хранения. Последняя делится на две категории; статическая и автоматиче- ская. (См. linkage и scope.) storage duration, automatic (автоматическая продолжительность хра- нения) Речь идет о продолжительности хранения объекта, зада- ваемой в его объявлении посредством ключевого слова класса памяти auto или register, либо определяемой фактом объявления объекта в определении функции без указания ключевого класса 172
strchr памяти. Такие объекты создаются в процессе выполнения про- граммы при каждом входе в блок, где они определяются; они уничтожаются при выходе из этого «родительского» блока. Подо • бные объекты, именуемые автоматическими переменными, как правило, хранятся в стеке и их начальное значение (задаваемое по умолчанию) не определено. storage duration, static (статическая продолжительность хранения) Речь идет о продолжительности хранения объекта, задаваемой при его объявлении внутри определения функции посредством ключевого слова класса памяти static, либо задаваемой вне фун кции с помощью ключевого слова или без него. Таковыми являются объекты, формируемые до начала выполнения функ- ции main. Они сохраняют присваиваемые им значения при переходе от одного вызова функции к другому. Их начальные значения равны нулю (если отсутствует явная инициализация); при этом нулевое значение соответствует типу объекта. Статиче- ская (static) функция также имеет статическую продолжитель- ность хранения. Это означает, что к ней можно обращаться по имени только из того исходного файла, в котором она определе- на. storage unit (единица памяти) Это объект, определяемый реализа цией системы программирования, в котором упаковываются поля битов. Порядок упаковки последних, а также возможность или невозможность «пересечения» ими границ пространства памяти также определяется реализацией системы программиро- вания. str prefix (префикс str) (См. future library directions.) strcat Эта функция копирует строку символов, па которую указы- вает s2, в конец строки символов, на которую указывает st. В процессе копирования символ '\0', замыкающий строку st, сти- рается, а на его место помещается первый символ строки s2. Результирующая строка (продукт слияния двух строк) заверша- ется символом '\0'. #include <string.h> char *strcat(char *s1, const char *s2); Возвращаемое значение адресуется указателем si. Если строки, на которые указывают si и s2, перекрываются, поведение функ- ция strcat не определено. strchr Эта функция выполняет поиск символа с в строке символов s. #indude <string.h> char ♦strchr(const char »s, int c); При обнаружении символа с функция strchr возврагцает указа- тель на местоположение с в строке s; иначе возвращаемое значе- ние равно NULL. Символ '\0', завершающий строку символов s, также входит в число просматриваемых символов. Следователь- 173
strcmo но, функцию strchr можно использовать для локализации место- положения '\0'. strrmp Эта функция сравнивает строку символов, на которую указывает s2, со строкой символов, на которую указывает si. #indi>de <string.h> mt strcmp(co. ist char »s1, const char *s2); Целочисленное значение, которое возвращает функция s’rcmp, меньше нуля, равно нулю или больше нуля в зависимости от того, меньше, равна или больше строка si в сравнении со строкой $2 соответственно. strcoll Эта функция сравнивает строку символов, на которую ука- зывает s2, со строкой символов, на которую указывает si. #indude <string.h> int strcoll(const char »st, const char *s2); Целочисленное значение, которое возвращает функция strcoll, меньше нудя, равно нулю или больше нуля в зависимости от того, меньше, равна или больше строка s1 в сравнении со строкой s2 соответственно. Сравнение выполняется согласно специфике дан- ной «культурной среды» (locale), и. как следствие, появляе-ся возможность применения произвольных последовательностей (arbitrary collation sequence) для сопоставления при условии вы- полнения требований данной «культурной среды». 1 (сдобная по- следовательность может включать «неанглийские» буквы и симво- лы. В «культурной среде Си» ("С" locale) от функции strcoll следует ожидать такие же резулг гаты как и от функции stremp. strepy Эта функция копирует строку символов на которую указы- вает s2, в область памяти где находится строка символов, адре- суемая указателем si. #indude <string.h> char *strcpy(char »s1, const char *s2); Возвращаемым значением является si. Если строки, располо- женные по адресам st и s2, перекрываются, поведение функции strepy не определено. Для копирования перекрывающихся объ- ектов следует использовать функцию memmove. strespn Эта функция выполняет поиск самой длинной строки сим- волов в области памяти, адресуемой указателем si; условием поиска является отсутствие в искомой строке символов, содер- жащихся в строке, на которую указывает s2. Возможно и альтер- нативное определение задачи, решаемой функцией strespn- в строке символов, адресуемой указателем st, выполняется поиск первого включения любого символа, содержащегося в строке, на которую указывает s2. #indude <string.h> size_t strcspn(const char »s1, const char *s2); 174
stream, text Значение, возвращаемое функцией strcspn, равно длине найден- ной в $1 строке, символы которой не совпадают ни с одним из символов строки, адресуемой указателем s2. Альтернативное определение возвращаемого значения — это индекс (порядко- вый номер в строке s2) символа, совпадающего с одним из символов строки s2. stream (поток) Это так называемый логический канал для выполне- ния операций ввода-вывода. Различают три стандартных потока: stdin, stdout и stderr именуемые «стандартный ввод», «стандарт- ный вывод» и «стандартный приемник ошибок» соответственно Они оказываются открытыми при каждом пуске программы и закрываются по завершению работы программы. Для назначе- ния потока некоторому файлу его необходимо открыть посредст- вом функции (open. (См. FILE; stream, binary; stream, text.) stream, binary (бинарный или двоичный поток) Это упорядоченная последовательность символов, которая может однозначно пред- ставлять внутренние данные. Будучи записанными, такие дан- ные можно извлекать точно такими же. как они были записаны той же самой реализацией системы программирования. (Разли- чия в порядке следования байтов внутри слов, слов внутри длинных слов и т. д. могут явиться препятствием прочтения данных в одной реализации системы программирования при выполнении их записи средствами другой реализации.) В зави- симости от реализации системы программирования к концу бинарного потока может быть добавлено различное число null- символов. Когда поток открывается как бинарный (используя в функции (open спецификатор бинарного режима Ь), так называ- емая логическая трансляция (logical translation) не выполняется. Например, если обычно (при логической трансляции) ввод со- провождается преобразованиям каждой пары символов «возврат каретки» и «перевод строки» (carriage-return/hne-feed) в символ «новая строка» (new-line), то в случае бинарного режима указан- ные два символа читаются один за другим как два отдельных символа. (См. stream, text.) stream, fully buffered (поток с полной буферизацией) Для таких по- токов предполагается, что символы читаются или записываются когда блок (буфер) пуст или полон соответственно (См. JOFBF; setvbuf; stream, line buffered, stream, unbuffered ) stream, line buffered (поток с буферизацией строки) Для таких по- токов предполагается, что символы читаются или записываются, когда встречается символ «новая строка» (new-line). (См JOLBF; setvbuf; stream, fully buffered: stream unbuffered.) stream, standard error (стандартный поток ошибок) (См. stderr.) stream, standard Input (стандартный поток ввода) (См stdin.) stream, standard output (стандартный поток вывода) (См. stdout.) stream, text (текстовый поток) Это поток, в котором символы орга- низованы в строки, каждая из которых заканчивается символом «новая строка» (new-line). Когда данные записываются в тексто- 175
stream, unbuffered вый поток или читаются из него, возможна определенного вида так называемая логически-физическая или физически-логиче- ская трансляция. Например, при вводе пара символов «возврат каретки» и «перевод строки» (carnage-return/line-feed) может быть преобразована в символ «новая строка» (new-line). Не требуется, чтобы реализация системы программирования разли- чала текстовый и бинарный потоки. (См. параметр mode функ- ции (open; stream, binary.) stream, unbuffered (поток без буферизации) В таких потоках симво- лы подлежат чтению или записи тот час же, как это целесообраз- но с практической точки зрения, т. е. их не следует буферизо- вать. (См. _IONBF; setvbuf; stream, fully buffered; stream, line buffered ) strerror Эта функция возвращает адрес строки символов, содержа- щей сообщение, которое соответствует коду сообщения, исполь- зуемому в качестве параметра. #indude <string.h> char +st"'error(inf errnum); Функция strerror по своим возможностям подобная функции perror; она предполагает использование errno. Однако реггог пи- шет сообщение прямо в stderr вместе с текстом, определяемым пользователем, в то время как s*rerror возвращает указатель на строку сообщения, предоставляя программисту возможность об- рабатывать ото сообщения по своему усмотрению. strftime Эта функция формирует строку, содержащую дату и время, помещая символы в массив, на который указывает s, в соответ- ствии со строкой форматирования, адресуемой указателем сим- волов. Параметр timeptr указывает на структуру, содержимое которой используется для определения надлежащих символов для массива. #inciude <time.h> size_t sfrftime(char •$, size_f maxsize, const char «format, const struct tm «hmeptr); Это нововведение Стандарта языка Си предоставляет возмож ность формирования строки даты и времени в соответствии со спецификой «культурной среды» (locale). Например: #indude <stdio.h #indude <time.h> main() { char string[1OO]; time_t cur_time; struct tm *ptime; cur_time — fime(NULL); 176
string.h if ((ptime = gmfime(&cur_hme)) 1= NULL) { strffime(stnng, s.reof(string)—1, “%Y %B %A %c", ptime); pnntf("%s\n", string); ) else printf("UTC time no* available\n"); } 1991 April Monday Mon Apr 08 15:10:37 1991 Описание спецификаторов строки форматирования можно най- ти в соответствующей документации библиотечных функций. strictly conforming program (программа, полностью удовлетворяю- щая требованиям Стандарта языка Си) (См. program, strictly conforming.) string (строка) Это массив символов (array of char), завершающийся СИМВОЛОМ '\0' (См. string literal string literal, wide.) string conversion functions (функции преобразования строк) Это объявляемые в string.h функции atof, atoi. atol, sfrtod, strtol и strfoul. string functions (функции, оперирующие co строками символов) (См. sfring.h.) string literal (строковый литерал) Это лексема исходного текста про- граммы, имеющая форму где многоточие — это отсутствие исходных символов, исключая «двойные кавычки», «наклонная черта влево» и «новая строка» (new-line). Строковый литерал размешается компилятором как статический массив данных типа char (static array of char); массив завершается null-символом. Реали- зация системы программирования определяет, подлежат ли стро- ки размещению в областях памяти, доступных для записи, и следует ли различать идентичные строки символов. string literal, wide (строковый литерал расширенной формы) Это лексема исходного текста программы, имеющая форму L"...", где многоточие — это отсутствие символов или их последователь- ность из набора исходных символов, исключая «двойные кавыч- ки», «наклонная черта влево» и «новая строка» (new-line). Стро- ковый литерал расширенной формы размещается компилятором как статический массив объектов типа wchar_f (static array ol wchar_*); массив завершается null-символом расши- ренной формы. Реализация системы программирования опреде- ляет, подлежат ли строки размещению в областях памяти, доступ- ных для ?аписи, и следует ли различать идентичные строки. Это относится к нововведениям Стандарта языка Си string.h Этот объект-заголовок содержит объявления семейства биб- лиотечных функций, имена которых имеют форму str* и mem* (где str и mem — первые буквы имен). Ранее некоторые из этих функций (обычно mem*) объявлялись в нестандартном объекте- заголовке, именуемом memory.h (а иногда mem.h). 177
stringize operator string.h содержит определения и объявления идентификаторов, приводимых в следующей ниже таблице. Имя Назначение memch- Просмотр области памяти в поисках символа тетстр тетсру memmove Сравнение блоков памяти Копирование блоков памяти Копирование блоков памяти (даже перекры- вающихся) men-set NULL size_t strcat strchr Инициализация блока памяти Константа в форме null-указателя Тип значения Конкатенация (сцепление) строк символов Просмотр строки символов в поисках симво- ла strcmp strcoll strcpy strcspn Сравнение строк Сравнение строк символов Копирование строки символов Вычисление расстояния до точки совпаде- ния strerror strlen strncat strnc-np stncoy Формирование сообщения об ошибке Вычисление длины строки символов Конкатенация (сцепление) строк символов Сравнение ведущих частей строк символов Копирование ведущих частей строк симво- лов strpbrk Локализация положения символа в строке символов stmchr strspn Обратный поиск символа в строке символов Вычисление длины совпадения строк симво- лов strstr Просмотр одной строки символов в поисках другой строки strfok strxfrm Разбиение строки символов на лексемы Трансформация одной строки символов в другую (См. futv re direction library.) stringize operator (знак операции «придание операнду формы стро- ки символов») Этот знак одноместной операции препроцессора (#) является нововведением Стандарта языка Си. Он определен только для макросов, подобных функциям (function like тасгоз). 178
strnemp Если в списке замещения макроса перед параметрами находится знак #, и параметр, и предшествующий ему знак заменяются лексемой в форме одиночного строкового литерала, содержащего текст соответствующего фактического параметра. Если в пара- метре имеются символы «двойные кавычки», перед ними поме- щается «наклонная черта влево» (\). Ведущие и замыкающие (ведомые) пробелы в тексте параметра игнорируются, а каждое включение смежных пробелов заменяется одним пробелом. Так, например, в случае макроопределения # define М(а) f #а) при вызове макроса М{ S "10 \п" ) имеет место его расширение f("5 \"10 \\п\'"') Приоритет и ассоциативность операций препроцессора, задава- емых знаками # и ##. не специфицированы. strlen Эта функция возвращает число символов в строке (исключая ведомый *\0'), на которую указывает s. #include <string.h> size_t strlerjconst char *s); stmcat Эта функция копирует не более, чем п первых символов из строки, на которую указывает s2, в конец строки, на которую указывает si. Результирующая строка замыкается символом *\0’ #inc!ude <string.h> char *strncat(char *s1, const cha- »s2, size_t n); Возвращаемое значение адресуется указателем si. Если среди первых п символов, расположенных по адресу s2, символ *\0‘ не обнаружен, выполняется копирование, завершаемое размеще- нием символа '\0'. При обнаружении '\0‘ этот знак копируется в строку, расположенную по адресу st, после чего процедура копирования прекращается. Если строки, адресуемые указате- лями si и s2, перекрываются, поведение функции st-nca* не определено. strnemp Эта функция сравнивает не бо..ее чем п символо в из строки, на которую указываетs2, в строку на котсру ю указывает si. Если среди первых п симвс лов обнаруживается *\0‘, процедура срав- нения прекращается. #,ndude <string.h> int strncmpf.onst char *s1, cons1 char *s2, size_t n); Возвращаемое целочисленное значение меньше нуля, равно нулю или больше нуля, в зависимости от того, меньше ли строка si, чем строка s2, равны ли эти строки или строка si больше, чем строка s2, соответственно- 179
strncpy strncpy Эта функция копирует не более, чем п первых символов из строки, на которую указывает s2, в строку, адресуемую указате- лем si. Результирующая строка замыкается символом '\0‘. #include <string.h> char ♦strncpyfchar *s1, const char *s2, size_t n); Возвращаемое значение адресуется указателем si. Если среди первых п символов, расположенных по адресу s2, символ '\0' не обнаружен, строка, на которую указывает si, не будет завершена символом '\0‘. При обнаружении '\0' этот символ копируется в строку, на которую указывает si. Если в строке, адресуемой указателей si, менее п символов, дополнительные символы '\0‘ добавляются (копируются) в конец строки, на которую указыва- ет si; операция добавления '\0' продолжается до тех пор, пока в строку не будет скопировано п символов. Если строки, адресуе- мые указателями $1 и s2, перекрываются, поведение функции s*rncpy не определено. Для копирования перекрывающихся объ- ектов следует использовать функцию memmove. strpbrk Эта функция выполняет поиск в строке символов, на кото- рую указывает si, первого из символов строки, иа которую указывает s2. #indude <stnng.h> char *strpbrk(const char *s, const char *s2); Возвращаемое значение — это указатель на символ, обнаружен- ный в строке, на которую указывает si, или NULL, если ни один символ не обнаружен. strrchr Эта функция выполняет поиск в строке, на которую указы- вает s, последнего включения в нее символа с. #include <string.h> char ♦sfrrchr(const char »s, int c); Если символ с найден, функция strrchr возвращает указатель на его местоположение в строке; в противном случае возвращаемым значением является NULL. Перед началом поиска объект с преоб- разуется в данное типа char. Символ '\0', завершающий строку, на которую указывает s, включен в поиск. Следовательно. sErchr можно применять для локализации местоположения ведомого '\0*« strspn Эта функция ищет самую длинную строку символов, начиная с адреса si, при условии, что она должна содержать только те символы, которые находятся в строке, адресуемой указателем s2. Можно посмотреть на задачу, решаемую функцией strspn по-дру- гому: определяется местоположение первого символа в строке, адресуемой указателем si, который отсутствует в строке, на которую указывает s2. #include <sfrmg.h> siie_t strspn(const char *s1, const char *s2); 180
strtok Возвращаемое значение — это длина строки в si. символы кото* рой соответствуют строке в s2. Говоря иначе, возвращаемое значение — это индекс (номер) первого символа в si, не соответ- ствующего ни одному из символов в s2. strstr Эта функция выполняет поиск в строке, на которую указывает si, подстроки, иа которую указывает s2. #indude <string.h> char »strstr(consf char *sl, const char *s2); Возвращаемое значение — это местоположение подстроки, адре- суемой s2, в строке, на которую указывает si. Если подстрока не найдена, возвращаемым значением является NULL. По определе- нию. null-строка всегда находится в начале любой строки симво- лов, включая и null-строку. strtod Эта функция преобразует ведущую часть строки, на которую указывает пр*г, в данное типа double. #include <stdlib.h> double strtod(const char *nptr, char »*endpfr); Ведущие пробелы игнорируются. Константа с плавающей точ- кой завершается любым символом, недопустимым в такой кон- станте (включая символ '\0', завершающий входную строку символов). Ведущий символ знака числа допускается, как и (возможно, со знаком) символ экспоненты в виде буквы 'е' или Суффикс числа с плавающей точкой, а именно, 'Г (или 'F') или 'Г (или ’L') ие распознается как таковой. Если иет ни экспоненты, ни десятичной точки, то подразумевается наличие десятичной точки в конце числа. Формат числа с плавающей точкой определяется «культурной средой» (locale). Если входная строка символов содержит только пробелы, т. е. она пуста, или в ней находятся непреобразуемые символы, преобразование не осуществляется, nptr записывается в «endptr (при условии, что значение endptr — не NULL), и возвращаемое значение равно нулю. Если преобразование ведущей части строки в число вы- зывает переполнеине, возвращаемое значение — это HUGE_VAL со знаком «плюс» или «минус» (в соответствии со знаком опре- деляемого значения), и при этом errno получает значение ERANGE. При потере значимости возвращается нулевое значе- ние. a errno получает значение ERANGE. Функция srHod является усовершенствованным вариантом функции atof и рекомендует- ся в качестве замены последней. strtok Последовательные вызовы этой функции можно применять для расчленения строки, адресуемой указателем si, на цепочку завершаемых символом ’\0' лексем, используя символы-терми- наторы лексем, задаваемые строкой, на которую указывает s2 #indude <string.h> char ♦strtokfchar *s1, const char *s2); 181
sfrtol Возвращаемое значение — это указатель на найденную лексему, или NULL, если лексема не обнаружена. strtol Эта функция преобразует ведущую часть строки, на которую указывает nptr, в данное типа long int. tfindude <stdlib.h> long int sfrtol(const char «nptr, char **endptr, int base). Ведущие пробелы игнорируются. Целочисленная константа за- вершается любым символом, недопустимым в такой константе (включая символ '\0', завершающий входную строку). Ведущий символ знака числа допускается, однако недопустимы суффик- сы 'и' (или 'U') или 'Г (или 'L'). Целочисленное значение интер- претируется согласно основанию системы счисления base. Если base равно нулю, система счисления будет определяться присут- ствием или отсутствием ведущего 0 или Ок (или ОХ). Иначе используется значение base которое может находиться в преде- лах от 2 до 36. Формат представления целочисленного значения определяется «культурной средой» (locale). Если входная строка содержит только пробелы, т. е. она пуста, или в ней находятся непреобразуемые символы, преобразование не осуществляется, nptr записывается в «endptr (при условии, что значение endptr — не NULL), и возвращаемое значение равно нулю. Если преобра- зование ведущей части строки в число вызывает переполнение, возвращаемое значение — это LONG_MAX или LONG-MIN (в зави- симости от знака определяемого значения), и при этом errno получает значение ERANGE. Функция strtol является усовершен- ствованным вариантом функций atoi и a*oi и рекомендуется в качестве их замены. strtoul Эта функция преобразует ведущую часть строки, на которую указывает nptr, в данное типа unsigned long int. #indude <stdlib.h> unsigned long int strtoul(const char *npt-, char ««endptr, mt base); Ведущие пробелы игнорируются. Целочисленная константа за- вершается любым символом, недопустимым в такой константе (включая символ *\0’, завершающий входную строку). Ведущий символ знака числа допускается, однако недопустимы суффик- сы 'и' (или 'U') или 'Г (или 'L'). Целочисленное значение интер- претируется согласно основанию системы счисления base. Если base равно нулю, система счисления будет определяться присут- ствием или отсутствием ведущего 0 или Ох (или ОХ). Иначе используется значение base, которое может находиться в преде- лах от 2 до 36. Формат представления целочисленного значения определяется «культурной средой» (locale). Если входная строка содержит только пробелы, т. е. она пуста, или в ней находятся непреобразуемые символы, преобразование не осуществляется, nptr записывается в *endp*r (при условии, что значение endptr — 182
strxfrm не NULL), а возвращаемое значение равно нулю. Если преобра- зование ведущей части строки символов в число вызывает пере- полнение, возвращаемое значение — это ULONG. МАХ, и при этом errno получает значение ERANGE. struct Это ключевое слово используется для определения типа структуры, а также для объявления идентификаторов подобного типа. structure (структура) Это тип составных (агрегатированных) дан- ных. в состав которых входит один или несколько членов, обычно взаимосвязанных (логически). Для структуры выделяется доста- точный объем памяти, что обеспечивает одновременно запись значений всех членов структуры. Пример объявления структу- ры: struct [ тег ] { член_/; члел_2: член_п; }; Размер структуры — это по меньшей мере сумма размеров всех ее членов Между соседними членами в памяти могут существо- вать «.дыры»; «дыра» может быть и после последнего члена структуры. Причиной является требование выравнивания дан- ных на соответствующие границы адресного пространства памя- ти (требование аппаратных средств вычислительной системы). Такие «дыры» включаются в структуру и находят «отражение» в ее размере, определяемом посредством sizeof Хотя объединения (unions) синтаксически во многом подобны структурам, между этими двумя типами данных имеются разли- чия. (См. arrow operator, bit-field; dot operator.) structure/unton arrow operator (знак операции «стрелка» структур или объединений) (См. arrow operator.) structure/union dot operator (знак операции «точка» структур или объединений) (См. dot operator.) structure/unton member name space (пространство имен членов структур или объединений) (См. name space ) structure lag (тег структуры) (См. tag.) strxfrm Эта функция преобразует строку символов, на которую указывает s2, в другую строку, на которую указывает si. Преоб- разование определяется «культурной средой» (locale) #>ndude <stnng.h> size_t sfrxfrm(char »s1, const char *s2, size_t n); Если преобразовать две строки, а затем сравнить полученные строки, то результат будет такой же, как при сравнении двух исходных строк посредством функции strcoll. В $1 может быть 183
subscr pl operator записано не более n преобразованных символов. Если длина преобразованной строки больше, чем п, в s1 копируется только п символов, и функция возвращает общее число, необходимое для размещения преобразованной строки целиком. Обычно п доста- точно велико, и возвращаемое значение — это число символов, действительно используемых в si (исключая ’\0\). Если si и s2 обозначают перекрывающиеся строки, результат не определен. Функция s*rxfrm относится к нововведениям Стандарта языка Си. subscript operator (знак операции «индексирование!)) Это базовый знак операции в виде открывающей и закрывающей прямо- угольных скобок [], который применяется для задания индекса элемента массива или указателя. Один из двух операндов соот- ветствующей операции должен иметь тип указателя на объект; тип другого операнда должен быть целый (integral type). Порядок вычисления операндов не специфицирован. Соответствующая операция коммутативна, т. е. a[J эквивалентно и полностью взаимозаменяемо с i[a] хотя последняя форма записи не реко- мендуется к использованию. Знак этой операции всегда «порож- дает» именующее выражение (lvalue). Операция ассоциативна слева. Тип результата — это тип объекта, на который указывает операнд-указатель. Subtraction assignment operator (знак составной операции «вычита- ние» и «присваивание») Этот знак двухместной операции по- зволяет объединить вычитание с присваиванием таким образом что выр! —= вьгр2 эквивалентно выр! = выр! — выр2. за исключением того, что в первом случае выражение выр! вычис- ляется только один раз. Порядок вычисления операндов не специфицирован. Оба операнда должны иметь арифметический тип или правый операнд может быть целого типа, если левый операнд — указатель на объект. Левый операнд должен быть модифицируемым именующим выражением (lvalue). Тип ре- зультата — это тип выражения выр1. Данная операция ассоциа- тивна справа. (См. assignment operator, compound.) subtraction operator (знак операции «вычитание») Знак этой двух- местной операции — знак «минус» — инициирует операцию вычитания значения правого операнда из значения левого опе- ранда. Порядок вычисления обоих операндов не определен. Оба операнда должны иметь арифметический тип, либо правый операнд может быть целого типа, если левый операнд — указа- тель на объект или оба указывают на элементы одного и того же массива. Над операндами выполняются обычные операции пре- образования типов. Данная операция ассоциативная слева. SVID (См. System V Interface Definition ) sm itch Это ключевое слово символизирует начало команды выбора, которая позволяет передавать управление на одну метку (case или default) из заданного набора меток, в зависимости от значения управляющего выражения целого типа. Эта команда имеет сле- дующий формат: 184
system switch ( выражение ) { case I: команда (команды) case 2: команда (команды) case n: команда (команды) [ default: команда (команды) ] ) Если метка case со значением «выражение» существует, то уп- равление передается на эту метку. Если ни одна метка case не имеет значения, равного значению «выражения», но существует метка default, управление передается на default. Иначе управле- ние передается команде, следующей за командой switch. Чтобы прервать описанный поток действий, т. е. чтобы сделать каждый выбор (case) взаимоисключающим по отношению к другим ва- риантам, можно использовать команду break или return. Передача управления происходит по мере продвижения от одной метки case к другой (включая defau't); однако взаимное расположение меток произвольно. Управляющее «выражение» — это полное выражение. (См. label, case; laoel, default; break.) sv itch case label (метка case команды switch) (Cm. ‘abei, case ) switch default label (метка default команды sw;tch) (Cm. label, default.) symbolic constant (символическая константа) (См. macro ob;ect-like.) sys_errlist Нестандартный внешний массив } казателей на строки сообщений, используемый при обработке значений errno. (См. sys_nerr ) SYS_MAX Нестандартный вариант FOPEN_MAX. sys_nerr Это нестандартный макрос, который определяет макси- мальное число сообщений ermo, хранимых в габлипе sys_errlist system Эта функция передает строку символов, на которую указывает stnng, процессору командной строки среды, в которой функциони- рует программа (host environment command-line processor). #indude <sfdlib.h> int sysfem(cons* char ♦string); Стандарт языка Си не требует, чтобы процессор командной строки (или его эквивалент) существовал; в таком случае воз- вращается соответствующее значение, определяемое реализа- цией системы программирования. Чтобы удостовериться в су- ществовании подобной среды, следует вызвать функцию system с параметром NULL. Если возвращаемое значение отлично от 185
System V Interface Definition нуля, процессор командной строки доступен. Формат передава- емой строки определяется реализацией системы. (См. ехес* ) System V Interface Definition (Определение Интерфейса Системы 5) Этот документ был разработан корпорацией AT&T в качестве формального определения ее операционной системы UNIX и соответствующих библиотек языка Си tag (тег) Это иденти £икатор, который может (но необязательно) следовать за служебным словом struct, union или enu-n в определе- нии структуры, объединения или данных перечисляемого типа соответственно. Тег используется в дальнейшем (после опреде- ления) для ссылок на соответствующий тип, например, г прото- типе функции или определении объекта Теги перечисляемого типа, структуры и объединения имеют свое собственное про- странство имен. Если тег опущен, все идентификаторы, принад- лежащие соответствующему «неизвестному» типу (перечисляе- мому, структуре или объединению) должны быть объявлены к моменту присвоения им значений, поскольку' на тот же «неизве- стный» тип нельзя будет сослаться позже. Например: struct ( int i; double d; ) sa, sb, struct { int i; double d; } si, s2; По определению и и sb имеют тот же самый «неизвестный» (безымянный) тип структуры. Подобным же образом у si и s2 гот же самый «неизвестный» тип структуры. Однако это два различ- ных «неизвестных» типа структуры. Они не совместимы по присваиванию (not assignment-compatible). Объекты (и указате- ли на такие объекты) подобных безтеговых типов не мпгут быть переданы в функцию или возвращены из нее, поскольку нет способа объявить «неизвестный» тип в прототипе функции. (Исключением является то, что указатель на такой «неизвест- ный» гип совместим по операции присваивания с void *.) tan Эта функция вычисляет тангенс своего аргумента х (измеряе- мого в радианах). 186
termination, program # include <rrath.h> double tai (double x); Если величина аргумента слишком большая, результат выпол- нения функции tan может быть слишком мал или вообще поте- рять значимость. tanf Эта дополнительная функция (опция) является вариантом функции tan. который оперирует данными типа float. Это отно- сится к нововведениям Стандарта языка Си. tanh Эта функция вычисляет гиперболический тангенс своегс ар- гумента. #inc!ude <math.h> double tanh(double x); tenhf Эта дополнительная функция (опция) является вариантом функции tanh, который оперирует данными типа float. Это отно- сится к нововведением Стандарта языка Си. tanhl Эта дополнительная функция (опция) является вариантом функции tanh, который оперирует данными типа long oouole. Это относит зя к нововведениям Стандарта языка Си. tanl Эта дополнительная функция (опция) является вариантом функции tan, который оперирует данными типа long double Это относятся к нововведениям Стандарта языка Си. template (шаблон) Речь идет о шаблоне данных, который составляет основу определения типа структуры или объединения. 1 (е сле- дует смешивать два понятия: определение структуры или объе- динения и конкретная текущая реализация данных определен- ного типа. Так, например, шаблон, т. е. описание данных содержит следующее определение структуры: struc1 fag { int i; double d; }; template Это ключевое слово языка программирования Си++ не входит в состав средств Стандарта языка Си. Планируя исполь- зование исходных текстов программ, написанных на языке Си. в среде СиН-. следует избегать применения template в Качестве идентиф икатора. tentative definition (уточняемое определение) (См definmon, tentative.) termination abnormal (аномальное завершение выполнения про- граммы) (См. atx>c ) termination normal (нормальное завершение выполнения програм- мы) (См exit.) termination, program (завершение выполнения программы) (См. program termination.) 187
ternary operator ternary operator (знак трехместной операции) (См. operator, ternary.) text stream (текстовый поток) (См stream, text.) this Это ключевое слово языка программирования Си++ не входит в состав средств Стандарта языка Си. Планируя использование исходных текстов программ, написанных на языке Си, в среде Си++, следует избегать применения this в качестве идентифика- тора. thousands_sep Этот член структуры Iconv является указателем на строку, содержащую символ, используемый для отделения групп цифр перед символом десятичной точки в форматированных немонетарных величинах. Если строка содержит'"’, это означает, что в текущей «культурной среде» (locale) соответствующего значения нет или оно имеет нулевую длину. throw Это ключевое слово языка программирования Си++ не входит в состав средств Стандарта языка Си. Планируя использование исходных текстов программ, написанных на языке Си. в среде Си++. следует избегать применения throw в качестве идентифи- катора. __TIME___ Это предопределяемый макрос Стандарта языка Си рас- ширяется до строки символов, содержащей время компиляции в форме ”hh:mm:ss" (hh — две цифры часа; mm — две цифры минут; и — две цифры секунд). Этот макрос можно применять в любом контексте, где строковый литерал допустим или требуется На- пример: char time[] =_TIME_; p1-.nH(,'%s", __TIME__); Поскольку смежные строковые литералы сцепляются, допустимо следующее: printf(">%s<\n”, ” __Т1МЕ__ "—'); time Эта функция определяет текущее календарное время. #indude <time.h> time_t time(*ime_t *timer). Кодирование типа time_t не специфицировано Стандартом язы- ка Си. Возвращаемое значение — это некоторая аппроксимация текущего календарного времени. Если это время отсутствует, возвращаемое значение равно (time_t)(—1). Если timer — не NVLL, возвращаемое значение присваивается также и объекту, на который указывает timer. time components (компоненты времени) (См. broken down time; tm.) time conversion functions (функции преобразования времени) Это объявляемые в time.h функции asctime crime gmtime, locaHime и strftime. time manipulation functions (функции манипуляции временем) Это объявляемые в time.h функции dock, difftime, mktime и time. 188
tm tlme.h Этот объект-заголовок содержит определения нескольких макросов и типов, а также объявления функций, манипулирую- щих информацией о времени. t'me.h содержит определения и объявления идентификаторов, перечисляемых ниже. Имя Назначение ascn'me clock docket CLOCKS_PER_SEC dime difftime Преобразование времени Получение процессорного времени Тип времени Кол-во/сек из dock Преобразование времени Получение разницы двух значений времени gmtime mkfime Преобразование во время UTC (GM1) Формирование времени из компонен- тов NULL size _f strftime null-указатель как константа Тип значения Формирование строки даты и време- ни time fime_t strud tm Получение календарного времени Тип времени Тип календарного времени time_t Этот тип, определяемый в time.h, реализуется в конкретной системе программирования как арифметический тип для пред- ставления времени. Это относится к нововведениям Стандарта языка Си timezone Это нестандартный глобальный long int. используемый для отслеживания ивформапии о временных зонах. T7.OSS Этот нестандартный макрос применяется в функции matherr tm Этот определяемый в time h тип структуры содержит отдельные компоненты календарного времени, совокупность которых изве- стна под названием broken-down time (календарное время, рас- члененное на компоненты). Приводимые ниже члены структуры являются ее неотъемлемыми частями, порядок следования кото- рых произволен. Возможно использование дополнительных чле- нов (элементов структуры), определяемых реализацией системы программирования. struct tm { int tm_sec; секунды после полуночи int tm_min; минуты после часа 189
tm * ini fm_nour; inf tm_mday; inf tm_mon; inf fm. year: int tm_wday; int tm.yday; inf fm_isdst; часы, начиная с полуночи день с начала месяца месяцы, начинал с января годы, начиная с 1900 день недели, начиная с воскресенья \ни, начиная с первого января флаг экономи и дневного времени Здесь tm_isdst > О есть экономия дневного времени fm_isdst = 0 нет экономии дневного времени tm_isdst < О информация отсутствует tm_* (См. tm.) ТМР_МАХ Этот макрос, определяемый в stdio.h, является целочис- ленным константным выражением, предоставляюшим макси- мальное количество уникальных имен файлов, которые могут быть созданы функцией tmpnam. Согласно требованиям Стандар- та языка Си значение ТМ’-_МАХ должно быть не менее, чем 25. tmpfile Эта функция создает временный двоичный (бинарный) файл, удаляемый после его закрытия или нормального заверше- ния выполнения программы #inc,ude <stdio.h> FILE *tmpfile(void); Функция tmpfile открывает файл для обновления (update), как будто бы он открыт посредством функции (open с заданием режима "wb F". Если такой режим не соответствует требуемомч, используйте setvbuf или setbuf, чтобы изменить его. Альтернатив- ным решением является получение уникального имени посред- ством tmpnam и открытия его с помощью fopen. Если временный файл не может быть создан, возвращаемым значением акции tmpfile является NULL; иначе функция воз- вращает указатель на FILE . (См. FOPEN .МАХ ) tmpnam Эта функция создает и возвращает в качестве результата имя файла, при этом гарантируется его уникальность (т. е. это имя не является именем ни одного из существующих файлов). Затем файл с таким именем может быть открыт посредством функции fopen. #indude <stdio.h> char *tmpnam(char *s); Если s — это NULL, функция tmpnam ос.авляет свой результат в собственной области и возвращает указатель на эту область. Последующие обращения к tmpnam могут модифицировать эту область. Если | — не NULL, предполагается, что это указатель на 190
tolower массив по меньшей мере L_tmpnam символов; tmpnam помещает результат в этот массив и возвращает адрес первого символа этого массива. У функции tmpnam нет способа передачи инфор- мации об ошибке; поэтому если Вы зададите s не равным NULL, а область, на которую указывает а, будет меньше чем L_trrpna-n символов, поведение tmpnam не определено. (См. ТМР.МАХ.) to prefix (префикс to) (См. future library directions.) toascli Эта нестандартная функция принимает любое значение типа int н «удерживает» только семь младших битов этого значения, формируя допустимый код ASCII (0-127). #mdude <ctype,h> int toasci>(int c); (Cm. isascii.) token (лексема) Эта базовая единица исходного кода (текста) про- граммы. Согласно Стандарту языка Си различают шесть типов лексем: ключевые слова, идентификаторы, константы, строко- вые литералы, знаки препинания (punctuator) и знаки операций (operator). Лексема может содержать в себе другую лексему Соседние лексемы можно разделять произвольным числом про- белов. Иногда вместо термина «token» используют термин «lexical element» (лексический элемент). token pasting operator (знак операции «склеивание лексем») Этот знак двухместной операции препроцессора (##) относится к нововведениям Стандарта языка Си. Этот знак определен только для макросов, подобных функциям. Данная операция позволяет соединить (concatinate) две препроцессорные лексемы с целью формирования новой препроцессорной лексемы. Например, для макроопределения #de*ine M(value) name ## value макрос M(4) расширяется до лексемы пагзеЛ. Приоритет н ассо- циативность операций препроцессора, задаваемых знаками опе- раций # и ##, не определены. tolower Эта функция, специфика которой определяется «культур- ной средой» (locale), возвращает строчный (lowercase) эквива- лент своего аргумента с, при условии, что аргумент — прописная буква. В противном случае аргумент возвращается, не претерпе- вая изменений. #include <ctype.h> int tolower(int с); В «культурной среде Си» ("С" locale) преобразование пропис- ных символов в строчные выполняется только для тех символов, для которых проверка посредством функции isupper дает значе- ние «истинно». В «культурных средах», отличных от «культур- ной среды Си», отображение (mapping) прописных символов в строчные не обязательно имеет соответствие «один к одному» 191
toupper (one-for-one). Например, прописная буква может быть представ- лена двумя строчными буквами, взятыми вместе, или не исклю- чена ситуация, когда строчный эквивалент не существует. toupper Эта функция, специфика которой определяется «культур- ной средой» (locale), возвращает прописной (uppercase) эквива- лент свое! □ аргумента с при условии, что аргумент — строчная буква. В противном случав аргумент возвращается, не претерпе- вая изменений. #mdude <ctype.h> int tojpper(!nt с); В «культурной среде Си» ("С" locale) преобразование строч- ных символов в прописные выполняется только для тех симво- лов. для которых проверка посредством функции isiower дает значение «истинно». В «культурных средах», отличных от «культурной среды Си», отображение (mapping) строчных символов в прописные не обязательно имеет соответствие «один к одному» (one-for-one). Например, строчная буква мо- жет быть представлена двумя прописными буквами, взятыми вместе, или не исключена ситуация, когда прописной эквива- лент не существует. translation, phases of (фазы трансляции) (См phases of translation.) translation limits (пределы трансляции) (См env;ronmertal limits.) translation unit (единица трансляции) Это набор строк текста про- граммы после обработки исходного файла препроцессором, в результате которой оказывак гея включенными все объекты за- головки (согласно директивам #indude), обработаны все дирек- тивы препроцессорной обработки по условию, расширены все макросы. trigonometric functions (тригонометрические функции) Это объяв- ляемые в math.h функции acos, asin, atan atan2, cos, sin, tan и их эквиваленты, оперирующие данными типа float и long dojb'e. trlgiaph (триграф) Это трехсимвольная последовательность, начи- нающаяся двумя знаками вопроса (??). Она позволяет дать альтернативное представление определенным знакам пункту ации Триграфы были предложены комитетом X3J 1 1 с целью прямого и обратного преобразования текстов на языке Си в форму приемлемую для вычислительных машин, поддержива- ющих набор символов 1SO-646. (В этом наборе отсутствуют некоторые символы, необходимые для написания программ на языке Си | Триграфы обрабатываются на первой фазе транс- ляции. Полный набор триграфов и их значения представлены ниже. 192
trigraph Триграфы Стандарта языка Си Последователь- ность символов Значение ?Л 1 П' - К( [ П) ] ??- — ??/ \ ??< { ??= # ??> } Далее следует текст программы без триграфов #indude <stdio.h> maiin() { static int i[10][20]= «1, 2. 4»; int j; j = ~(i[0][0] I i[0][1] printff'j = %d\n" j); } Эквивалент этой программы с использованием триграфов имеет следующий вид: f?=indude <stdio.h> main () ??< static int i??(10??)??(20??) = 2, int j; j = П-('Я(<»?)И(3??) t?l .E(OJ?)R(1t?) ??' ЭТ(оУ)Й(2?р); prin*f("j = %d??/n”, j); f?> 7 Заказ B77 193
true true (истинно) Одно из двух возможных («истинно» или «ложно») логических значений. В языке Си при проверке «истинности» выражения, ненулевое значение последнего считается «истин- ным», а нулевое значение — «ложным». Проверка условия, подобная той. которая имеет место в команде it (х), эквивалентна проверке вида if (х != 0). Подобные логически проверки могут производиться для адресных выражений (pointer expressions) так же, как и для арифметических выражений, поскольку адрес- ное выражение, имеющее нулевое значение, представляет со- бой null-указатель в форме константы (null pointer constant). По определению, логические выражения и выражения отноше- ния (включая проверку тождественности операндов) имеют зна- чения типа int, причем одно значение равно 0 (ложно), а другое значение равно 1 (истинно). try Это ключевое слово языка программирования Си-Н- не входит в состав средств Стандарта языка Си. Планируя использование исходных текстов программ, написанных на языке Си, в среде Си++, следует избегать применения try в качестве идентифика- тора. type (тип) Это средство описания характеристик значения объекта или того, что возвращает функция как результат своей работы. (См. type, function type, incomplete; type, object.) type, compatible (совместимый тип) Два типа совместимы, если это один и тот же тип. Объявляемые в разных единицах трансляции два типа структуры объединения или перечисляемых данных (enumeration) совместимы, если у них одно и то же число чле- нов, одинаковые имена соответствующих членов и совместимые типы членов для двух (сравниваемых на совместимость) струк- тур должен быть один и тот же порядок следования членов. Для двух структур или объединений соответствующие поля битов должны быть одной и той же длины; для двух типов перечисля- емых данных последние должны иметь одинаковые соответству- ющие значения. Два указателя совместимы по типу, если они имеют идентичные спецификаторы и указывают на совместимые типы. Два типа с модификаторами совместимы, если они являются совместимыми типами с идентичными модификаторами. Два массива совместимы по типу, если совместимы типы их элементов, и в случае задания размеров массивов эти размеры равны Две функции совместимы по типу, если совместимы типы зна- чений, возвращаемых функциями. При наличии списка пара- метров для функций обоих типов, они должны иметь одинаковое число параметров и соответствующие параметры должны быть совместимы по гипу. 194
tvpe incomplete type, composite (составной тип) Составной тип может быть создан из двух совместимых типов. Это тип. совместимый с обоими исходными типами и удовлетворяющий следующим условиям: • Если один тип — это тип мат и на известного размера, состав- ной тип — массив этого размера. • Если только один тип — это тип функции со списком типов параметров (прототип функции), составной тип — это прото- тип функции со списком типов параметров. • Если оба типа — это типы функции со спи-ками типов пара- метров, тип каждого параметра в списке составных типов параметров — это составной тип соответствующих парамет- ров. • Эти правила применяются рекурсивно к типам, из которых эти два типа «произошли». • Для идентификатора с внешними или внутренними связями (external or internal linkage), объявляемого в той же области действия, где дается другое объявление этого идентификатора, тип последнего становится составным. В следующих объявлениях int >[]; inf i[5]; void f(); void f(int); <n* j: char c; short s; составной тип идентификатора i — это «массив из 5 inf», состав- ной тип t — это «функция, требующая один параметр типа int и не возвращающая никакого значения», а составной тип j ? с : s — это «int». type, const-qulifled (тип со спецификатором const) Это тип, включа- ющий в свое определение спецификатор const. type, derived (производный тип) (См. derived гуре.) type, function (тип «функция») Речь идет о типе, описываемом в виде функции. Он включает тип возвращаемого значения, а также информацию о типах параметров списка, если последний присутствует. Например: in* f() int g(void); Тип f — это «функция, возвращающая int и имеющая неизвест- ное число параметров неизвестных типов». Тип g — это «функ- ция, возвращающая int и не имеющая аргументов» type. Incomplete (незавершенный тип) Это тип. описываемый как объект, но содержащий недостаточно информации о размере 195
type, narrow объекта, чтобы его вычислить. В случае int (*p)[J; идентификатор р — это «указатель на массив неизвестного размера». Это тип может быть «завершен» будущим объявлением (declaration или redeclaration) р. Другими примерами незавершенных типов мо- гут служить extern double d[]; и struct tag; Тип void является особым незавершенным типом, поскольку он никогда не может быть завершен. type, narrow (узкий тип) Знаковые (signed) и беззнаковые (unsigned) версии char, short и float часто называются «узкими» типами, поскольку они преобразуются в «широкие» типы в определенных контекстах. (См. conversion, function arguments, UP rule: VP rule.) type, object (тип объекта) Это тип, полностью описывающий значе- ние объекта. (См. type, incomplete.) type, qualified (специфицированный тип) Это тип, включающий спецификаторы const или volatile. (См. type, unqualified.) type, unqualified (неспецифицированный тип) Это тип, не включа- ющий спецификаторы const или volatile. (См. type, qualified.) type, volatile-qualified Это тип. включающий спецификатор volatile. type, wide (широкий тип) (См. conversion, function arguments.) type conversion (преобразование типа) (См. conversion.) type definition (определение типа) Речь идет о создании синонима типа посредством ключевого слова typedef. type qual-fier (спецификатор типа) Стандарт языка Си вводит два спецификатора типа: const и volatile. Они используются при определении только объектов. type specifier (имя типа) Это один из следующих идентификаторов; void char short int long float double signed unsigned имя перечисляемого типа имя tvpedef имя типа структуры или объединения typedef Это ключевое слово используется для создания синонима типа. Примеры: typedef inf counter; typedef struct { double real; 196
UCHAR max double "ag; ) complex; Формально fypedef — это ключевое слово для обозначения клас- са памяти хотя фактически его применение не имеет никакого отношения к классам памяти. typedef name (имя fypedef) Это идентификатор, используемый со- вместно с typedef для определения синонима типа, указываемого после typedef Имена typedef «делят» общее пространство имен с константами перечисляемого типа, именами функций и пере- менных. TZ Эта нестандартная переменная среды (environment variable) может применяться для замещения устанавливаемой по умолча- нию зоны времени, используемой функцией asctime. Эта пере- менная имеет следующий формат: ААА[ -]99[ВВВ] где [] обозначает необязательные части поля представления значе- ния. ААА — это условное обозначение трехбуквенного имени зцеменной зоны (например, PST для Pacific Standard Time — Тихоокеанское Стандартное Время), ВВВ — временная зона эконо- мии дневного времени, а 99 — это условное обозначение разницы в часах между местным временем и GMT (отрицательное значение указывает на расположение зоны к Востоку от Гринвича). tzname Это нестандартный глобальный массив двух указателей на строки, каждая из которых указывает на строки ААА и ВВВ в TZ. Например, в зоне Pacific Standard Time tzran-e[0] = "PST" и tznamefl] = "PDT". tzset Эта нестандартная ф} нкция инициализирует внешние пере- менные timezone и daylight содержимым переменной среды TZ- #include <time h> void tzset(void); u U suffix (суффикс U) (Cm. constant, integer.) u suffix (суффикс u) (Cm. constant, integer.) UCHAR MAX Этот макрос, определяемый в limits.^, задает макси- мальное значение объекта типа unsigned char. Оно должно быть равным по меньшей мере 255 (8 битов). Это относится к ново- введениям Стандарта языка Си. Данный макрос расширяется до целочисленного константного выражения, пригодного к исполь- зованию в директиве #if. 197
UINT .MAX UINT MAX Этот макрос, определяемый в limits.h, задает максималь- ное значение объекта типа unsigned int Оно должно быть равным по меньшей мере 65535 (16 битов). Это относится к нововведе- ниям Стандарта языка Сн. Данный макрос расширяется до целочисленного константного выражения, ьригодн эго к исполь- зованию в директиве ULONG_MAX Этот макрос, определяемый в limits.h, задает макси- мальное значение объекте гипа unsigned long int. Оно должно быть равным по меньшей мере 4294967295 (32 бита). Это относится к нововведениям Стандарта языка Си. Данный макрос расши- ряется до целочисленного константного выражения, пригодного к использованию в директиве #if. unary arithmetic operators (знаки одноместных арифметических опе- раций) Это знаки ~ и !. unary minus operator (знак одноместной операции «минус») Речь идет об использовании знака «минус» в одноместной операции «отрицания» операнда. Операнд должен быть данным арифме- тического типа. Отметим, что в Стандарте языка Си нет такого понятия, как «отрицательная константа». Выражение —32768 состоит из двух лексем: знака «минус» и константы 32768. (Отметим, что для 16-битовой вычислительной машины, исполь- зующей для кодирования отрицательных значений дополнение до двух, т. е. дополнительный код, число —32768 является наи- меньшим отрицательным значением объекта типа int однако константа в действительности хранится как данное типа long int. См. constan*. type of.) Над операндом выполняются обычные ариф- метические преобразования, и результат— это данное, «продви- нутое» по шкале типов (promoted type). Данная одноместная операция ассоциативна справа. unary operator (знак одноместной операции) (См. opera’oi, unary.) unary plus operator (знак одноместной операции «плюс») Знак «плюс», будучи используемым в одноместной операции слева от операнда не влияет на значение последнего. Операнд должен быть данным арифметического типа. Чад операндом выполня- ются обычные арифметические преобразования, и результат — это данное, «продвинутое» (promoted) по шкале битов. Данная операция ассоциативна справа. (Этот знак операции относится к нововведениям Стандарта языка Си.) #undef Эта директива препроцессора используется для удаления макроопределения. Применение #undef к несуществующему макросу не является ошибкой. Директива имеет следующую форму: #undef идентификатор Одной из целей применения этой директивы является удаление макроопределения для того, чтобы обеспечить вызов вместо макроса одноименной функции. Например: Я include <ctype.h> 198
ungetc #undef isalpha int (*fp)(int) = isalpha; Поскольку библиотечные функции, подобные isalpha, могут так- же быть реализованы как макросы, перед тем, как использовать адрес такой фу нкции, нужно удалить соответствующее макро- определение. Если это не выполнить, ком„илятор может выдать сообщение об ошибке, так как при существовании макроса одновременно с функцией почти с уверенностью можно сказать, что будет зарегистрирована ошибка, связанная с невозможно- стью использования указанного адреса. undefined behavior (неопределенное поведение) Ре^ь идет о «пове- дении» программы вследствие ошибочности или нетранспорта- бельногти (непереносимости из одной среды в другую) отдель- ных конструкций или ошибочности дачных; при этом предполагается нерегламентированность этого поведения требо- ваниями Стандарта языка Си. Примерами могут служить пере- дача параметров некорректных типов и использование возвра- щаемого функцией значения при фактическом отсутствии последнего по определению. UNDERFLOW Этот нестандартный макрос используется с функ- цией matnen underscore (знак «подчеркивание») Этот символ можно применять в именах идентификаторов. Некоторые варианты построения идентификаторов с ведущими знаками «подчеркивание» резер- вируются для применения в реализациях системы программи- рования на языке Си, а также для будущих версий Стандарта языка Си. Во и ‘бежание конфликтов с «частными» (private) именами, вводимыми в стандартные объекты заголовки при реализации той или иной системы программирования, никогда не присваивайте идентификаторам имена, начинающиеся со знака «подчеркивание». Некоторые вычислительные среды не содержат этот знак в своих наборах внешних символов. В таких случаях типовым решением является отображение этого знака посредством какого-либо другого символа Знак подчеркивания не яв ляется ни знаком операции, ни знаком пунктуации. ungetc Эта функция «выталкивает» символ с (после преобразования его в unsigned char) обратно во входной поток, на который указы- вает s’ream #mdude <stdio.h> int ungetcfint c, FILE «stream)' Посылаемые обратно символы можно получить (в порядке, об- ратном тому, как они посылаются назад) путем последовательно- го чтения из потока. Если вы вызываете rewind, fseek или fsetpos. любые нечитаемые, «выталкиваемые» обратно символы отбра- сываются. Стандарт языка Си гарантирует возвра~ тол! ко одно- го символа. Если обратно посылается больше символов, чем го количество, которое может быть обработано, возвращаемое фун- 199
union кцией значение указывает на ошибку. При успешном выполне- нии функция ungetc возвращает с, и индикатор признака конца файла для данного потока очищается; в противном случае воз- вращаемым значением является EOF. union (объединение) Объект «объединение» содержит один или несколько членов. Для объединения выделяется область памяти, достаточная для размещения в любой момент времени только одного члена. Размер этой области по меньшей мере равен размеру самого большого члена объединения. Хотя объединение синтаксически похоже на структуру, между ними имеются раз- личия. Объединение определяется посредством ключевого слова un'on. Объединение нельзя отнести ни к скалярам, ни к агрега- тированным (составным) данным. union Это ключевое слово применяется для определения типа объ- екта, именуемого объединением, а также для объявления иден- тификаторов подобного типа. Например: union tag { int i; double d; char *pc; } ul; union tag u2, *pu; На программиста возлагается обязанность следить за тем, какой член объединения размещался последний раз в памяти отведен- ной объединению. Если в эту область было помещено значение, соответствующее одному члену объединения, а предпринимает- ся попытка извлекать значение, соответствующее члену другого типа, результат подобной операции не определен. union initialization (инициализация объединения) До введения Стандарта языка Си объединения не могли иметь инициализа- торы. Стандарт языка Си допускает их применение в формате инициализаторов структуры, т. е. список начальных значений заключается в фигурные скобки при условии, что список состоит из одного выражения, если член объединения не инициализи- руется как элемент агрегатированных данных. Содержимое ини- циализатора интерпретируется в соответствии с первым членом объединения, поскольку только ему может присваиваться значе- ние при инициализации. Поэтому важна роль члена объедине- ния, описываемого первым в определении. Например: un'on { int i; double d; } и = {1.2}; Результатом этой инициализации является присвоение u i цело- численного значения I. Если два члена этого объединения поме- 200
USHRT-MAX нять местами, u.d получит значение 1.2 (число с плавающей точкой). union tag (тег объединения) (См. tag.) Universal T'me Coordinated (UTC — координируемое универсальное время) Это название нового Международного Стандарта для того, что прежде было известно как Greenwich Mean Time (GMT — среднее время по Гринвичу). UNIX operating system (операционная система UNIX ) Это очень популярная и широко эмулируемая многопользовательская мно- гозадачная операционная система, разработанная корпорацией AT&T. (См. POS’X; System V InteHace Definition.) unqualified type (неспецифицированный тип) (См. type, unqualified.) unsigned Это ключевое слово используе гея в качестве префикса данных целочисленного типа без знака. Оно может применяться с любым из следующих ключевых слов: char, short int, int или long int. Оно позволяет выполнять операции «беззнаковой» арифме- тики. Когда unsigned используется без сопутствующего ключевого слова, подразумевается unsigned int. (См. ntegral type.) unsigned int suffix (суффикс unsigned int) (Cm. constant, integer.! unsigned integer types (типы целочисленных данных без знака) Это типы unsigned char, unsigned short, unsigned int и unsigned long. (Cm bit- field, plain int; char, plain.) unsigned preserving rule (правило сохранения представления число- вого значения без знака) Речь идет о правиле, согласно которо- му выражения типа поле битов uns,gned int, unsigi ed char или uisigned short преобразуются в выражения типа unsigned int при «расширении» этих «узких» типов .(narrow types). Это правило широко употреблялось до введения Стандарта языка Си. который теперь требует вместо выполнения указанного правила соблю- дения правила сохранения значения (value preserving rule). (См. convenor, integer type; value preserving rule ) unsigned type conversion (преобразование типа co спецификатором unsigned) (См. convers on, nteger type.) unspecified behavior (неспецифицированное поведение) Речь идет о неведении программы, имеюшей корректную конструкцию и корректные данные, для которых ь Стандарте языка Си не сформулированы требования. Например, не специфицироьан порядок вычисления выражений (за исключением тех, в которых использ/ются знаки операций &&, ||, ? и «запятая»). UP rule (правило UP) (См. unsigned preserving rule.) USHRT MAX Этот макрос, определяемый в limits.h, задает макси- мальное значение объекта типа unsigned short inf. Оно должно быть равным па меньшей мере 65535 Это относится к нововведениям Стандарта языка Си. Данный макрос расширяется до целочис- ленного константного выражения, пригодного к применению в директиве #if 201
usual arithmetic conversion usual arithmetic convers*on (обычное арифметическое преобразова- ние) (См. conversion, usual arithmetic ) va_arg Этот Макрос извлекает следующий параметр типа type из списка параметров функции и возвращает его в качестве значе- ния всего выражения. #mdude <stdarg.h> type va_arg(va_list ap, type); Параметр ар должен быть тем же который передается соответст- вующему макросу va_start. Если параметров больше нет, или ty pe не является типом следующего параметра, результат не опреде- лен. va end Этот макрос выполняет любую необходимую очистку обра- батываемого списка переменного числа параметров # ciude <stdarg.h> void va_end(va_list ар); Парамето ар должен быть тем же, который передается соответст- вующему макросу va.-tart. Вызвав va_end. вы должны вызвать va. start прежде, чем пытаться повторно обрабатывать список параметров; в противном случае поведение макроса не опреде- лено. Макрос va .end должен вызываться из той же ф ункции, откуда вызывался макрос va_star*. va_list Этот тип пригоден для хранения информации, которая необходима определяемым в stdarg.h макросам va_start. va_arg и va_end Он определяется в stdarg.h. va_start С целью подготовки к обработке списка переменного числа параметров, этот макрос инициализирует параметр ар (указатель параметра), используя адрес последнего зафиксированного па- раметра. Параметр parmN является пос? едним из списка зафик- сированных параметров # .de <stdarg.h> void va_sfart(va_list ap, parmN); Макрос va_start должен быть вызван прежде, чем используются va_arg и va_end для заданного списка переменного числа пара- метров. Если с parmN применяется register, или тип parmN — это тип функции или массива, либо это узкий тип, поведение мак- роса не определено validation Аттестация) Речь идет о процессе, при котором компиля- тор, объявляемый соответствующим стандарту', проверяется на 202
visibility of identifiers это соответствие. Этот процесс обычно выполняется аккредито- ванным правительственным агентством, бюро национальных стандартов или признанной в профессиональных кругах орга- низацией. (См Perennia1; Plum Huh.) value preserving rule (правило сохранения значения) Это правило, согласно которому выражения типа поле битов unsigned int, unsigned char или unsigned short преобразуются в выражения типа int (если их значения могут быть представлены); иначе они преобразуются в выражения типа unsigned int, после чего эти «узкие» типы расширяются. Это правило не находило широкого применения до введения Стандарта языка Си, который требует его соблюдения. (См. conversion, integei type; unsigned preserving rule.) varargs.h Это нестандартный вариант и предшественник объекта- заголовка stdarg. h. variable argument list (список с переменным числом параметров) (См. argument list, variable ellipsis...) variable name (имя переменной) Речь идет об имени, используемом для обозначения именуемого объекта Такие имена называют идентификаторами, которые в случае переменных разделяют одно и то же пространство имен с константами перечисляемого типа, функциями и именами fypedef. vertical-tab character (символ вертикальной табуляции) Это один из символов пробела, допустимый к использованию в исходном тексте программы. vertical-tab escape sequence (упр твляющая последовательность «вертикальная табуляция») Вертикальная табуляция может быть представлена управляющей последовательностью \v. vfprintf Эта функция эквивалентна функции fpnntf за исключением того, что список параметров заменен списком с переменным числом параметров (arg), который инициализируется макросом va start (и, возможно, последующими обращениями к va_arg). #indude <stdio.h> int vfprintf(F!LE «stream, const char «format, va_ltsf arg); Значение, возвращаемое функцией vfprintf, — это число передан- ных символов при успешном ее выполнении, и отрицательное число при обнаружении ошибки. Эта функпия относится к нововведениям Стандарта языка Си. (См. stdarg.h.) virtual Это ключевое слово языка Си+-> ие входит в состав средств Стандарта языка Си. Планируя использование и< ходных текстов программ, написанных на языке Си, в среде Си++, следует избегать применения virtual в качестве идентификатора. visibility of identifiers («обозримость» идентификаторов) (См. linkage; scope.) 203
void void Это тип выражения, не имеющего значения. «Результат» типа void имеет место как следствие вызова void-функции или моди- фикации типа выражения посредством void (т. е. использование void в операции приведения типа) Ключевое слово void может также применяться в двух других несвязанных между собой контекстах: в качестве единственной лексемы внутри пр< тотипа функции для обозначения отсутст- вия параметров, а также при задании типа указателя void *. void * type (тип void ») (См. void pointer ) void cast (приведение к типу void) Значение выражения может Сыть «отброшен^» явным образом путем приведения (casting) выра- жения к типу void. Выражение типа void может быть приведено к типу void, хотя это не имеет никакого смысла. Необходимость в явном приведении к типу void возникает редко, поскольку отказ от использования результата выражения автоматически решает эту задачу. Однако имеется одно полезное применение приведе- ния к типу void. Если Вы создаете макрос, являющийся «мимик рией» void-функции, следует явным образом выполнить приве- дение макроопределения к типу void во избежание некорректного применения макроса Например: void swap(int, int); #def‘ne swap(a, t>) {(a) ‘= (b), \ (b) = (a), (void) ((a) = (b))) (Cm. corvers.on, void type.) void expression (void-выражение) Это выражение, неимеющее зна- чения. Оно имеет место в виде результата, возвращаемого void- функцией, или как следствие явного приведения выражения к типу void. void in prototypes (void в прототипах) В протот ипе ключевое слово void может служить двум независимым целям. Рассмотрим сле- дующий пример: void f(void); Первое использование void означает, что функция ( является void-функцией и, будучи таковой, не возврашае~ никакого зна- чения. Второе использование void свидетельствует о том. что функция не нуждается в параметрах. Если второй void опусти-ь объявление функции указывает, что функция ожидает неизвест- ное число параметров, и компилятор не может выполнить соот- ветствующую проверку. void pointer (void-y г азатечь) Стандарт языка Си заимствовал указа- тель этого тгпа из языка программирования Си++ с целью облегчения реализации системы программирования в вычисли- тельных < редах, где не все указатели одного и того же ра »мера и (или) представления (как например, в случае архитекторы ма- шины с минимальной адресуемой единицей памяти в ви„е машинного слова). Другим назначением void-указателя является 204
vsppntf предоставление пользователю указателя настраиваемого (родо- вого) типа. Все стандартные библиотечные процедуры, прежде применявшие char «для подобных указателей, теперь используют void ♦ (например, функции malloc, calloc и memcpy) Операция разыменования (dereferencing) не может быть непосредственно применена к void-указателю; над ним не выполнимы арифмети- ческие операции. void type conversion (преобразование типа void) (См. conversion, void type.) volatile Это ключевое слово используется как спецификатор типа. Оно означает, что объект, к которому оно применено, не является принадлежащим полностью данной программе. Он может быть прочитан или записан асинхронно какой-либо другой програм- мой (или обработчиком прерываний в той же самой программе) или аппаратными средствами, и поэтому желательно, чтобы оптимизатор не устранял различные доступы к этому объекту Ключевое слово volatile относится к нововведениям Стандарта языка Си. Этот специфиг атор типа может быть применен также к объекту, на который указывает volatile-указатель. Рассмотрим следующий 4 рагмент программы: char vnvpnvc; char * volatile vpnvc; volatile char «r.vpvc; volatile char • volatile vpvc; rvonvc — это не имеющий спецификатора volatile указатель на объект типа char без спецификатора volatile, vpnvc — это volal le- указатель на объект типа char без спецификатора volatile nvpvc — это неимеющий спецификатора volatile указатель на объект типа char со спецификатором volatile vpvc — это volatile-y казатель на объект типа char со спецификатором volatile. Объявление, в котором используется спецификатор volahle, мо- жет содержать также и спецификатор const. VP ru’e (правило VP) (См. value preserving rule.) vprintf Эта функция эквивалентна функции pnntf, за исключением того, что список параметров заменен списком с переменным числом параметров (arg), который инициализируется макросом va_start (и, возможно, последующими обращениями к va_arg' #in ckide <stdio.h> int vpnntf(const char «format, vajist arg); Значение, возвращаемое функцией vprintf, — это число передан- ных символов при у спешном ее выполнении, и отрицательное число при обнаружении ошибки Эта функция относится к нововведениям Стандарта языка Си. (См. stda-g.h.) vsprintf Эта функция эквивалентна функции spr nW, за исключи нием того, что список параметров заменен списком с переменным 205
wchar _t числом параметров (arg), который инициализируется макросом va_sfart (и возможно последующими обращениями к va_arg #mdude <stdio.h> int vsprintf(char *s, const char *format, va_list arg); Значение, возвращаемое функцией vsprintf, — это число симво- лов, записанных в строку s (исключая ведомый символ '\0'). или отрицательное число при обнаружении ошибки. Эта функция относится к нововведениям Стандарта языка Си. (См. stdarg.h.) w wchar t Это тип целочисленных данных, диапазон значений кото- рых обеспечивает представление отличающихся друг от друга кодов зсех членов наибольшего расширенного набора символов специфицируемых поддерживаемыми «культурными средами» (locales). Гип wchar_f относится к нововведениям Стандарта язы- ка Си. Он необходим в тех случаях, когда требуются объявления или ссылки на символы расширенной формы (wide characters) и строки символов расширенной формы (wide strings). Тип wchar _t определяется в stddef.h. wcs prefix (префикс wcs) (См. future library directions ) wcstombs Эта функция преобразует последовательность символов расширенной формы, адресуемую у казателем pwcs, в последова- телг яость многобайтовых символов, на которые указывает s. Это относится к нововведениям Стандарта языка Си. #indude <stdlib.h> int wcstombs(char »s, wchar _t *pwcs, siie_t n); wctomb Эта функция определяет число байтов, необходимых для представления многобайтового символа, соответствующего коду, значение которого — wchar. Данная функция также преобразует символ расширенной формы wchar в многобайтовый символ, который хранится по адресу s. Это относится к нововведениям Стандарта языка Си. #indude <stdlib.h> int wctombfchar *s, wdwrj wchar); WG14 Это аббревиатура названия рабочей группы, ответственной за определение par ширенного Стандарта ISO С. (См ANSI С ISO X3J11.) WG21 Это аббревиатура названия рабочей группы, ответственной за определение Стандарта ISO C++. (См. ISO; ХЗЛ6.) 206
widening while Эта команда, конструкция которой определяет циклический процесс, вычисляет значение управляющего выражения перед началом каждой итерации цикла. В этом она подобна команде for и отличается от команды do ... while, выполняющей вычисление управляющего выражения после выполнения очередной итера- ции Цикл конструкции while всегда можно переписать в форме конструкции for и наоборот. Команда while имеет следующую конструкцию: while (выражение) команда где выражение подлежит вычислению и оценке («истинно» или «ложно»). Если это управляющее выражение имеет значение «ложно», тело цикла (команда) не выполняется и управление передается за пределы цикла, иначе (значение «истинно») ко- манда выполняется. Затем процесс повторяется. Описанная кон- струкция эквивалентна следующей конструкции, реализуемой командой for. for (; выражение;) команда где выражение — это полное выражение. white space (пробел) Речь идет об одном или нескольких смежных пробелах, зонах горизонтальной или вертикальной табуляции, прогонах страниц или символах «новая строка» (new-Une char- acters), которые располагаются между лексемами. В любом месте, где может находиться пробел, допустимо размещение текста комментария; последний заменяем одним пробелом. wide character («широкий» символ или символ расширенной фор- мы) [См. character, wide.) wide character constant (символ-константа расширенной формы) (См. constant, character, wide.) wide string literal (строковый лите рал расширенной формы) (См. string literal, w‘de ) wide type (широкий тип) (См. t«pe wide I widening (расширение) Преобразование выражения из более «уз- кого» типа в более «широкий». Например, будучи фактич< скими параметрами при вызове функции выражения типа char и short обычно «продвигаются» по шкале типов (promoted) до int, тип float «продвигается» до double. (Стандарт языка Си допускает сохра- нение типов в исходном виде благодаря должному использова- нию прототипов, хотя это не является требованием, которое нужно соблюдать при реализации системы программирования.) 207
X/Open X X/Open Это консорциум по проблемам аппаратных и программных средств вычислительных систем, занимающийся стандартиза- цией операционных систем, языков программирования и инст- рументальных средств разработки прикладных программ. ХЗН5 Это базирующийся в США комитет, работающий над стан- дартом ANSI для модели параллельной обработки и связывания языков Си и Фортран (См. NCEG.) X3J11 Это базирующийся в США комитет по стандартизации, который установил стандарт ANSI для языка Си. (Каждый коми- тет по стандартизации языков программирования имеет свое числовое обозначение в пределах рабочей группы X3I по языкам программирования, которая является частью Секретариата ХЗ.) (См NCEG; Spirit of С; Standard С; WG14; X3J11.1; X3J16.) X3J11.1 Это рабочая группа внутри X3J11, ответственная за опреде- ление так называемых численных расширений Стандарта языка Си. (См. NCEG.) X3J16 Это базирующийся в США комитет по стандартизации, работающий над стандартом ANSI для языка Си++. (См. ХЗЛ I.) 208
Предметный указатель А Адрес address 13 Аргумент argument 16 — командной строки argument, command line 16 - фактический argument, actual 16 — формальный argu nent, formal 16 — функции function argument 77 Ассоциативность associativity 21 Аттестация valida‘ion 202 Б Библиотека утилит общего назначения general utility library 82 Библиотека функций function library 78 Блок dock 25 Буква letter 108 В Ввод-вывод форматированный formatted I/O 73 Включение исходного файла source file inclusion 164 Возврат из функции function return 79 Воспроизведение монетарной величины currency display 44 Время — календарное, расчлененное на компоненты broken-down time 26 - жизни life 108 - универсальное UTC Universal Time Coordinated 201 Вызов функции function call 77 Выравнивание alignment 14 Выражение expression 61 — void void expression 204 - заключаемое в круглые скобки expression, parenthesized 62 - именующее lvalue 114 - константное или выражение-константа constant expression 39 — «левое» lvalue 152, 114 — модифицируемое именующее lvalue, modifiable 114 - немодифицируемое именующее lvalue, non-modifiable 114 — полное expression, full 61 — «правое» rvalue 152 Вычитание указателей pointer subtraction 137 Г Группировка grouping 84 д Данные составные aggrega'e 14 Двоеточие colon 33 Декларатор declarator 47 - функции function declarator 78 209
Деление целочисленное с отрицательными значениями Деление целочисленное с отрицательными значениями division, integer with negative values 50 Дескриптор файла file descriptor 67 Диапазон значений метки переключателя case ranges 28 Директивы препроцессора preprocessing directives 139 — ппЛ-директива null preprocessing directive # 128 Документы основополагающие base documents 24 E Единица - памяти storage unit 173 - Трансляции translation unit 192 3 Завершение выполнения программы termination, program 187 — аномальное program termination, abnormal 143 — нормальное termination, normal 1В 7 Запятая — знак пунктуации comma punctuator 33 — — операции comma operator 33 Знак — операции operator 130 — — вызова функции function call operator 77 — — «вычисление адреса» address-of opera'or 13 — — «вычисление выражения по условию» conditional operator 36 — — «вычисление остатка» remainder opera*or 149 — — «вычитание» subtraction operator 184 — — двухместной operator, binary 131 — — «деление» division operator 50 — — «дополнение» complement operator 35 — — «индексирование» subscript operator 184 — — косвенной адресации indirection operator 93 — — «логическое И» AND operator logical 15 — — «логическое ИЛИ» OR operator, logical 133 — — «логическое НЕ» logical negation operator 112 — — «не равно» not-equal-to operator 127 — — одноместной operator, unary 131 — — — «минус» minus operator unary 122 — — — «Плюс» plus operator, unary 137 — — отношения — — — «больше» greafer-than ope ator 84 — — — «больше или равно» greater-than-or-equal-operator 84 — — — «меньше» less-than operator 108 — — — «меньше или равно» less-than-or-equal-fo operator 108 — — — «неравенство» inequality operator 93 — — «побитовое И» AND operator, bitwise 15 — — «побитовое ИЛИ» OR operator, bitwise inclusive 133 — — «побитовое исключающее ИЛИ» OR operator, bitwise exclusive 133 — — «приведение типа» cast operator 29 210
Знаки операции «выбор элемента» — — «придание операнду формы строки символов» sfringize operator 17 8 — — «присваивание» assignment operator, simple 20 — — «сдвиг влево» left-shift operator 107 — — «.сдвиг вправо» right-shift operator 151 — - «склеивание лексем» token pasting operator 191 — — «сложение» addition operator 13 — - «стрелка» структур иди объединений structure/union arrow operator 183 — — «стрелка» (->) arrow operator 17 — — «тождество» equality operator 57 — — «точка» dot operator 51 — — «точка» структур или объединений structure/union dot operator 183 — — «увеличение на единицу» increment operator 92 — - «уменьшение на единицу» decrement operator 4 7 — — «умножение» multiplication operator 124 — — составной — — — «вычисление остатка» и «присваивание» remainder assignment operator 149 — - - «вычитание» и «присваивание» subtraction assignment operator 184 — - - «деление» и «присваивание» division assignment operator 50 - - - «побитовое И» и «присваивание» AND assignment operator, bitwise 1 5 - - - «побитовое ИЛИ» и «присваивание» OR assignment operator, bitwise inclusive 132 — — — «побитовое исключающее ИЛИ» и «присваивание» OR assignment operator, bitwise exclusive 132 - — — «присваивание» assignment operator, compound 20 - — - «сдвиг влево» и «присваивание» left-shift assignment operator 107 - - - «сдвиг вправо» и «присваивание» right-shift assignment operator 15 1 — — — «сложение» и «присваивание» addition assignment operator 1 3 — — — «присваивание», устаревший assignment operator, compound, archaic 20 — — — «умножение» и «присваивание» multiplication assignment opera‘or 124 — — трехместной operator, ternary 131 - подчеркивания underscore 199 — препроцессорной обработки preprocessing operator 140 — равенства equal-sign 57 — пунктуации punctuator 33 — — в списке присваивания equals punctuator 57 — — «точка с запятой» semicolon punctuator 155 Знаки операций — арифметических одноместных unary arithmetic operators 198 — «выбор элемента» memoer selection operators 121 211
Знаки операций над бигами — над битами bitwise operators 25 Знаков операций — иерархия согласно приоритету их выполнения operator precedence 131 И Идентификатор identifier 88 — зарезервированный identifier, reserved 88 Иерархия знаков операций согласно приоритету их выполнения ope ator precedence 131 Изменение вскрытое» quiet cnange 145 Имя — typedef typedef name 197 — внешнее external name 62 — внутреннее internal name 96 — объекта-заголовка header, name of 85 — переменной variable name 203 — программы program name 142 — типа type specifier 196 Индикатор — конца строки end-of-line indicator 53 — конца файла end-of-file indicator 53 — ошибок error indicator 59 — позиции в файле file posmon indicator 68 Инициализатор initializer 93 - в форме строкового литерала initializer, string literal 94 Инициализация initialization 93 — объединения union initialization 200 Интернационализация internationalization 96 «Истинно» true 194 К Качество реализации Quality of lmplementat:on 145 Керниган Б. Kermghan В W. 101 Класс памяти class, storage 32 - ключевой, местоположение storage class keyword, position of 172 Код выхода из программы exit code 60 Кодирование, зависящее от состояния stare-dependingencoding 166 Команда statement 166 — else else statement 53 — null null statement 128 — выбора select.on statement 155 — помечаемая labeled statement 104 — составная statement, compound 166 Команда-выражение expression statement 62 Команды — выполнения итераций iteration statemen's 100 — перехода или передачи управления jump statements 100 Комментарий comment 34 Компилятор compiler 35 212
Метка Компиляция по условию conditional compilation 36 Компоненты времени time components 188 Константа constant 37 — «nuW-указатель» null pointer constant 128 — десятичная decmal constant 46 - восьмеричная octal constant 129 — перечисляемого типа const, enumeration 38 - с плавающей точкой constant, floating 38 — — значащая часть significant part, floating constant 162 — самообъявляющаяся manifest constant 118 - символическая symbolic constant 185 - символьная constant, character 38 - символьная расширенной формы constant, character, wide 38 — целочисленная integer constant 95 - шестнадцатеричная hexadecimal constant 86 — целого типа constant, integer 39 Конфликты с идентификатором языка Си-H- identifier conflicts with CH 88 Косвенность indirection 92 Кросс-компиляция cross-compilation 43 «Культурная среда» locale 110 — языка Си «С* locale 27 Куча heap 86 Л Лексема token 191 — препроцессорная preprocessing token 140 Литерал строковый string literal 177 - расширенной формы string literal, wide 177 «Ложно» false 63 Локальный local 11 0 м Макрос - «надежный» macro, safe 117 — «ненадежный» macro, unsafe 117 — подобный объекту macro, object-like 116 — подобный функции macro, function-like 115 - макрос предопределенный или встроенный macro, predefined 1 16 — «признак конца файла» end-of-file macro 53 Макросы В» значение Е» value macros 52 — значений для errno errno value macros 58 Макроподстановка macro replacement 117 Маска редактирования edit mask 52 Массив array 17 — нулевого размера array, zero-sized 17 Машина абстрактная abstract machine 12 Местоположение ключевого класса памяти storage class keyword. position o< 172 Метка label 103 213
Знаки операций над битами — case команды switch switch case label 185 - default команды switch switch default label 185 - выбора в команде switch case label 28 — переключателя формата case label, case 103 — переключателя формата default label, default 104 Многоточие ellipsis 52 H Набор инвариантных кодов ISO 646 ISO 646 Invariant Code Set 98 О Ограничение constraint 39 Ограничения возможностей среды environmental limits 55 Область действия scope 153 — блок scope, block 154 — идентификатора identifier scope 89 — прототип scope, prototype 154 — файл scope, file 154 — функция scope, function 154 Обозначение функции function designator 78 Обработчик сигнала signal handler 161 «Обозримость» идентификаторов visibility of identifiers 203 Объединение union 200 Объект object 128 Объект-заголовок header 84 — даты и времени date and time header 45 — диагностики diagnostics header 49 — нелокальных переходов nonlocal jumps header 127 — манипулирующий символами character handling header 31 — стандартный header, standard 85 Объявитель declarator 47 — указателя pointer declarator 137 Объявление declaration 4 6 Ограничения — на представление числовых данных limits, numerical 108 — среды limits, environmental 108 — трансляции limits, translation 108 Операнд operand 130 Операции — над символами character handling 31 — co строками символов string handling 177 Операция приведения типа casting 29 Определение definition 48 — внешнего объекта external object definition 63 — внешнее external definition 62 — значения evaluation 59 — уточняемое definition, tentative 48 — интерфейса Системы 5 System V Interface Definition 1 86 Очередность выполнения операций precedence Ошибка выхода за пределы области определения error, domain 58 214
Пределы трансляции п Параметр argument 16 - в виде списка типов parameter type list 134 — командной строки argument, command line 16 — «Многоточие» parameter, ellipse 134 — фактический argument, actual 16 — функции function parameter 7 9 Параметры — массива array parameters 80 — программы program parameters 142 Перевод страницы form-feed 7 3 Переменные среды environment variables 55 Переносимость или мобильность программ portability 138 Переопределение макроса redefinition of macro 149 Переопределения адекватные benign redefinition 24 Перспективы future directions 79 — развития библиотек функций future library directions 8 I — развития языка программирования future language directions 80 I [сведение — неопределенное undefined behavior 199 — неспецифицированное unspecified behavior 201 — программы, определяемое реализацией системы implementation- defined behavor 90 — согласно специфике «культурной среды» locale-specific behavior 111 Позиция активная active position 13 Поле field 66 — битов bit-field 25 — битов типа int без модификаторов типа bit-field, plain in* 25 Порядок вычислений order of evaluation 133 Поток stream 175 — без буферизации stream, unbuffered 176 - бинарный или двоичный stream, binary 17 5 - буферизуемый полностью fully buffered stream 7 7 — ввода стандартный stream, standard input 175 — вывода стандартный stream, standard output 175 — ошибок стандартный stream, standard error 175 — с буферизацией строки stream, line buttered 175 — с полной буферизацией stream, fully buffered 175 — текстовый text stream 188 Потоки стандартные standard streams 166 Правило - UP UP rule 201 - VP VP rule 205 — «как если бы» «as if» rule 18 — сохранения значения value preserving rule 203 — сохранения представления числового значения без знака unsigned preserving rule 201 Пределы — трансляции translation limits 192 215
Пределы реализации системы — реализации системы implementation limits 90 — числовых значении numerical limits 128 Преобразование conversion 40 — данных типа void conversion, void type 42 — данных целого типа conversion, integer type 41 — массива conversion, array 40 — неявное implicit conversion 91 — обычные арифметические conversion, usual arithmetic 41 — параметров функций conversion, function arguments 40 — представления символа с учетом регистра case conversion 28 — типа — — double double type conversion 52 — — signed char signed char type conversion 162 — — void void type conversion 205 — — неявное conversion, implicit 41 — — co спецификатором unsigned unsigned type conversion 201 — — указателя pointer type conversion 138 — — функции function type conversion 7 9 — — явное conversion, explicit 40 — типовые арифметические arithmetic conversions, usual 17 — указателя conversion, pointer 41 — функции conversion, function 40 Препроцессор preprocessor 140 Прерывание interrupt 96 Префикс — is is prefix 96 — L L prefix 103 — mem mem prefix 120 — str str prefix 173 — to to prefix 191 — wcs wcs prefix 206 Приведение к типу void void cast 204 Присваивание assignment 19 Пробел white space 207 Программа program 142 — адекватная program conforming 142 — полностью удовлетворяющая требованиям Стандарта языка Си strictly conforming program 177 — пуска program startup 142 — соответствующая требованиям Стандарта языка Си conforming program 37 — строго адекватная program, strictly conforming 142 Продвижение — параметра по шкале типов, выполняемое по умолчанию argument promotion, default 1 7 — по шкале целочисленных типов promotions, integral 143 Продолжительность хранения storage duration 172 — автоматическая storage duration, automatic 172 — данных типа auto automatic storage duration 23 — статическая storage duration, static 173 Пространство имен name space 125 216
Спецификатор преобразования — идентификаторов identifier name space 89 — членов структур или объединений st-ucture/union member name space 183 Прототип prototype 143 - функции function prototype 79 Пунктуация в деклараторах declarator, punctuation in 4 7 P Разыменование или снятие косвенности dereference 49 Расширение widening 207 Расширения общепринятые common extensions 34 Рекурсия recursion 148 С Связь - между идентификаторами linkage 109 - между идентификаторами внешняя linkage, externa! 110 Сигнал signal handler 161 Символ character 31 — null null character 128 - вертикальной табуляции vertical-tab character 203 — возвращаемый в поток character, pushback 31 — горизонтальной табуляции horizontal-tab character 87 — «новая строка» new-line character 127 — многобайтовый cha-acter, mulfibyfe 31 — «широкий» или символ расширенной формы wide character 207 — управляющий control character 40 Символы переназначения redirection characters 149 Система - операционная UNIX UNIX operating system 201 — программирования адекватная implementation, conforming 90 — программирования на Си implementation 90 Скаляр scalar 152 Скобки - круглые как знак препинания parentheses punctuator 134 — фигурные braces 26 Слово ключевое keyword 102 Совместимость присваивания assignment compatibility 20 Совмещение имен aliasing 14 Создание файла file creation 67 Сообщение диагностическое diagnostic message 49 Сообщения предупреждающие общепринятые common warnings 34 Состояние - исключительное exception 60 — сдвига shift state 158 — сдвига начальное shift state, initial 1 58 Спецификатор — типа type qualifier 196 — преобразования conversion specifier 42 217
Спецификаторы Спецификаторы — классов памяти storage-class specifiers 80 — объявлений declaration specifiers 46 Список — замещений макроса replacement list, macro 150 — идентификаторов identifier list 89 — параметров argument list 1 6 — переменных среды environment list 55 — с переменным числом параметров argument list, variable 1 6 Среда — выполнения программ под управлением главной программы environment, hosted 55 — окружающая environment 54 — стоящих «особняком» программ environment, freestandmg 54 Стандарт представления валюты и фондов ISO 4217 ISO 4217 Currency and Funds Representation 98 Стандарт языка Си C Standard 27 Стандарты арифметики с плавающей точкой американского инс- титута инженеров по электронике и радиоэлектронике IEEE Floanng-Point Arithmetic Standards 89 Стек stack 166 Степень соответствия compliance 35 Строка string 177 — исходного текста логическая logical source line 113 — исходного текста физическая line, physical 109 — командная command line 33 — логическая line, logical 109 — многобайтовых символов mul’ibyte string 123 Структура structure 183 Суффикс - F F suffix 63 — If suffix 63 — L L suffix 103 - 1 I suffix 103 - U U suffix 197 — uu suffix 197 — unsigned int unsigned int suffix 201 — указания типа long double long double suffix 113 — указания типа long int long int suffix 113 — целочисленного типа integer suffix 95 Суффиксы - 1 и L для типа «плавающая точка» floating suffix, I or L 69 — I и F для типа «плавающая точка» floating suffix, f or F 69 T Ter tag 186 — объединения union tag 201 — типа enum enumeration tag 54 - структуры structure tag 183 Тип type 194 — char без модификаторов типа char, plain 30 218
Управляющая последовательность — void в прототипах void in prototypes 204 — void • void • type 204 — арифметический arithmetic type 17 — незавершенный type, incomplete 195 - неспецифицированный type, unqualified 19b — идентификатора identifier type 89 — констант constant, type of 39 — объекта type, object 196 — определение type definition 196 — «плавающая точка» floating type 69 — перечисляемый enumerated type 54 — производный type, derived 195 — с модификатором const const-qualified type 37 — co спецификатором const type, const-qualified 195 — совместимый type, compatible 194 — составной type, composite 195 — специфицированный type, qualified 196 — узкий type, narrow 196 — «функция» type, function 195 — целочисленный integ-al type 95 - широкий type, wide 196 — элемента element type 52 Типы — целочисленных данных без знака unsigned integer types 201 - целочисленных данных co знаком signed integer types 162 Тождество equality 57 Точка — десятичная decimal point 46 — отделения целой части числа от дробной radix poin* i 47 — следования sequence point 155 Триграф trigraph 192 У Указатель pointer 137 — null pointer, null 137 — null константа constant, null pointer 39 — void void pointer 204 — на функцию poin*er to function 138 — файла file pointer 68 Управляющая последовательность escape sequence 59 — «вертикальная табуляция» vertical-fab escape sequence 203 — «возврат каретки» carriage-return escape sequence 28 — «возврат на один символ» backspace escape sequence 2 4 — «восклицательный знак» question mark escape sequence 145 — «горизонтальная табуляция» horizontal-tab escape sequence 87 — «двойная кавычка» double quote escape sequence 52 — «наклонная черта влево» backslash escape sequence 23 — «новая строка» new-line escape sequence 1 27 — «одиночная кавычка» single quote escajae sequence 163 — «перевод страницы» form-feed escape sequence 73 — «подача сигнала предупреждения» alert escape sequence 14 219
Знаки операций над битами «символ в восьмеричной форме» octal escape sequence 129 «символ в шестнадцатеричной форме» hexadecimal escape Управляющие последовательности символьные character escape sequences ВО Утилиты общего назначения general utilities 82,170 Условия возникновения ошибок error conditions 59 Фазы трансляции phases of translation 1 35 Файл file 66 — имя file name 67 — индикатор конца end-of-file indicator 5 3 — индикатор позиции file position indicator 68 — исходный file, source 67 — дескриптор file descriptor 67 — область действия scope, file 154 — открытие file opening 67 — создание file creation 67 — указатель file pointer 68 Файла исходного включение source file inclusion 164 Функции — аргумент function arguments 77 - арифметики целых чисел integer arithmetic functions 95 — ближайшего целого nearest integer functions 1 27 — ввода/вывода символов character I/O functions 31 — выполнения операций с файлами file operation functions 68 — вычисления абсолютного значения absolute functions 1 2 — вычислительной среды environment functions 55 — гиперболические hyperbolic functions 88 — доступа к файлу file access functions 67 — конкатенации или сцепления строк concatenation functions 36 — копирования copying functions 42 — логарифмические и экспоненциальные logarithmic and exponential functions 112 — манипуляции временем time manipulation functions 188 — многобайтовых строк multibyte string functions 124 — обработки ошибок error handling functions 59 — позиционирования файла file positioning functions 68 — поиска search functions 155 - преобразования времени time conversion functions 1 88 — преобразования строк string conversion functions 177 — псевдослучайных последовательностей pseudo-random sequence functions 14 3 — сравнения comparison functions 35 — степенные power functions 139 — тестирования символов character testing functions 32 — тригонометрические trigonometric functions 192 — управления памятью memory management functions 122 — экспоненциальные и логарифмические exponential and logarithmic functions 61 220
Язык программирования C+ + Функция function 77 - возврат из function return 79 _ восстановления среды вызова restore calling environment function - вызов function call 77 - вычисления остатка remainder function 149 - определение function definition 78 - область действия scope, function 154 - обозначение function designator 78 - объявление function declarators 78,80 — объявление явное implicit function declaration 91 - параметр function parameter 79 - преобразование conversion, function 40 - преобразование типа function type conversion 79 — прототип function prototype 79 — указательна pointer to function 138 - сортировки sort function 164 - сохранения среды вызова save calling environment function 152 X Характеристики среды environmental considerations 55 4 Черта влево наклонная backslash 23 - с последующим переходом к новой строке backslash/new-line sequence 24 Член (элемент) member 120 «Чувствительность» к состоянию регистра case sensitivity 28 ш Шаблон template 187 э Элемент лексический lexical element 108 Эффекты побочные side effects 1 58 Я Язык программирования Cu+-t- C++ programming language 27 221
mcrRan Powgr Convert Балтийская Торговая Компания Сетевое оборудование jAzcnet, St het net Источники бесперебойного питания Лазерные, струйные, матричные принтеры ЛЛоделлы и сракс-ллоделлы 2400-19200 bps Л^ллериканское качество компьютеров Копировальная техника HEWLETT {УВММЙМЛ] _____ - - - Ki iiu /il n л л nr, МЯмЯбкдо*Г EPSON PACKARD
ОЯ Издательство «Питер! представляет книгу R С. Б^гуниргкий MS-DOS Ь.1 Новые вазможкостм Прошло совсем немного времени с момента появления на рынке операционной системы MS-DOS 6, а корпора- ция Microsoft уже выпустила ей «вдогонку» новую вер- сию — MS-DOS 6.2. Эта версия упрощает и ускоряет работу пользователя, повышает ее безопасность, занима- ет меньше оперативной памяти, содержит новые утилиты и ред усовершенствованных команд. Однако без подроб- ного практического руководства достаточно сложно вос- пользоваться всеми возможностями, которые предостав- ляет MS-DOS 6.2. Новая работа Б. С. Богумирского является существенно переработанным и дополненным вариантом его книги по шестой версии MS-DOS (появившейся в феврале 1994 г. и практически мгновенно проданной). Книга «MS-DOS 6.2. Новые возможности для пользова- теля» отличается глубокой систематизацией материала и полнотой изложения. Кроме подробнейшего описания команд и утилит MS-DOS 6.2, рассмотрены недокумен- тированные возможности и погрешности в работе сис- темы, действия в нештатных ситуациях, дано множество конкретных советов. Особое внимание уделено отличиям MS-DOS 6.2 от предыдущих версий. В книгу включено большое количество примеров и иллюстраций. Срок выхода — май 1994 г. Объем — 480 стр. Издательство «Питер» Телефон в С.-Петербурге: (812)-235-37-49 тел./факс: (812)-230-25-9б
Рекг Жешке ТОЛКОВЫЙ СЛОВАРЬ СТАНДАРТА ЯЗЫКА СИ Эта книга является своеобразным лоцманом в море имен и терминов, используемых при работе на языке Си. Словарь включает описание двух версий стандарта языка Си: американской (ANSI С) и междуна- родной (ISO С). Входящие в словарь термины ор- ганизованы в алфавитном порядке и поясняются конкретными примера- ми программ. Имеется обширная система перекрестных ссылок меж- ду терминами, а также указатель их русскоязычных аналогов. Автор словари Рекс Жешке — международно признанный эксперт по языку Си. Он является основате- лем и редактором журнала «The Journal of С Languadge Translation», автором целого ряда книг по языку Си, которые Широко известны в США и Европе под общим названи- ем «Си-библиотека Рекса Жешке». СОЛИТЕР