Ранее были рассмотрены лексемы языка, способы определения констант и переменных, правила записи и вычисления выражений. Несколько слов было сказано об операции присваивания, об операторе присваивания и о том, что каждое выражение превращается в оператор, если в конце выражения находится разделитель "точка с запятой". Сейчас перейдем собственно к программированию, т.е. рассмотрим операторы, введем элементарные средства ввода-вывода, опишем структуру однофайловой программы и на несложных примерах вычислительного характера продемонстрируем особенности программирования на языке Си.
Текст программы и препроцессор.Каждая программа на языке Си есть последовательность препроцессорных директив, описаний и определений глобальных объектов и функций. Препроцессорные директивы (#includeи#define)управляют преобразованием текста программы до ее компиляции. Определения вводят функции и объекты. Объекты необходимы для представления в программе обрабатываемых данных. Функции определяют потенциально возможные действия программы. Описания уведомляют компилятор о свойствах и именах тех объектов и функций, которые определены в других частях программы (например, ниже по ее тексту или в другом файле).
Программа на языке Си должна быть оформлена в виде одного или нескольких текстовых файлов. Текстовый файл разбит на строки. В конце каждой строки есть признак ее окончания (плюс управляющий символ перехода к началу новой строки). Просматривая текстовый файл на экране дисплея, мы видим последовательность строк, причем признаки окончания строк невидимы, но по ним производится разбивка текста редактором.
Определения и описания программы на языке Си могут размещаться в строках текстового файла достаточно произвольно (в свободном формате.) Для препроцессорных директив существуют ограничения. Во-первых, препроцессорная директива обычно размещается в одной строке, т.е. признаком ее окончания является признак конца строки текста программы. Во-вторых, символ '#', вводящий каждую директиву препроцессора, должен быть первым отличным от пробела символом в строке с препроцессорной директивой
Подробному изучению возможностей препроцессора и всех его директив будет далее. Сейчас достаточно рассмотреть только основные принципы работы препроцессора и изложить общую схему подготовки исполняемого модуля программы, написанной на языке Си. Исходная программа, подготовленная на языке Си в виде текстового файла, проходит три обязательных этапа обработки (рис. 2.1):
• препроцессорное преобразование текста;
• компиляция;
• компоновка (редактирование связей или сборка).
Рис. 2.1. Схема подготовки исполняемой программы
Только после успешного завершения всех перечисленных этапов формируется исполняемый машинный код программы.
Задача препроцессора - преобразование текста программы до ее компиляции. Правила препроцессорной обработки определяет программист с помощью директив препроцессора. Каждая препроцессорная директива начинается с символа '#'. В этой главе нам будет достаточно двух директив: