В С++ действие называется выражением, а выражение, заканчивающееся точкой с
запятой, – инструкцией. Инструкция – это атомарная часть С++ программы, которой в
программе на С++ соответствует предложение естественного языка. Вот примеры
инструкций С++:
cout << "значение переменной book_count: " << book_count;
Первая из приведенных инструкций является инструкцией объявления. book_count
можно назвать идентификатором, символической переменной (или просто переменной)
или объектом. Переменной соответствует область в памяти компьютера, соотнесенная с
определенным именем (в данном случае book_count), в которой хранится значение типа
(в нашем случае целого). 0 – это константа. Переменная book_count инициализирована
значением 0.
Вторая инструкция – присваивание. Она помещает в область памяти, отведенную
переменной book_count, результат сложения двух других переменных –
books_on_shelf и books_on_order. Предполагается, что эти две целочисленные
переменные определены где-то ранее в программе и им присвоены некоторые значения.
int book_count = 0;
book_count = books_on_shelf + books_on_order;
Третья инструкция является инструкцией вывода. cout – это выходной поток,
направленный на терминал, << – оператор вывода. Эта инструкция выводит в cout – то
есть на терминал – сначала символьную константу, заключенную в двойные кавычки
("значение переменной book_count: "), затем значение, содержащееся в области памяти,
отведенном под переменную book_count. В результате выполнения данной инструкции
мы получим на терминале сообщение:
значение переменной book_count: 11273
если значение book_count равно 11273 в данной точке выполнения программы.
Инструкции часто объединяются в именованные группы, называемые функциями. Так,
группа инструкций, необходимых для чтения исходного файла, объединена в функцию
readIn(). Аналогичным образом инструкции для выполнения оставшихся подзадач
сгруппированы в функции sort(), compact() и print().
В каждой С++ программе должна быть ровно одна функция с именем main(). Вот как
может выглядеть эта функция для нашего алгоритма:
int main()
{
readIn();
sort();
compact();
print();
return 0;
}
Исполнение программы начинается с выполнения первой инструкции функции main(), в
нашем случае – вызовом функции readIn(). Затем одна за другой исполняются все
дальнейшие инструкции, и, выполнив последнюю инструкцию функции main(),
программа заканчивает работу.
Функция состоит их четырех частей: типа возвращаемого значения, имени, списка
параметров и тела функции. Первые три части составляют прототип функции.
Список параметров заключается в круглые скобки и может содержать ноль или более
параметров, разделенных запятыми. Тело функции содержит последовательность
исполняемых инструкций и ограничено фигурными скобками.
В нашем примере тело функции main() содержит вызовы функций readIn(), sort(),
compact() и print(). Последней выполняется инструкция
return 0;
Инструкция return обеспечивает механизм завершения работы функции. Если оператор
return сопровождается некоторым значением (в данном примере 0), это значение
становится возвращаемым значением функции. В нашем примере возвращаемое значение
0 говорит об успешном выполнении функции main(). (Стандарт С++ предусматривает,
что функция main() возвращает 0 по умолчанию, если оператор return не использован
явно.)
Давайте закончим нашу программу, чтобы ее можно было откомпилировать и выполнить.
Во-первых, мы должны определить функции readIn(), sort(), compact() и print().
void readIn() { cout << "readIn()\n"; }
void sort() { cout << "sort()\n"; }
Для начала вполне подойдут заглушки:
void compact() { cout << "compact()\n"; }
void print() { cout << "print ()\n"; }
Тип void используется, чтобы обозначить функцию, которая не возвращает никакого
значения. Наши заглушки не производят никаких полезных действий, они только
выводят на терминал сообщения о том, что были вызваны. Впоследствии мы заменим их
на реальные функции, выполняющие нужную нам работу.
Пошаговый метод написания программ позволяет справляться с неизбежными ошибками.
Попытаться заставить работать сразу всю программу – слишком сложное занятие.
Имя файла с текстом программы, или исходного файла, как правило, состоит из двух
частей: собственно имени (например, bookstore) и расширения, записываемого после
точки. Расширение, в соответствии с принятыми соглашениями, служит для определения
назначения файла. Файл bookstore.h является заголовочным файлом для С или С++
программы. (Необходимо отметить, что стандартные заголовочные файлы С++ являются
исключением из правила: у них нет расширения.)
Файл bookstore.c является исходным файлом для нашей С программы. В операционной
системе UNIX, где строчные и прописные буквы в именах файлов различаются,
расширение .C обозначает исходный текст С++ программы, и в файле bookstore.C
располагается исходный текст С++.
В других операционных системах, в частности в DOS, где строчные и прописные буквы
не различаются, разные реализации могут использовать разные соглашения для
обозначения исходных файлов С++. Чаще всего употребляются расширения .cpp и
.cxx: bookstore.cpp, bookstore.cxx.
Заголовочные файлы С++ программ также могут иметь разные расширения в разных
реализациях (и это одна из причин того, что стандартные заголовочные файлы С++ не
имеют расширения). Расширения, используемые в конкретной реализации компилятора
С++, указаны в поставляемой вместе с ним документации.
Итак, создадим текст законченной С++ программы (используя любой текстовый
редактор):
}
#include
using namespace std;
void readIn() { cout << "readIn()\n"; }
void sort() { cout << "sort()\n"; }
void compact() { cout << "compact()\n"; }
void print() { cout << "print ()\n"; }
int main()
{
readIn();
sort();
compact();
print();
return 0;
Здесь iostream – стандартный заголовочный файл библиотеки ввода/вывода (обратите
внимание: у него нет расширения). Эта библиотека содержит информацию о потоке cout,
используемом в нашей программе. #include является директивой препроцессора,
заставляющей включить в нашу программу текст из заголовочного файла iostream.
Непосредственно за директивой препроцессора
#include
следует инструкция
using namespace std;
Эта инструкция называется директивой using. Имена, используемые в стандартной
библиотеке С++ (такие, как cout), объявлены в пространстве имен std и невидимы в
нашей программе до тех пор, пока мы явно не сделаем их видимыми, для чего и
применяется данная директива.
После того как исходный текст программы помещен в файл, скажем prog1.C, мы должны
откомпилировать его. В UNIX для этого выполняется следующая команда:
$ CC prog1.C
Здесь $ представляет собой приглашение командной строки. CC– команда вызова
компилятора С++, принятая в большинстве UNIX-систем. Команды вызова компилятора
могут быть разными в разных системах.
Одной из задач, выполняемых компилятором в процессе обработки исходного файла,
является проверка правильности программы. Компилятор не может обнаружить
смысловые ошибки, однако он может найти формальные ошибки в тексте программы.
Существует два типа формальных ошибок:
синтаксические ошибки. Программист может допустить “грамматические”, с точки
зрения языка С++, ошибки. Например:
int main( { // ошибка – пропущена ')'
readIn(): // ошибка – недопустимый символ ':'
sort();
compact();
print();
return 0 // ошибка – пропущен символ ';'}
ошибки типизации. С каждой переменной и константой в С++ сопоставлен некоторый
тип. Например, число 10 – целого типа. Строка "hello", заключенная в двойные
кавычки, имеет символьный тип. Если функция ожидает получить в качестве параметра
целое значение, а получает символьную строку, компилятор рассматривает это как
ошибку типизации.
Сообщение об ошибке содержит номер строки и краткое описание. Полезно
просматривать список ошибок, начиная с первой, потому что одна-единственная ошибка
может вызвать цепную реакцию, появление “наведенных” ошибок. Исправление этой
единственной ошибки приведет и к исчезновению остальных. После исправления
синтаксических ошибок программу нужно перекомпилировать.
После проверки на правильность компилятор переводит исходный текст в объектный код,
который может быть понят и исполнен компьютером. Эту фазу работы компилятора
называют генерацией кода.
В результате успешной компиляции образуется выполняемый файл. Если запустить
выполняемый файл, полученный в результате компиляции нашей программы, на
readIn()
sort()
compact()
терминале появится следующий текст:
print()
В С++ набор основных типов данных – это целый и вещественный числовые типы,
символьный тип и логический, или булевский. Каждый тип обозначается своим
ключевым словом. Любой объект программы ассоциируется с некоторым типом.
Например:
bool found = false;
int age = 10;
double price = 19.99;
char delimiter = ' ';
Здесь определены четыре объекта: age, price, delimiter, found, имеющие
соответственно типы целый, вещественный с двойной точностью, символьный и
логический. Каждый объект инициализирован константой – целым числом 10,
вещественным числом 19.99, символом пробела и логическим значением false.
Между основными типами данных может осуществляться неявное преобразование типов.
Если переменной age, имеющей тип int, присвоить константу типа double, например:
age = 33.333;
то значением переменной age станет целое число 33. |