Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп
Шрифт:
Интервал:
Закладка:
{
cout << "Hello, World!n"; // вывод "Hello, World!"
return 0;
}
Для того чтобы определить отправную точку выполнения, каждая программа на языке С++ должна содержать функцию с именем main. Эта функция по существу представляет собой именованную последовательность инструкций, которую компьютер выполняет в порядке перечисления. Эта функция состоит из четырех частей.
• Тип возвращаемого значения, в этой функции — тип int (т.е. целое число), определяет, какой результат возвращает функция в точку вызова (если она возвращает какое-нибудь значение). Слово int является зарезервированным в языке С++ (ключевым словом), поэтому его нельзя использовать как имя чего-нибудь еще (см. раздел А.3.1).
• Имя, в данном случае main.
• Список параметров, заключенный в круглые скобки (см. разделы 8.2 и 8.6); в данном случае список параметров пуст.
• Тело функции, заключенное в фигурные скобки и перечисляющее действия (называемые инструкциями), которые функция должна выполнить.
Отсюда следует, что минимальная программа на языке С++ выглядит так:
int main() { }
Пользы от этой программы мало, так как она ничего не делает. Тело функции main программы “Hello, World!” содержит две инструкции:
cout << "Hello, World!n"; // вывод "Hello, World!"
return 0;
Во-первых, она выводит на экран строку Hello, World!, а затем возвращает значение 0 (нуль) в точку вызова. Поскольку функция main() вызывается системой, мы не будем использовать возвращаемое значение. Однако в некоторых системах (в частности, Unix/Linux) это значение можно использовать для проверки успешности выполнения программы. Нуль (0), возвращаемый функцией main(), означает, что программа выполнена успешно.
Часть программы на языке С++, определяющая действие и не являющаяся директивой #include (или другой директивой препроцессора; см. разделы 4.4 и А.17), называется инструкцией.
2.3. Компиляция
С++ — компилируемый язык. Это значит, что для запуска программы сначала необходимо транслировать ее из текстовой формы, понятной для человека, в форму, понятную для машины. Эту задачу выполняет особая программа, которая называется компилятором. То, что вы пишете и читаете, называется исходным кодом, или текстом программы, а то, что выполняет компьютер, называется выполняемым, объектным, или машинным кодом. Обычно файлы с исходным кодом программы на языке С++ имеют расширение .cpp (например, hello_world.cpp) или .h (например, std_lib_facilities.h), а файлы с объектным кодом имеют расширение .obj (в системе Windows) или .o (в системе Unix). Следовательно, простое слово код является двусмысленным и может ввести в заблуждение; его следует употреблять с осторожностью и только в ситуациях, когда недоразумение возникнуть не может. Если не указано иное, под словом код подразумевается исходный код или даже исходный код, за исключением комментариев, поскольку комментарии предназначены для людей и компилятор не переводит их в объектный код.
Компилятор читает исходный код и пытается понять, что вы написали. Он проверяет, является ли программа грамматически корректной, определен ли смысл каждого слова. Обнаружив ошибку, компилятор сообщает о ней, не пытаясь выполнить программу. Компиляторы довольно придирчивы к синтаксису. Пропуск какой-нибудь детали, например директивы #include, двоеточия или фигурной скобки, приводит к ошибке. Кроме того, компилятор точно так же абсолютно нетерпим к опечаткам. Продемонстрируем это рядом примеров, в каждом из которых сделана небольшая ошибка. Каждая из этих ошибок является довольно типичной.
// пропущен заголовочный файл
int main()
{
cout << "Hello, World!n";
return 0;
}
Мы не сообщили компилятору о том, что представляет собой объект, поэтому он сообщает об ошибке. Для того чтобы исправить программу, следует добавить директиву #include.
#include "std_facilities.h"
int main()
{
cout << "Hello, World!n";
return 0;
}
К сожалению, компилятор снова сообщает об ошибке, так как мы сделали опечатку в строке std_lib_facilities.h. Компилятор заметил это.
#include "std_lib_facilities.h
int main()
{
cout << "Hello, World!n;
return 0;
}
В этом примере мы пропустили закрывающую двойную кавычку ("). Компилятор указывает нам на это.
#include "std_lib_facilities.h"
integer main()
{
cout << "Hello, World!n";
return 0;
}
Теперь мы вместо ключевого слова int использовали слово integer, которого в языке С++ нет. Компилятор таких ошибок не прощает.
#include "std_lib_facilities.h"
int main()
{
cout < "Hello, World!n";
return 0;
}
Здесь вместо символов << (оператор вывода) использован символ < (оператор “меньше”). Компилятор это заметил.
#include "std_lib_facilities.h"
int main()
{
cout << 'Hello, World!n';
return 0;
}
Здесь вместо двойных кавычек, ограничивающих строки, по ошибке использованы одинарные. Приведем заключительный пример.
#include "std_lib_facilities.h"
int main()
{
cout << "Hello, World!n"
return 0;
}
В этой программе мы забыли завершить строку, содержащую оператор вывода, точкой с запятой. Обратите внимание на то, что в языке С++ каждая инструкция завершается точкой с запятой (;). Компилятор распознает точку с запятой как символ окончания инструкции и начала следующей. Трудно коротко, неформально и технически корректно описать все ситуации, в которых нужна точка с запятой.
Пока просто запомните правило: точку с запятой следует ставить после каждого выражения, которое не завершается закрывающей фигурной скобкой.
Почему мы посвятили две страницы и несколько минут вашего драгоценного времени демонстрации тривиальных примеров, содержащих тривиальные ошибки? Для того чтобы в будущем вы не тратили много времени на поиск ошибок в исходном тексте программы. Большую часть времени программисты ищут ошибки в своих программах. Помимо всего прочего, если вы убеждены, что некий код является правильным, то анализ любого другого кода покажется вам пустой тратой времени. На заре компьютерной эры первые программисты сильно удивлялись, насколько часто они делали ошибки и как долго их искали. И по сей день большинство начинающих программистов удивляются этому не меньше.
Компилятор иногда будет вас раздражать. Иногда кажется, что он придирается к несущественным деталям (например, к пропущенным точкам с запятыми) или к вещам, которые вы считаете абсолютно правильными. Однако компилятор, как правило, не ошибается: если он выводит сообщение об ошибке и отказывается создавать объектный код из вашего исходного кода, то это значит, что ваша программа не в порядке; иначе говоря, то, что вы