Б. Керниган, Д. Ритчи Язык программирования Си Издание 3-е, исправленное Предисловие Предисловие к первому изданию Введение Глава 1. Обзор языка 1.1 Начнем, пожалуй 1.2 Переменные и арифметические выражения 1.3 Инструкция for 1.4 Именованные константы 1.5 Ввод-вывод символов 1.5.1 Копирование файла 1.5.2 Подсчет символов 1.5.3 Подсчет строк 1.5.4 Подсчет слов 1.6 Массивы 1.7 Функции 1.8 Аргументы. Вызов по значению 1.9 Символьные массивы 1.10 Внешние переменные и область видимости Глава 2. Типы, операторы и выражения 2.1 Имена переменных 2.2 Типы и размеры данных 2.3 Константы 2.4 Объявления 2.5 Арифметические операторы 2.6 Операторы отношения и логические операторы 2.7 Преобразования типов 2.8 Операторы инкремента и декремента 2.9 Побитовые операторы 2.10 Операторы и выражения присваивания 2.11 Условные выражения 2.12 Приоритет и очередность вычислений Глава 3. Управление 3.1 Инструкции и блоки 3.2 Конструкция if-else 3.3 Конструкция else-if 3.4 Переключатель switch 3.5 Циклы while и for 3.6 Цикл do-while 3.7 Инструкции break и continue 3.8 Инструкция goto и метки Глава 4. Функции и структура программы 4.1 Основные сведения о функциях 4.2 Функции, возвращающие нецелые значения 4.3 Внешние переменные 4.4 Области видимости 4.5 Заголовочные файлы 4.6 Статические переменные 4.7 Регистровые переменные 4.8 Блочная структура 4.9 Инициализация 4.10 Рекурсия 4.11 Препроцессор языка Си 4.11.1 Включение файла 4.11.2 Макроподстановка 4.11.3 Условная компиляция Глава 5. Указатели и массивы 5.1 Указатели и адреса 5.2 Указатели и аргументы функций 5.3 Указатели и массивы 5.4 Адресная арифметика 5.5 Символьные указатели функции 5.6 Массивы указателей, указатели на указатели 5.7 Многомерные массивы 5.8 Инициализация массивов указателей 5.9 Указатели против многомерных массивов 5.10 Аргументы командной строки 5.11 Указатели на функции 5.12 Сложные объявления Глава 6. Структуры 6.1 Основные сведения о структурах 6.2 Структуры и функции 6.3 Массивы структур 6.4 Указатели на структуры 6.5 Структуры со ссылками на себя 6.6 Просмотр таблиц 6.7 Средство typedef 6.8 Объединения 6.9 Битовые поля Глава 7. Ввод и вывод 7.1 Стандартный ввод-вывод 7.2 Форматный вывод (printf) 7.3 Списки аргументов переменной длины 7.4 Форматный ввод (scanf) 7.5 Доступ к файлам 7.6 Управление ошибками (stderr и exit) 7.7 Ввод-вывод строк 7.8 Другие библиотечные функции 7.8.1 Операции со строками 7.8.2 Анализ класса символов и преобразование символов 7.8.3 Функция ungetc 7.8.4 Исполнение команд операционной системы 7.8.5 Управление памятью 7.8.6 Математические функции 7.8.7 Генератор случайных чисел Глава 8. Интерфейс с системой UNIX 8.1 Дескрипторы файлов 8.2 Нижний уровень ввода-вывода (read и write) 8.3 Системные вызовы open, creat, close, unlink 8.4 Произвольный доступ (lseek) 8.5 Пример. Реализация функций fopen и getc 8.6 Пример. Печать каталогов 8.7 Пример. Распределитель памяти Приложение A. Справочное руководство A1. Введение A2. Соглашения о лексике A2.1. Лексемы (tokens) A2.2. Комментарий A2.3. Идентификаторы A2.4. Ключевые слова A2.5. Константы A2.5.1. Целые константы A2.5.2. Символьные константы А2.5.3. Константы с плавающей точкой A2.5.4. Константы-перечисления A2.6. Строковые литералы A3. Нотация синтаксиса A4. Что обозначают идентификаторы A4.1. Класс памяти A4.2. Базовые типы A4.3. Производные типы A4.4. Квалификаторы типов A5. Объекты и Lvalues A6. Преобразования A6.1. Целочисленное повышение A6.2. Целочисленные преобразования A6.3. Целые и числа с плавающей точкой A6.4. Типы с плавающей точкой А6.5. Арифметические преобразования A6.6. Указатели и целые A6.7. Тип void А6.8. Указатели на void A7. Выражения A7.1. Генерация указателя A7.2. Первичные выражения A7.3. Постфиксные выражения A7.3.1. Обращение к элементам массива A7.3.2. Вызов функции A7.3.3. Обращение к структурам A7.3.4. Постфиксные операторы инкремента и декремента А7.4. Унарные операторы А7.4.1. Префиксные операторы инкремента и декремента A7.4.2. Оператор получения адреса A7.4.3. Оператор косвенного доступа A7.4.4. Оператор унарный плюс A7.4.5. Оператор унарный минус A7.4.6. Оператор побитового отрицания A7.4.7. Оператор логического отрицания A7.4.8. Оператор определения размера sizeof A7.5. Оператор приведения типа A7.6. Мультипликативные операторы A7.7. Аддитивные операторы A7.8. Операторы сдвига A7.9. Операторы отношения A7.10. Операторы равенства A7.11. Оператор побитового И A7.12. Оператор побитового исключающего ИЛИ A7.13. Оператор побитового ИЛИ A7.14. Оператор логического И A7.15. Оператор логического ИЛИ А7.16. Условный оператор A7.17. Выражения присваивания A7.18. Оператор запятая A7.19. Константные выражения A8. Объявления A8.1. Спецификаторы класса памяти А8.2. Спецификаторы типа A8.3. Объявления структур и объединений A8.4. Перечисления А8.5. Объявители A8.6. Что означают объявители A8.6.1. Объявители указателей А8.6.2. Объявители массивов А8.6.3. Объявители функций A8.7. Инициализация A8.8. Имена типов А8.9. Объявление typedef A8.10. Эквивалентность типов A9. Инструкции A9.1. Помеченные инструкции A9.2. Инструкция-выражение A9.3. Составная инструкция A9.4. Инструкции выбора A9.5. Циклические инструкции A9.6. Инструкции перехода А10. Внешние объявления A10.1. Определение функции A10.2. Внешние объявления A11. Область видимости и связи A11.1. Лексическая область видимости A11.2. Связи A12. Препроцессирование A12.1. Трехзнаковые последовательности A12.2. Склеивание строк А12.3. Макроопределение и макрорасширение A12.4. Включение файла A12.5. Условная компиляция A12.6. Нумерация строк A12.7. Генерация сообщения об ошибке A12.8. Прагма A12.9. Пустая директива A12.10. Заранее определенные имена A13. Грамматика Приложение B. Стандартная библиотека B1. Ввод-вывод: ‹stdio.h› B1.1. Операции над файлами B1.2. Форматный вывод B1.3. Форматный ввод B1.4. Функции ввода-вывода символов B1.5. Функции прямого ввода-вывода B1.6. Функции позиционирования файла B1.7. Функции обработки ошибок B2. Проверки класса символа: ‹ctype.h› B3. Функции, оперирующие со строками: lt;string.hgt; B4. Математические функции: lt;math.hgt; B5. Функции общего назначения: lt;stdlib.hgt; B6. Диагностика: lt;assert.hgt; B7. Списки аргументов переменной длины: lt;stdarg.hgt; B8. Дальние переходы: lt;setjmp.hgt; B9. Сигналы: lt;signal.hgt; B10. Функции даты и времени: ‹time.h› B11. Зависящие от реализации пределы: lt;limits.hgt; и lt;float.hgt; Приложение C. Перечень изменений Предметный указатель
Глава 1. Обзор языка Начнем с быстрого ознакомления с языком Си. Наша цель - показать на реальных программах существенные элементы языка, не вдаваясь в мелкие детали, формальные правила и исключения из них. Поэтому мы не стремимся к полноте и даже точности (заботясь, однако, о корректности примеров). Нам бы хотелось как можно скорее подвести вас к моменту, когда вы сможете писать полезные программы. Чтобы сделать это, мы должны сконцентрировать внимание на основах: переменных и константах, арифметике, управлении последовательностью вычислений, функциях и простейшем вводе-выводе. В настоящей главе мы умышленно не затрагиваем тех средств языка, которые важны при написании больших программ: указателей, структур, большой части богатого набора операторов, некоторых управляющих инструкций и стандартной библиотеки.
Такой подход имеет свои недостатки. Наиболее существенный из них состоит в том, что отдельное характерное свойство языка не описывается полностью в одном месте, и подобная лаконичность при обучении может привести к неправильному восприятию некоторых положений. В силу ограниченного характера подачи материала в примерах не используется вся мощь языка, и потому они не столь кратки и элегантны, как могли бы быть. Мы попытались по возможности смягчить эти эффекты, но считаем необходимым предупредить о них. Другой недостаток заключается в том, что в последующих главах какие-то моменты нам придется повторить. Мы надеемся, что польза от повторений превысит вызываемое ими раздражение.
В любом случае опытный программист должен суметь экстраполировать материал данной главы на свои программистские нужды. Новичкам же рекомендуем дополнить ее чтение написанием собственных маленьких программ. И те и другие наши читатели могут рассматривать эту главу как "каркас", на который далее, начиная с главы 2, будут "навешиваться" элементы языка.