Лжехани Н. Программирование на языке Си: Пер. с англ. - М.: Радио и связь, 1988. - 272 с.: ил. ISBN 5-256-00152-3. Книга американского автора написана специально для программистов, хорошо владеющих одним из процедурных языков программирования, таких как Паскаль, ГШ/1, Алгол 60, Симула 67, Алгол 68, Фортран или Ада. Особое внимание уделено наиболее сложным средствам языка Си. Рассмотрены стиль и дисциплина программирования, абстрагирование данных, препроцессор, инструментальные средства, применяемые при программировании на языке Си, параллельное программирование, операционная система UNIX. Приведено большое число примеров, взятых из реальных программ, В книгу включено приложение с ожидаемыми изменениями языка Си, обусловленными подготовкой стандарта языка. Для широкого круга программистов. ПРЕДИСЛОВИЕ
Язык программирования Си был разработан и реализован в 1972 году сотрудником фирмы AT&T Bell Laboratories Деннисом Ритчи. Хотя язык Си появился относительно недавно, популярность его росла очень быстро, и в настоящее время компиляторы этого языка созданы для многих машин, а список компиляторов продолжает быстро увеличиваться [31,70]. Растущая популярность языка Си обусловлена следующими двумя важными причинами. Во-первых, язык Си очень гибок: относительно просто его можно использовать в различных областях приложений. Во-вторых, большая часть программного обеспечения популярной операционной системы (ОС) UNIX написана на языке Си, который является основным языком программирования в этой системе.
Развитие языка Си продолжалось и после окончания его разработки и касалось, в частности, проверки типов данных и средств, облегчающих перенос программ в другую среду. Например, разработка проекта переноса ОС UNIX на компьютер Interdata 8/32 привела к некоторым добавлениям в язык Си, а именно, к включению в язык таких средств, как объединение (union), явное преобразование типа (cast) и определение типа (type definition) [6]. Позднее были сделаны попытки включения в язык Си средств абстрагирования данных [82]; в современной версии языка для абстрагирования данных имеются лишь ограниченные возможности. В настоящее время рассматривается проект стандарта ANSI языка Си; возможно, что процесс стандартизации приведет к дальнейшим изменениям языка Си, соответствующие предложения находятся сейчас на рассмотрении. Принятие стандарта ANSI языка Си намечено на конец 1985 года.1 В качестве основы этой книги можно было бы выбрать предварительную версию стандарта ANSI языка Си. Однако такое решение не было принято, так как прежде чем версия ANSI языка Си станет стандартом, в нее, вероятно, будут внесены многочисленные изменения; кроме того, в настоящее время нет компиляторов, реализующих эту версию. В этой книге за основу взята версия языка Си, описанная в книге [77], являющейся последним вариантом этого справочного руководства по языку Си. Ожидаемые отличия излагаемой здесь версии языка Си от предварительной версии ANSI приведены в приложении В.
Язык Си предоставляет программисту большую свободу. Эта свобода - источник большой выразительности и один из главных источников силы языка Си, делающих его эффективным, универсальным и простым в использовании для различных областей применения. Однако бесконтрольное использование этой свободы может привести к ошибкам, поэтому в этой книге [редполагается, без потери общности, использование языка Си, юнованное на определенной дисциплине программирования. Например, рассматривается ограниченный вариант оператора witch, для которого коды, соответствующие различным альтер-щтивам, не перекрываются. Хотя в некоторых случаях с успехом могут быть использованы и перекрывающиеся коды аль-гернатив, такие коды трудны для понимания, модификации и юпровождения и являются потенциальным источником оши-юк. Точно так же во всех иллюстративных программах книги зсе переменные инициализируются явно, не полагаясь на инициализацию по умолчанию, которая выполняется только для юдмножества переменных.
Не существует компиляторов языка Си, которые проверяли эы все правила использования языка, предлагаемые в книге, и предупреждали бы о нарушениях дисциплины программирования. Однако многие такие нарушения обнаруживаются с помощью программы lint [3,4]; программисту настоятельно рекомендуется использовать программу lint для проверки программ перед их компиляцией и выполнением.
Язык Си является развивающимся языком - его возможности расширяются для удовлетворения осознанных потребностей, устраняются также его недостатки. С целью обеспечения совместимости с ранними версиями языка в нем сохранены некоторые устаревшие средства. Следовательно, некоторые средства в языке Си избыточны или малоупотребительны. За исключением особых случаев эти средства в книге не рассматриваются.
Эта книга специально предназначена для читателей с хорошим знанием по крайней мере одного из процедурных языков, например языка Паскаль, ПЛ/1, Алгол 60, Симула 67, Алгол 68, Фортран или Ада. В книге основное внимание уделено таким средствам языка Си, как описание типа данных, абстрагирование данных, особые ситуации, параллельное программирование, препроцессор языка Си и инструментальные средства, разработанные для использования совместно с программами на языке
Си.
Некоторые из перечисленных средств языка Си требуют поддержки со стороны операционной системы, например ОС UNIX. Следовательно, возможность их использования может зависеть от конкретной операционной системы. При обсуждении системно-зависимых средств языка будет предполагаться, что программист разрабатывает программы на языке Си в ОС UNIX, поэтому будут также обсуждаться разнообразные возможности и инструментальные средства, доступные при программировании на языке Си в системе UNIX.
В этой книге приведено много примеров. Эти примеры принадлежат широкому спектру областей приложений, включая интерактивное программирование, системное программирова-
ние, приложения баз данных, обработку текстов и параллельное программирование. Все примеры прошли тестирование.1 Многие из них взяты из реальных программ. Каждая глава заканчивается списком вопросов, дополняющих материал, представленный в этой главе,
В конце книги приведен список статей и книг по языку Си и
смежным темам.
Для фрагментов программ на языке Си в книге используется шрифт со знаками одинаковой ширины ("машинописный"), например return; а для выделения формальных операций и синтаксических терминов - курсив, например стратегия разделяй и властвуй, печать сообщения об ошибке. Использование знаков постоянной ширины для фрагментов программ на языке Си согласуется со "стилем Си" [55].
Я благодарен фирме Bell Laboratories не только за предоставленную мне возможность написать эту книгу, но и за возможность более глубоко изучить язык Си. Я изучал язык Си, будучи сотрудником фирмы, а работа над книгой способствовала значительному углублению моего понимания языков программирования.
Я должен поблагодарить многих моих друзей за помошь при написании этой книги. Мне помогли А.В. Ахо, Р.Б. Аллен, М. Бьянки, Р.Л. Дрекслер, Дж. Фаррел, Дж.П. Фишберн, Д. Гей, Б.У. Керниган, Д. Линдерман, К. Маклоклин, Д.А. Новитц, УЛ. Рум, Л. Розлер, Б. Смит-Томас, Т.Г. Шимански и К.С. Уэде-релл. Боб Аллен прочел два варианта рукописи. Лэрри Розлер сообщил мне о предложениях по изменению языка Си, сделанных в процессе разработки для него стандарта ANSI.
Н. Джехани

Оглавление
Предисловие............................................................................................................5
Глава 1. Введение и основные понятия...............................................8
1.1 Пример программы на языке Си.....................................................8
1.1.1 Компиляция и выполнение программы калькулятора в системе UNIX........................................................14
1.2. Основные понятия..............................................................................16
1.2.1. Алфавит.........................................................................................16
1.2.2. Идентификаторы.......................................................................16
1.2.3. Литералы.......................................................................................17
1.2.4. Комментарии................................................................................20
1.2.5. Точка с запятой - признак конца
оператора...................................................................................................20
1.3. Константы..............................................................................................20
1.4. Задачи.......................................................................................................21
Глава 2. Типы и переменные....................................................................22
2.1. Основные типы.....................................................................................23
2.1.1. Знаки................................................................................................23
2.1.2. Целые...............................................................................................23
2.1.3. Перечисляемые типы..............................................................24
2.1.4. Булевы, или логические значения....................................26
2.1.5. Плавающая точка......................................................................27
2.1.6. Тип void (пустой)........................................................................27
2.2. Производные типы.............................................................................28
2.2.1. Массивы..........................................................................................28
2.2.2. Структуры......................................................................................29
2.2.3. Объединения................................................................................34
2.2.4. Переменные структуры............................................................35
2.2.5. Указатели......................................................................................38
2.3. Описания типа.......................................................................................45
2.4. Определения и описания.................................................................46
2.4.1. Классы памяти............................................................................46
2.4.2. Типы данных................................................................................49
2.4.3. Описатели......................................................................................49
2.4.4. Примеры определений и описаний объектов...............50
2.4.5. Инициализаторы.......................................................................52
2.4.6. Комментарии к синтаксису
описаний и определений....................................................................53
2.4.7. Примеры, иллюстрирующие
использование эквивалентностей.................................................55
2.4.8. Использование оператора typedef для упрощения понимания описаний
и определений.........................................................................................56
2.4.9. Заключительные замечания
об описаниях и определениях.........................................................57
2.4.10. Эквивалентность типов........................................................57
2.5. Преобразования типов......................................................................58
2.5.1. Неявное преобразование типа.............................................58
2.5.2. Арифметические преобразования......................................59
2.5.3. Явные преобразования типов..............................................60
2.6. Задачи.......................................................................................................61
Глава 3. Операторы и выражения.........................................................63
3.1. Операторы...............................................................................................63
3.1.1. Операторы вызова функции,
индексирования и выбора................................................................63
3.1.2. Унарные операторы................................ .................................64
3.1.3. Мультипликативные операторы........................................66
3.1.4. Аддитивные операторы..........................................................67
3.1.5. Операторы сдвига......................................................................68
3.1.6. Операторы отношения.............................................................69
3.1.7. Операторы равенства и
неравенства..............................................................................................69
3.1.8. Оператор поразрядное и..........................................................70
3.1.9. Оператор поразрядное
исключающее или......................................................................................70
3.1.10. Оператор поразрядное
включающее или.......................................................................................71
3.1.11. Логический (условный)
оператор и..................................................................................................71
3.1.12. Логический (условный)
оператор или.............................................................................................71
3.1.13. Условный оператор.................................................................72
3.1.14. Операторы присваивания.....................................................73
3.1.15. Оператор запятая....................................................................75
3.1.16. Таблица приоритетов и
порядка выполнения операторов..................................................76
3.2. Выражения..............................................................................................77
3.2.1. Постоянные выражения.........................................................77
3.3. Задачи.......................................................................................................78
Глава 4. Операторы управления............................................................79
4.1. Выражения и операторы...................................................................79
4.2. Пустой оператор...................................................................................79
4.3. Составной оператор............................................................................80
4.4. Оператор присваивания....................................................................80
4.5. Оператор if................................................................................................81
4.6. Оператор switch.......................................................................................83
4.7. Циклы........................................................................................................85
4.7.1. Цикл while........................................................................................85
4.7.2. Цикл for............................................................................................85
4.7.3. Цикл do............................................................................................86
4.4.8. Оператор break..............................................................................87
4.9. Оператор continue..................................................................................87
4.10. Оператор вызова функции...........................................................88
4.11. Оператор return......................................................................................88
4.12. Оператор goto.........................................................................................88
4.13. Метки операторов..............................................................................89
4.14. Задачи.....................................................................................................89
Глава 5. Функции и завершенные программы..............................90
5.1. Функции....................................................................................................90
5.1.1. Описания параметров...............................................................92
5.1.2. Управление видимостью функций...................................92
5.1.3. Вызов функций...........................................................................93
5.1.4. Обращение к функции до
ее определений........................................................................................94
5.1.5. Пример, иллюстрирующий
передачу параметров............................................................................96
5.1.6. Автоматические преобразования
фактических параметров...................................................................97
5.1.7. Передача функций в
качестве параметров............................................................................98
5.1.8. Спецификации функции.........................................................99
5.2. Лексическая область действия
идентификаторов.......................................................................................100
5.3. Ввод и вывод........................................................................................101
5.3.1. Использование потоков,
определяемых программистом.....................................................104
5.4. Переназначение ввода и вывода
(в системе UNIX).......................................................................................105
5.5. Головные программы......................................................................107
5.6. Примеры.................................................................................................109
5.6.1. Удаление последовательностей знаков форматирования из текста
программы на языке Ада...............................................................109
5.6.2. Получение изображения бланка
из табличного описания.................................................................113
5.6.3. Улучшение изображения
документа на терминале НР2621.................................................114
5.6.4. Функция sine вычисления
значения синуса...................................................................................116
5.6.5. Метод наименьших квадратов
для построения кривой [32]............................................................117
5.6.6. Быстрая сортировка................................................................120
5.6.7. Управление скоростью автомобиля...............................123
5.6.8. Передача функций в качестве
параметров.............................................................................................126
5.6.9. Поиск в массиве.........................................................................128
5.7. Задачи.....................................................................................................130
Глава 6. Раздельная компиляция и
абстрагирование данных..........................................................................132
6.1. Область действия внешних
определений и описаний........................................................................133
6.2. Раздельная компиляция...............................................................134
6.3. Абстрактные типы данных и
сокрытие информации.............................................................................135
6.3.1. Стек - пример абстрактного
типа данных...........................................................................................135
6.3.2. Ограниченность файлов как
средств абстрагирования данных...............................................138
6.4. Классы....................................................................................................138
6.4.1. Констракторы, дестракторы
и расширение операторов и функций
в языке Си + +.......................................................................................142
6.4.2. Заключительные замечания
о классах...................................................................................................143
6.5. Примеры................................................................................................143
6.5.1. Таблица символов....................................................................143
6.5.2. Функции для обработки списков.....................................146
6.5.3. Класс buffer.................................................................................149
6.6. Задачи.....................................................................................................151
Глава 7. Особые ситуации.......................................................................152
7.1. Различные сигналы.........................................................................154
7.2. Установка режима обработки
особых ситуаций.........................................................................................155
7.2.1. Пример использования сигналов
для обработки ошибок при выполнении
операций с плавающей точкой.....................................................157
7.3. Генерация и посылка сигналов...................................................160
7.4. Примеры.................................................................................................160
7.4.1. Программа калькулятора с
обработкой особых ситуаций (вариант 1)...............................160
7.4.2. Программа калькулятора с
обработкой особых ситуаций (вариант 2)...............................162
7.4.3. Программа калькулятора с
обработкой особых ситуаций (вариант 3)...............................165
7.5. Задачи.....................................................................................................167
Глава 8. Параллельное программирование...................................168
8.1. Параллельное программирование на
языке Си в операционной системе UNIX......................................169
8.2. Создание процесса с помощью
библиотечной функции fork.................................................................170
8.3. Библиотечная функция excel для перекрывающихся процессов...............................................................171
8.4. Каналы - синхронные средства связи.....................................172
8.4.1. Установка канала.....................................................................173
8.4.2. Переназначение стандартного
ввода-вывода........................................................................................174
8.5. Примеры................................................................................................176
8.5.1. Асинхронное, или параллельное,
копирование файла.............................................................................177
8.5.2. Подсчет неформатирующих
знаков в файле.....................................................................................179
8.6. Задачи.....................................................................................................183
Глава 9. Препроцессор языка Си.........................................................183
9.1. Макроопределения и макровызовы.......;..................................184
9.1.1. Макровызовы............................................................................184
9.1.2. Простые макроопределения................................................184
9.1.3. Параметризованные
макроопределения...............................................................................18
9.1.4. Определение констант...........................................................186
9.1.5. Оперативная генерация кода.............................................187
, 9.1.6. Удаление макроопределений..............................................188
9.2. Включение файлов в программу................................................188
93. Условная компиляция....................................................................189
9.4. Заключительные замечания.......................................................192
95 Пример использования препроцессора....................................192
9.6. Задачи.....................................................................................................193
Глава 10. Последний пример..................................................................195
*.' 10.1. Получение информации из базы данных............................195
Г 10.1.1. Стратегия разработки базы данных...........................196
I., 10.1.2. Функции базы данных........................................................197
f 10.2. Задачи...................................................................................................202
Приложение А. Некоторые библиотечные
функции................................................................................................................202
Приложение Б. Некоторые инструментальные
средства...................................................................•............................................242
^Приложение В. Стандарт ANSI языка Си.............................................252
^Приложение Г. Таблицы кодов ASCII.....................................................254
Приложение Д. Характеристики компилятора,
^ависящие от реализации...........................................................................256
Список литературы..........................................................................................257
Hosted by uCoz