Директивы препроцессора и комментарии
Директивы препроцессора предназначены для обработки исходного текста программы перед компиляцией. Любая директива должна начинаться с символа #. На каждой строке может располагаться только одна директива. Например, по директиве
#include "myfile"
в текст программы будет вставлено содержимое так называемого заголовочного файла с именем myfile. Заголовочные файлы содержат различную информацию, необходимую для успешной компиляции программы.
Комментарии предназначены для записи пояснений к программе. В С++ есть два вида комментариев: однострочные и многострочные. Первый вид начинается с двух символов // ("прямая косая черта") и занимает одну строку. Второй вид комментариев начинается с двух символов /* и завершается двумя символами */.
Внутри комментария можно использовать любые символы из набора реализации. Внутри многострочного комментария можно размещать однострочный комментарий.
Типы данных С++
Основная цель любой программы состоит в обработке данных. Данные, с которыми работают машинные команды, хранятся в оперативной памяти. Компилятору для формирования команд необходимо точно знать, сколько места занимают данные, как именно закодированы и какие действия с ними можно выполнять. Все это задается при описании данных с помощью типа. Каждая константа, переменная, результат вычисления выражения или функции должны иметь конкретный тип.
Тип данных однозначно определяет:
· множество их возможных значений (связанное с внутренним представлением данных в памяти компьютера);
· допустимые действия над данными (операции и функции).
Программист задает тип каждой величины, используемой в программе, исходя из характеристик реальных объектов, которые представляют эти величины. Обязательное указание типа позволяет компилятору проверять, правильно ли используется объект в конструкциях языка. От типа величины зависят машинные команды, которые будут использоваться для обработки данных.
Объем памяти, выделяемый для величин, тоже зависит от типа. По стандарту единицей памяти в С++ является байт.
Типы языка С++ делятся на элементарные (базовые, основные) и составные. Элементарные типы данных являются неделимыми и позволяют описывать целые, вещественные, символьные и логические величины. На основе этих типов программист может конструировать составные типы. Составной тип - это тип, определенный в терминах другого типа. К составным типам относятся массивы, структуры, объединения, перечисления, ссылки, указатели и классы. Внутреннее представление данных всех типов, их размеры и диапазоны величин определяются конкретной платформой.
Рисунок 1.1 помогает окинуть взглядом все разнообразие типов данных, определенных в стандарте языка С++.
Рис. 1.1. Типы данных стандартного С++
Базовые типы данных
Элементарные типы данных, если исключить из них тип void, часто называют арифметическими,поскольку их можно использовать в арифметических операциях. Для их описания определены следующие ключевые слова:
bool (логический);
char (символьный);
wchar_t (широкий символьный);
int (целый);
float (вещественный);
double (вещественный с двойной точностью).
Первые четыре типа называют интегральными (целыми), последние два - типами с плавающей точкой. Код, который формирует компилятор для обработки целых величин, отличается от кода для величин с плавающей точкой.
Существует четыре ключевых слова, уточняющих внутреннее представление и диапазон значений стандартных типов: short (короткий); long (длинный); signed (знаковый); unsigned (беззнаковый).
Сочетания перечисленных ключевых слов формируют 14 различных арифметических типов, приведенных на рис. 1.1. Например, char, signed char и unsigned char - это три равноправных различных типа.
Логический тип
Величины логического типа могут принимать только значения true и false, являющиеся ключевыми словами. Величины логического типа могут участвовать в арифметических операциях. При преобразовании к целому типу true имеет значение 1, false - нуль. Размер логического типа в стандарте не определен и зависит от реализации.
Символьные типы
В стандарте языка определено три различных символьных типа: char, signed char и unsigned char. Внутренним представлением символа является его код - целое число. Под величину любого символьного типа отводится одна единица памяти - байт:
sizeof(char) = sizeof(signed char) = sizeof(unsigned char) = 1
Размер байта зависит от реализации, однако этот размер должен быть достаточен, чтобы вместить код любого символа из набора символов реализации для данного компьютера. Наличие знака у типа char тоже зависит от реализации: он может совпадать либо с signed char, либо с unsigned char.
Величины символьных типов применяются также для хранения целых чисел, не превышающих границы указанных диапазонов, и могут участвовать в арифметических операциях, поэтому их также относят к целым типам.
Целые типы
В языке С++ определено 8 типов для хранения целочисленных величин: четыре знаковых ( signed char, short int, int, long int ) и четыре беззнаковых ( unsigned char, unsigned short int, unsigned int, unsigned long int ). По умолчанию все целочисленные типы считаются знаковыми, поэтому спецификатор signed можно не указывать. Ключевое слово unsigned позволяет представлять неотрицательные целые числа.
Типы с плавающей точкой
Стандарт С++ определяет три типа данных для хранения вещественных значений: float, double и long double. Все они имеют знак.
Внутреннее представление вещественного числа состоит из мантиссы и порядка. Длина мантиссы определяет точность числа, а длина порядка - его диапазон.
Константы с плавающей точкой имеют по умолчанию тип double. Можно явно указать тип константы с помощью суффиксов F, f ( float ) и L, l ( long ). Например, константа 2E+6L имеет тип long double.
Для вещественных типов в таблице приведены абсолютные величины минимальных и максимальных значений.
Тип void
Тип void используется для определения функций, которые не возвращают значения, для указания пустого списка аргументов функции, как базовый тип для указателей и в операции приведения типов.
Лекция 2. Базовые конструкции структурного программирования
Структура программы
Программа на языке С++ состоит из функций, описаний и директив препроцессора. О директивах мы говорили выше. Функция - это законченный фрагмент кода, к которому можно обратиться по имени (вызвать функцию). Функция может получать аргументы и возвращать в вызывающий код вычисленное в ней значение. Например, вызов функции, вычисляющей синус угла, может выглядеть примерно так же, как в математике: y = sin(x);.
Одна (и только одна) функция программы должна иметь имя main. Выполнение программы начинается с первого оператора этой функции. Ее вызывает на выполнение исполняющая система.
Описания представляют собой определения и объявления элементов программы: переменных, функций, классов, типов и т. д. Любой элемент программы должен быть определен только один раз. Это правило в стандарте называется правилом одного определения ( one definition rule, или odr ) . Объявление может встречаться в программе столько раз, сколько необходимо.
Итак, программа, состоящая из одного модуля, имеет следующую структуру:
· директивы препроцессора
· описания
int main()
{
операторы главной функции
}
В общем случае программа состоит из нескольких модулей, каждый из которых может содержать все рассмотренные элементы.