В работоспособности программы мы убедились, теперь пришло время разобраться, что в ней означают различные элементы и как именно она работает.
Но сначала нужно понять, как устроены программы на языке Си и как их обрабатывает компьютер.
Начнём со второго - так будет понятнее устройство программы.
Итак,
1. на первой стадии обработки препроцессор добавляет к исходному тексту программы(он же - "исходники", "сорцы") дополнительные включаемые файлы(обычно так называемые "заголовочные файлы", но не только они).
Так получается полный текст программы.
2. Полный текст программы обрабатывается компилятором, на выходе получаем объектный код программы.
3. Объектный код вместе со стандартными библиотеками обрабатываются компоновщиком(он же - линковщик), итогом чего становится исполняемая программа.
Теперь возвращаемся к структуре программ. В общих чертах она выглядит так:
В начале программы находятся директивы препроцессора - это, вообще говоря, программный "костыль": язык Си не умеет, например, подключать модули, и с помощью директивы include он просто вставляет текст из указанного файла(в нашем случае - stdio.h), реализуя некое подобие такой возможности. Кроме того, существуют и другие директивы, о которых позже будет отдельный разговор.
Затем следует "главная функция", описывающая самые общие стадии программы;
затем - все остальные функции, объясняющие всё более мелкие стадии всё более подробным языком.
Вообще говоря, местонахождение всех остальных функций роли не играет; да и нахождение "главной функции", называющейся main, тоже. Тем не менее, принято начинать с неё - это считается хорошим стилем программирования на языке Си.
Представьте себе программу "Подготовка к Новому Году".
Можно сразу поставить себе цель подробно описать каждый шаг - и долго и нудно идти к цели, при этом затруднение на любой стадии будут тормозить всю последующую работу.
А можно сначала написать алгоритм в общем виде: сначала -
1. Пригласить гостей
2. Сделать генеральную уборку
3. Нарядить ёлку
4. Закупить продукты
5. Купить подарки
6. Накрыть праздничный стол
7. Встретить гостей
- это и будет функция main.
А потом подробнее расписывать каждую стадию, например, в стадии 3 будут шаги
3.1 Установить ёлку
3.2 Повесить на ёлку гирлянду
3.3 Развесить игрушки
3.4 На верхушку прикрепить звезду или сосульку
3.5 Закончить украшать дождиком
3.7 Включить гирлянду
А в стадии 6 -
6.1 Поставить стол
6.2 Накрыть скатертью
6.3 Поставить блюда с холодцом, салатами, бутылки с напитками
6.4 Расставить столовые приборы на всех гостей(тарелки, вилки, ложки, ножи) по их количеству
6.5 Расставить стулья
Дальше каждый шаг будет всё более конкретизироваться.
Таким образом, нет нужды перед началом работы рисовать блок-схемы - структура программ на языке Си позволяет обходиться без них.
Заодно - поскольку каждая функция имеет уникальное, неповторимое имя - то нет необходимости вручную разбираться в ветвях блок-схем и отслеживать, каким абсолютным адресам соответствуют начала всех функций и команд.
Когда при написании программ используется абсолютная адресация(как принято, например, в Бэйсике), это всегда служит источником проблем и ошибок.
Кстати - хотя соответствующая команда, goto, в языке Си тоже имеется, пользоваться ей в повседневной практике не рекомендуется.
P.S. Просьба более компетентных товарищей в случае обнаружения в конспекте ошибок или глупостей не забивать автора, как мамонта, а поправить.
Заранее благодарен.
UPD: Всё-таки решил перенести разбор первой программы в
отдельный пост (тем более, что по той части возражений, кажется, нет), а эту часть переработать.
Следите за изменениями.
Перепост из:
http://rex-lockheart.dreamwidth.org/335254.html