
- •Происхождение языка с
- •Язык среднего уровня
- •Структурированный язык
- •Язык программирования
- •Компиляторы против интерпретаторов
- •Вид программ на с
- •Библиотеки и компоновка
- •Раздельная компиляция
- •Карта памяти с-программы
- •Переменные, константы, операторы и выражения
- •Идентификаторы
- •Типы данных
- •Модификаторы типов
- •Модификаторы доступа
- •Объявление переменных
- •Локальные переменные
- •Формальные параметры
- •Глобальные переменные
- •Спецификаторы хранения
- •Статические переменные
- •Статические локальные переменные
- •Статические глобальные переменные
- •Регистровые переменные
- •Оператор присваивания
- •Многочисленное присваивание
- •Преобразование типов при присваивании
- •Инициализация переменных
- •Константы
- •Символьные константы с обратным слэшем
- •Операторы
- •Арифметические операторы
- •Увеличение и уменьшение
- •Операторы отношения и логические операторы
- •Битовые операторы
- •Оператор ?
- •Операторы указания & и *
- •Оператор sizeof
- •Оператор «запятая»
- •Операторы [ ] u ()
- •Приоритеты в с
- •Выражения
- •Преобразование типов в выражениях
- •Принудительные преобразования
- •Пробелы и круглые скобки
- •Сокращенные операторы в с
- •Операторы управления программой
- •Истина и ложь в с
- •Операторы выбора
- •Вложенные if
- •Лесенка if-else-if
- •Оператор ?
- •Вложенные операторы switch
- •Вариации цикла for
- •Бесконечный цикл
- •Циклы for без тела
- •Метки и goto
- •Функции
- •Оператор return
- •Выход из функции
- •Возвращаемые значения
- •Значения, возвращаемые функцией main()
- •Правила видимости для функций
- •Аргументы функции
- •Передача по значению и передача по ссылке
- •Создание передачи по ссылке
- •Передача массивов в функции
- •Аргументы функции main()
- •Функции, возвращающие нецелые значения
- •Использование прототипов функции
- •Прототипы стандартных библиотечных функций
- •Создание прототипов функций, не имеющих параметров
- •Возврат указателей
- •Рекурсия
- •Сопоставление классического и современного объявления параметров
- •Указатели на функции
- •Особенности реализации
- •Параметризированные функции и функции общего назначения
- •Эффективность
- •Массивы
- •Одномерный массив
- •Создание указателя на массив
- •Передача одномерных массивов в функции
- •Двумерные массивы
- •Массивы строк
- •Многомерные массивы
- •Индексация с помощью указателей
- •Размещение массивов
- •Инициализация массива
- •Инициализация безразмерных массивов
- •Пример программы игры в крестики-нолики
- •Указатели
- •Указатели - это адреса
- •Переменные-указатели
- •Операторы для работы с указателями
- •Выражения с указателями
- •Присваивание указателей
- •Арифметические действия с указателями
- •Сравнение указателей
- •Динамическое выделение и указатели
- •Указатели на константы
- •Указатели на константы
- •Указатели на константы
- •Указатели и массивы
- •Указатели на символьные массивы
- •Массивы указателей
- •Указатели на указатели - многочисленное перенаправление
- •Инициализация указателей
- •Указатели на функции
- •Проблемы, связанные с указателями
- •Структуры, объединения и определяемые пользователем типы
- •Структуры
- •Доступ к членам структуры
- •Присваивание структур
- •Массивы структур
- •Программа инвентаризации
- •Передача структур в функции
- •Передача членов структур в функции
- •Передача всей структуры в функцию
- •Указатели на структуры
- •Объявление указателя на структуру
- •Использование указателей на структуру
- •Массивы и структуры в структурах
- •Битовые поля
- •Объединения
- •Перечисления
- •Использование sizeof для обеспечения переносимости
- •Ввод, вывод, потоки и файлы
- •Потоки и файлы
- •Текстовые потоки
- •Двоичные потоки
- •Консольный ввод/вывод
- •Чтение и запись символов
- •Чтение и запись строк: gets() и puts()
- •Форматированный консольный ввод/вывод
- •Печать символов
- •Вывод чисел
- •Вывод адресов
- •Спецификатор %n
- •Модификаторы формата
- •Спецификатор минимума ширины поля
- •Спецификатор точности
- •Выровненный вывод
- •Работа с другими типами данных
- •Модификаторы * u #
- •Спецификаторы формата
- •Ввод чисел
- •Ввод беззнаковых целых
- •Чтение отдельных символов с помощью scanf()
- •Чтение строк
- •Ввод адреса
- •Спецификатор %n
- •Использование множества сканирования
- •Пропуск нежелательных специальных символов
- •Обычные символы в управляющей строке
- •В scanf() следует передавать адреса
- •Модификаторы формата
- •Подавление ввода
- •Файловая система ansi с
- •Указатель на файл
- •Открытие файла
- •Запись символа
- •Чтение символа
- •Использование fopen(), getc(), putc() и fclose()
- •Использование feof()
- •Две расширенные функции: getw() и putw()
- •Работа со строками: fgets() и fputs()
- •Fseek() и произвольный доступ
- •Удаление файлов
- •Работа с консолью
- •Препроцессор и комментарии
- •Директивы условной компиляции
- •Использование defined
- •Операторы препроцессора # и ##
- •Предопределенные макросы
- •Комментарии
http://www.c-cpp.ru/books/proishozhdenie-yazyka-s
http://www.c-cpp.ru/books/proishozhdenie-yazyka-s 1
Происхождение языка С 5
Язык среднего уровня 6
Структурированный язык 7
Язык программирования 8
Компиляторы против интерпретаторов 10
Вид программ на С 10
Библиотеки и компоновка 12
Раздельная компиляция 12
Карта памяти С-программы 12
Переменные, константы, операторы и выражения 13
Идентификаторы 13
Типы данных 14
Модификаторы типов 14
Модификаторы доступа 16
Объявление переменных 17
Локальные переменные 17
Формальные параметры 19
Глобальные переменные 20
Спецификаторы хранения 22
extern 22
Статические переменные 23
Статические локальные переменные 23
Статические глобальные переменные 25
Регистровые переменные 26
Оператор присваивания 27
Многочисленное присваивание 28
Преобразование типов при присваивании 28
Инициализация переменных 30
Константы 30
Символьные константы с обратным слэшем 31
Операторы 32
Арифметические операторы 32
Увеличение и уменьшение 33
Операторы отношения и логические операторы 34
Битовые операторы 36
Оператор ? 39
Операторы указания & и * 40
Оператор sizeof 42
Оператор «запятая» 43
Операторы . u -> 43
Операторы [ ] u () 44
Приоритеты в С 45
Выражения 45
Преобразование типов в выражениях 45
Принудительные преобразования 46
Пробелы и круглые скобки 47
Сокращенные операторы в С 47
Операторы управления программой 48
Истина и ложь в С 48
Операторы выбора 48
IF 49
Вложенные if 50
Лесенка if-else-if 51
Оператор ? 52
SWITCH 55
Вложенные операторы switch 58
Циклы 59
FOR 59
Вариации цикла for 60
Бесконечный цикл 63
Циклы for без тела 63
WHILE 64
DO/WHILE 66
BREAK 67
EXIT() 68
CONTINUE 70
Метки и GOTO 71
Функции 72
Оператор return 73
Выход из функции 73
Возвращаемые значения 74
Значения, возвращаемые функцией main() 76
Правила видимости для функций 76
Аргументы функции 76
Передача по значению и передача по ссылке 77
Создание передачи по ссылке 78
Передача массивов в функции 79
Аргументы функции MAIN() 83
Функции, возвращающие нецелые значения 87
Использование прототипов функции 89
Прототипы стандартных библиотечных функций 91
Создание прототипов функций, не имеющих параметров 92
Возврат указателей 93
Рекурсия 94
Сопоставление классического и современного объявления параметров 96
Указатели на функции 97
Особенности реализации 99
Параметризированные функции и функции общего назначения 99
Эффективность 100
Массивы 101
Одномерный массив 101
Создание указателя на массив 102
Передача одномерных массивов в функции 103
Строки 104
Двумерные массивы 105
Массивы строк 109
Многомерные массивы 110
Индексация с помощью указателей 111
Размещение массивов 113
Инициализация массива 116
Инициализация безразмерных массивов 118
Пример программы игры в крестики-нолики 119
Указатели 122
Указатели - это адреса 122
Переменные-указатели 123
Операторы для работы с указателями 123
Выражения с указателями 125
Присваивание указателей 125
Арифметические действия с указателями 125
Сравнение указателей 126
Динамическое выделение и указатели 128
Указатели на константы 129
Указатели на константы 130
Указатели на константы 131
Указатели и массивы 132
Указатели на символьные массивы 133
Массивы указателей 135
Указатели на указатели - многочисленное перенаправление 136
Инициализация указателей 138
Указатели на функции 139
Проблемы, связанные с указателями 141
Структуры, объединения и определяемые пользователем типы 143
Структуры 143
Доступ к членам структуры 145
Присваивание структур 146
Массивы структур 146
Программа инвентаризации 147
Передача структур в функции 152
Передача членов структур в функции 152
Передача всей структуры в функцию 153
Указатели на структуры 154
Объявление указателя на структуру 154
Использование указателей на структуру 154
Массивы и структуры в структурах 158
Битовые поля 159
Объединения 161
Перечисления 163
Использование sizeof для обеспечения переносимости 166
TYPEDEF 167
Ввод, вывод, потоки и файлы 168
Ввод/вывод С против С++ 169
Потоки и файлы 169
Потоки 169
Текстовые потоки 170
Двоичные потоки 170
Файлы 170
Консольный ввод/вывод 172
Чтение и запись символов 172
Чтение и запись строк: gets() и puts() 174
Форматированный консольный ввод/вывод 175
printf() 176
Печать символов 177
Вывод чисел 177
Вывод адресов 178
Спецификатор %n 178
Модификаторы формата 179
Спецификатор минимума ширины поля 179
Спецификатор точности 181
Выровненный вывод 181
Работа с другими типами данных 182
Модификаторы * u # 182
scanf() 183
Спецификаторы формата 183
Ввод чисел 184
Ввод беззнаковых целых 184
Чтение отдельных символов с помощью scanf() 185
Чтение строк 185
Ввод адреса 186
Спецификатор %n 186
Использование множества сканирования 186
Пропуск нежелательных специальных символов 188
Обычные символы в управляющей строке 188
В scanf() следует передавать адреса 188
Модификаторы формата 189
Подавление ввода 190
Файловая система ANSI С 190
Указатель на файл 191
Открытие файла 191
Запись символа 193
Чтение символа 194
fclose() 194
Использование fopen(), getc(), putc() и fclose() 195
Использование feof() 196
Две расширенные функции: getw() и putw() 197
Работа со строками: fgets() и fputs() 197
fread() и fwrite() 198
fseek() и произвольный доступ 200
fprintf() и fscanf() 202
Удаление файлов 205
ferror() и rewind() 206
Работа с консолью 206
Препроцессор и комментарии 207
#define 208
#error 211
#include 211
Директивы условной компиляции 212
#if, #else, #elif и #endif 212
#ifdef u #ifndef 215
#undef 216
Использование defined 216
#line 217
#pragma 217
Операторы препроцессора # и ## 221
Предопределенные макросы 222
Комментарии 224
Происхождение языка с
Деннис Ричи разработал и первым реализовал язык программирования С на DEC PDP-11 с операционной системой UNIX. Язык является результатом разработки старого языка BCPL. Мартин Ричардс разработал BCPL под влиянием созданного Кеном Томсоном языка В, который привел к разработке С в 1970 году. В течение многих лет стандартом С де-факто была версия, поставляемая для операционной системы UNIX System V. Она описана в книге Брайана Кернигана и Денниса Ричи «Язык программирования С» (Prentice-Hall, 1978). Растущая популярность компьютеров привела к созданию множества приложений для С. Казалось просто чудом, что исходные коды для различных реализаций С имеют высокую степень совместимости. Тем не менее, поскольку не существовало стандарта, были и несоответствия. Для исправления ситуации ANSI предложил летом 1983 года создать комитет по созданию ANSI-стандарта языка С. Стандарт был полностью принят в декабре 1989 года.
Язык среднего уровня
С часто называют языком среднего уровня. Это не означает, что С менее мощный, более труден в изучении или менее разработан, чем языки высокого уровня типа Бейсик или Паскаль. Также это не означает, что у него имеются проблемы, присущие ассемблеру. Определение С как языка среднего уровня означает, что он объединяет элементы языков высокого уровня с функциональностью ассемблера. В таблице показанно место С среди других языков.
Таблица. Место С в мире языков |
||
Высокий уровень |
Средний уровень |
Нижний уровень |
Ада |
С |
Ассемблер |
Модула-2 |
С++ |
|
Паскаль |
FORTH |
|
COBOL |
Макро Ассемблер |
|
Фортран |
|
|
Бейсик |
|
|
Как язык среднего уровня, С позволяет манипулировать битами, байтами и адресами — основными элементами, с которыми работает компьютер. И это все несмотря на то, что код С имеет высокую степень переносимости. (Под переносимостью подразумевается возможность переноса программного обеспечения, написанного для одного типа компьютеров, на другой.) Например, если программа, написанная для Apple Macintosh, может быть легко перенесена на IBM PC, то программа является переносимой.
Языки высокого уровня поддерживают концепцию типов данных. Тип данных определяет набор значений, которые переменная может хранить, и набор операций, которые могут выполняться над переменной. Стандартными типами данных является целочисленный, символьный и вещественный. Хотя С имеет 5 основных встроенных типов данных, он не так сильно типизирован, как языки типа Паскаль или Ада. Фактически С позволяет осуществлять большинство преобразований типов. Например, символьный и целочисленный типы могут быть свободно смешаны в большинстве выражений. В противоположность языкам высокого уровня С в основном не выполняет проверку ошибок времени выполнения типа проверки выхода за границы массива. Данные проверки возлагаются на программиста.
Как было упомянуто выше, С позволяет напрямую манипулировать битами, байтами, словами и указателями. Это необходимо для Программирования на системном уровне, где такие операции наиболее типичны. Другим важным аспектом С является то, что в нем имеется только 32 ключевых слова (27 — из стандарта Кернигана и Ричи и 5 добавлено комитетом по стандартизации ANSI), являющихся командами, образующими язык С. Высокоуровневые языки, как правило, имеют несколько больше ключевых слов.