====== Первая программа ======
Кто бы и как к программированию не относился, но все согласятся, что программирование (само по себе) - это чисто прикладная специальность и/или наука. И научится программировать "в теории", только по учебникам (и программируя "на листочке") вообще говоря, очень сложно. А потому, как и для любой другой прикладной профессии, программисту нужна практика, практика и еще раз практика. Так уж повелось, что когда программист первый раз знакомится с новым языком, первое, что он пишет - это программу-приветствие.
Не смотря на то, что программа-приветствие и по сути и по структуре достаточно проста, тем не менее, как и любая другая программа, она начинается с постановки задачи. В данном случае формулировка задачи будет предельно простой:
**Программа должна вывести на консоль строчку "Hello World!" и завершить свою работу.**
Когда задача сформулирована, следующим шагом является поиск ее решения в "терминах" выбранного языка программирования. Строго говоря, в ряде случаев выбор языка программирования тоже может сильно зависть от формулировки задачи, но так как в нашем случае язык уже выбран - С++, то этот этап будет опущен.
Поскольку в самом начале этого раздела было выяснено, что С++ - это императивный язык программирования, то искомым решением должна быть инструкция (или набор инструкций), корректная(ый) с точки зрения языка С++, исполнение которой (которых) приводит к печати на консоль заданной строки ("Hello World"). Для поиска такой инструкции (или инструкций) надо последовательно найти ответы на ряд следующих вопросов:
1. //Можно ли в тексте программы на С++ описать текстовую строку?//\\
Да. Можно. Говоря по-простому, текстовой строкой является фрагмент исходного текста программы, заключенный в двойные кавычки. Таким образом, где-то в тексте программы должен быть следующий фрагмент:
"Hello World!"
2. //Можно ли в тексте программы на C++ взаимодействовать с консолью? В данном случае - с целью вывода чего-либо на нее?//\\
Да. Можно. Для этого надо обратиться к **глобальному объекту std::cout**. Что такое "//объект//" и почему он "//глобальный//" будет рассмотрено несколько позже. Сейчас достаточно просто запомнить это понятие, и то, что обратившись к такому "объекту" будет произведено обращение к консоли. Итак, где-то в тексте программы должен быть фрагмент:
std::cout
3. //Каким образом (используя объект std::cout) можно вывести что-либо на консоль, и можно ли вообще?//\\
Вывести можно. Странно, если бы способ обращения к консоли существовал, но только и всего. И ничего большего нельзя было бы сделать. А каким образом? Ответ весьма прост - посредством **операции вывода**. Возможно, что звучит несколько странно ("операция сложения" звучит привычнее, но "операция вывода"???), тем не менее, такая операция в языке C++ существует, и выглядит так: "<<". Первым операндом этой операции (стоящим слева от этого знака) должно быть то, куда осуществляется вывод. Вторым операндом - то, что выводится. Применительно к нашей задаче, слева будет стоять std::cout, справа - "Hello World!", и выглядеть все это будет так:
std::cout << "Hello World!"
А это уже выглядит как инструкция (в перевод е на русский читается как "вывести в std::cout строку "Hello World!"), но законченным предложением на языке C++ пока еще не является. Как любое предложение в русском языке заканчивается точкой, на языке C++ большинство предложений-инструкций заканчиваются знаком ';'. Таким образом, правильная запись выглядит так:
std::cout << "Hello World!";
Итак, записать инструкцию, выполняющую вывод на консоль нужной нам строки, у нас получилось. Для большинства интерпретируемых языков этого было бы достаточно. Но, опять же, в самом начале раздела мы выяснили, что C++ является компилируемым языком. А это означает, что написав в текстовом файле только приведенное выше предложение, и отправив его на компиляцию, мы получим ряд ошибок компиляции. Причина этого проста - правильная программа на C++ не может состоять только из одного предложения. Можно сказать больше: корректная программа на C++ не может состоять из предложений, т. к. она состоит из **объявлений**. Объявлять в C++ можно много чего. Это и классы, и структуры, и перечисления, и глобальные объекты, и константы. Но в настоящий момент нас интересует вполне конкретная разновидность объявлений - объявления функций. Так как именно функции могут содержать в себе конкретные наборы инструкций, которые впоследствии должны быть выполнены. Таким образом, полученное нами предложение-инструкцию надо поместить в **функцию**. Например, так:
void PrintHello()
{
std::cout << "Hello World!";
}
- именно таким (или подобным) образом в C++ выглядят объявления функций. Написав такой текст в исходном файле и отправив его на компиляцию, мы опять получаем сообщения об ошибке. Смысл этого сообщения будет такой (в переводе на русский): "Объявление std::cout не найдено". Причина его возникновения проста. В программе на C++ все, что используется, должно быть предварительно объявлено. В нашей программе мы используем глобальный объект std::cout, а при этом нигде его не объявляем. Таким образом, для осуществления корректной компиляции мы должны добавить это объявление. Но как оно должно выглядеть? Поскольку std::cout является стандартным глобальным объектом, представляющем консоль, то, по логике вещей, практически любой компилятор должен предлагать его объявление, не утруждая этим программиста. И это действительно так. Объявление этого глобального объекта можно "включить" из поставки компилятора в текст программы следующим образом:
#include
Перевести это можно примерно так: "Включить в текст программы содержимое файла iostream". Почему именно iostream? Потому что именно этот файл (в соответствии со стандартом языка C++) содержит нужное нам объявление, и некоторые другие (о которых речь пойдет позже). Таким образом, получаем следующий текст:
#include
void PrintHello()
{
std::cout << "Hello World!";
}
Отправив его на компиляцию, мы, тем не менее, опять получим ошибку. В этот раз нам будет сообщено о том, что компоновщик не может найти функцию main (_main, _main@8, или еще какое-либо похожее название). Причина, опять же, проста. Поскольку текст программы на C++ может содержать множество различных объявлений, и среди этих объявлений может быть некоторое количество объявлений функций, то компилятор должен выбрать какое-то одно из них, с которого начинать выполнение программы. С самого начала существования языка C++ (и его прародителя - языка C), такой функцией является **функция main** ("главная функция"), объявляемая следующим образом:
int main()
{
}
И именно внутри этой функции должны содержаться инструкции, которые должны быть выполнены после старта программы. Учтя эти замечания, итоговый текст должен будет выглядеть следующим образом:
#include
int main()
{
std::cout << "Hello World!";
}
Отправив его на компиляцию, ошибок мы уже не получаем (правда, могут быть предупреждения), и запустив полученный исполняемый файл, мы увидим на консоли радостное
Hello World!
Итак, задача решена! Первая программа - написана! Можно себя поздравить. Но победа еще не окончательная. Не плохо было бы избавиться от предупреждения, которое выдается компилятором. Суть его сводится к тому, что функция main должна возвращать некоторое значение. В большинстве операционных систем исполняемые файлы устроены таким образом, что в качестве результата своей работы возвращают некоторое целое число, обычно обозначающее - насколько успешным оказался запуск программы. Это число в последствии можно проверить и, если программа отработала с ошибкой, предпринять какие-либо меры. По традиции, если программа запустилась и успешно отработала, то она должна вернуть 0. Инструкция, выполняющая это действие, будет, фактически, буквальным переводом с русского на английский:
return 0;
А итоговый текст приобретет такой вид:
#include
int main()
{
std::cout << "Hello World!";
return 0;
}
Откомпилировав его можно убедиться, что на этот раз ни предупреждений, ни ошибок выдано не будет.