Первая программа

Кто бы и как к программированию не относился, но все согласятся, что программирование (само по себе) - это чисто прикладная специальность и/или наука. И научится программировать «в теории», только по учебникам (и программируя «на листочке») вообще говоря, очень сложно. А потому, как и для любой другой прикладной профессии, программисту нужна практика, практика и еще раз практика. Так уж повелось, что когда программист первый раз знакомится с новым языком, первое, что он пишет - это программу-приветствие.

Не смотря на то, что программа-приветствие и по сути и по структуре достаточно проста, тем не менее, как и любая другая программа, она начинается с постановки задачи. В данном случае формулировка задачи будет предельно простой:

Программа должна вывести на консоль строчку «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». Почему именно iostream? Потому что именно этот файл (в соответствии со стандартом языка C++) содержит нужное нам объявление, и некоторые другие (о которых речь пойдет позже). Таким образом, получаем следующий текст:

#include <iostream>
 
void PrintHello()
{
   std::cout << "Hello World!";
}

Отправив его на компиляцию, мы, тем не менее, опять получим ошибку. В этот раз нам будет сообщено о том, что компоновщик не может найти функцию main (_main, _main@8, или еще какое-либо похожее название). Причина, опять же, проста. Поскольку текст программы на C++ может содержать множество различных объявлений, и среди этих объявлений может быть некоторое количество объявлений функций, то компилятор должен выбрать какое-то одно из них, с которого начинать выполнение программы. С самого начала существования языка C++ (и его прародителя - языка C), такой функцией является функция main («главная функция»), объявляемая следующим образом:

int main()
{
}

И именно внутри этой функции должны содержаться инструкции, которые должны быть выполнены после старта программы. Учтя эти замечания, итоговый текст должен будет выглядеть следующим образом:

#include <iostream>
 
int main()
{
   std::cout << "Hello World!";
}

Отправив его на компиляцию, ошибок мы уже не получаем (правда, могут быть предупреждения), и запустив полученный исполняемый файл, мы увидим на консоли радостное

Hello World!

Итак, задача решена! Первая программа - написана! Можно себя поздравить. Но победа еще не окончательная. Не плохо было бы избавиться от предупреждения, которое выдается компилятором. Суть его сводится к тому, что функция main должна возвращать некоторое значение. В большинстве операционных систем исполняемые файлы устроены таким образом, что в качестве результата своей работы возвращают некоторое целое число, обычно обозначающее - насколько успешным оказался запуск программы. Это число в последствии можно проверить и, если программа отработала с ошибкой, предпринять какие-либо меры. По традиции, если программа запустилась и успешно отработала, то она должна вернуть 0. Инструкция, выполняющая это действие, будет, фактически, буквальным переводом с русского на английский:

return 0;

А итоговый текст приобретет такой вид:

#include <iostream>
 
int main()
{
   std::cout << "Hello World!";
   return 0;
}

Откомпилировав его можно убедиться, что на этот раз ни предупреждений, ни ошибок выдано не будет.

 
doc/cpp/teachbook/beginning/firstprog.txt · Последнее изменение: d.m.Y H:i — flex_ferrum
 
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki