- •Максимов м.Н.
- •3. Скалярные типы и выражения 51
- •5. Адреса, указатели, массивы, память 96
- •6. Функции, указатели, ссылки 133
- •7 Структуры, объединения и классы 171
- •Введение
- •Модуль 1
- •1.2. Этапы подготовки исполняемой программы
- •1.3. Системы счисления
- •Представление чисел от 0 до 16 в разных системах счисления
- •2.1. Общие сведения о программах, лексемах и алфавите
- •2.2. Идентификаторы и служебные слова
- •2.3. Типы данных
- •2.4. Константы
- •Типы, выбираемые компилятором по умолчанию для целых констант
- •ZzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzТаблица 2.3 Данные вещественного типа
- •2.5. Операции
- •2.6. Разделители
- •3. Скалярные типы и выражения
- •3.1. Определение и описание переменных
- •3.2. Явное и неявное преобразование типа
- •Проектные задания
- •Тесты рубежного контроля
- •Квалиметрическая оценка
- •Список литературы
- •Модуль 2
- •4.1. Последовательно выполняемые операторы
- •4.2. Операторы выбора
- •If( выражение) оператор_1 else оператор_2
- •4.3. Операторы цикла
- •4.4. Операторы передачи управления
- •If (условие) break;
- •4.5. Примеры численного моделирования цепей первого порядка
- •5. Адреса, указатели, массивы, память
- •5.1. Указатели и адреса объектов
- •5.2. Адресная арифметика, типы указателей и операции над ними
- •5.3. Свойства указателя типа void*
- •5.4. Свойства объекта cout
- •5.5. Массивы и указатели
- •5.6. Многомерные массивы, массивы указателей, динамические массивы
- •Проектные задания к модулю
- •Тесты рубежного контроля
- •Квалиметрическая оценка
- •6.2. Функции с переменным количеством параметров
- •6.3. Рекурсивные функции
- •6.4. Подставляемые (инлайн-) функции
- •6.5. Функции и массивы
- •6.6. Указатели на функции
- •Void f3(float) (...) // Определение функции
- •Int* f4(char *){...} // Определение функции
- •Проектные задания
- •Тесты рубежного контроля
- •Квалиметрическая оценка
- •Модуль 4
- •7 Структуры, объединения и классы
- •7.1 Структура как тип и совокупность данных
- •7.3 Объединения разнотипных данных
- •7.4 Деревья
- •7.5 Битовые поля структур и объединений
- •7.6 Компонентные функции структурированных объектов
- •7.7 Расширение действия (перегрузка) стандартных операций
- •7.8 Доступ к компонентам структурированного объекта
- •7.9 Классы и шаблоны
- •Проектные задания
- •Тесты рубежного контроля
- •Квалиметрическая оценка
- •Список литературы
- •Приложение 1
- •Приложение 2 Стандартная библиотека функций языка Си
1.2. Этапы подготовки исполняемой программы
Файл, содержащий текст программы, написанный на языке Си++, это обычный текстовый файл, который можно отредактировать или создать в любом текстовом редакторе. Но поскольку он всё же содержит текст программы, а не просто текст, то для него обычно вместо расширения *.txt выбирают расширение *.cpp, *.c или *.h.
С текстом программы принято работать не в обычном текстовом редакторе, а в среде программирования, например Borland или Microsoft Visual, которая содержит свой специфичный текстовый редактор. Преимущество такой организации работы в том, что текстовый редактор среды с помощью цвета или пробелов делает программу более читабельной, например, выделяя каждый своим цветом ключевые слова языка, константы, комментарии и т.д. Кроме того, среда программирования предназначена для компиляции и компоновки из исходного текстового файла нового исполняемого файла (программы), содержащего инструкции процессора и имеющего обычно расширение *.exe. Этапы подготовки исполняемой программы приведены на рис. 1.1.
Рис. 1.1. Этапы подготовки исполняемой программы
Исходный текст программы на первом этапе обрабатывается препроцессором, задача которого выполнить директивы препроцессора (строки программы, начинающиеся с #). Например, в тексте программы hello.cpp есть только одна директива include. С помощью этой директивы в исходный текст программы препроцессор вставляет содержимое текстового файла iostream.h. В результате мы получаем полный текст программы.
На втором этапе текст программы анализируется компилятором (Compiler), и если в программе отсутствуют синтаксические ошибки, то создаётся так называемый объектный файл с расширением *.obj, который является исходным файлом для третьего этапа – компоновки. Если же компилятор обнаруживает синтаксические ошибки в тексте программы, то объектный файл не создаётся, и программисту в отдельном окне message выводятся сообщения об ошибках с указанием, в какой строке программы, по мнению компилятора, присутствует ошибка и в чём она заключается. В 90% случаев компилятор правильно указывает строку с ошибкой и её тип, но иногда ошибка может находиться выше в тексте программы.
Кроме ошибок компилятор может выдавать предупреждения. Одним из типичных предупреждений является сообщение компилятора о том, что программист определил переменную, но дальше в тексте программы нигде её не использовал. С предупреждениями компилятора желательно ознакомится и по возможности устранить, так как некоторые предупреждения, могут быть не столь безобидны, как описанное выше, и являются указанием программисту на возможную скрытую ошибку в программе. Тем не менее, наличие только предупреждений не препятствует созданию объектного модуля и переходу к этапу компоновки.
При компоновке Linker (компоновщик) создаёт исполняемый файл, обрабатывая объектный файл и включая в него код из библиотечных файлов. Компоновщик, как и компилятор, тоже может выдавать сообщения об ошибках. Это происходит тогда, когда программист описал объект, но забыл его определить. В этом случае исполняемый файл не будет создан, пока программист не исправит ошибки и не запустит компоновщик заново.
В компиляторах обычно предусмотрена возможность выполнения отдельных этапов подготовки программы по отдельности или вместе. Так в компиляторе фирмы Borland при выборе в меню команды Compile будет выполнена только компиляция программы с созданием её объектного модуля. При выборе в меню команды Link запустится только компоновщик, который воспользуется объектным модулем программы и создаст исполняемую программу. При выборе в меню команды Build all будут выполнены все этапы подготовки программы.