Menu

Hello World на C++: первая программа, строка за строкой

Программа Hello World на C++ с разбором каждой строки: #include <iostream>, int main(), std::cout и <<, std::endl против '\n', return 0, а также как её скомпилировать и исправить первые ошибки новичков.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Программа

Вот полная программа Hello World на C++. Нажмите Run, чтобы скомпилировать и выполнить её прямо в браузере:

Она печатает одну строку:

Hello, World!

Пять строк кода, и у каждой своя задача. Ниже они разобраны по порядку, а затем показано, как собрать тот же файл на своём компьютере и что обычно означают первые ошибки компилятора.

Строка за строкой

#include <iostream>

Строки, начинающиеся с #, это инструкции для препроцессора, который работает до самого компилятора. #include <iostream> вставляет объявления из стандартного заголовка <iostream> (потоки ввода и вывода). Именно в этом заголовке объявлены std::cout и std::endl. Встроенной инструкции печати в C++ нет: вывод это часть стандартной библиотеки, и эта строка её подключает.

int main() {

Любая программа на C++ начинает выполнение с функции main. Она должна быть ровно одна и записана строчными буквами. int перед ней говорит, что по завершении main возвращает операционной системе целое число. Пустые скобки означают, что здесь она не принимает аргументов, а открывающая фигурная скобка { начинает тело функции.

std::cout << "Hello, World!" << std::endl;

Эта строка и выполняет печать.

  • std::cout это стандартный поток вывода, обычно терминал. Префикс std:: говорит, что cout находится в пространстве имён std, где хранится вся стандартная библиотека.
  • << это оператор вставки. Он отправляет значение справа от себя в поток слева. Его можно выстраивать в цепочку, и каждый << добавляет следующий фрагмент к тому же выводу.
  • "Hello, World!" это строковый литерал: текст в двойных кавычках.
  • std::endl завершает строку.
  • Точка с запятой завершает инструкцию. Она нужна каждой инструкции в C++.

return 0;

return завершает main и передаёт значение операционной системе. По соглашению 0 означает, что программа завершилась успешно, а любое другое число сигнализирует об ошибке. Этот код возврата читают скрипты и инструменты сборки. Внутри main эта строка необязательна: если выполнение доходит до закрывающей скобки, C++ ведёт себя так, будто вы написали return 0;.

Закрывающая скобка

Закрывающая фигурная скобка завершает тело main, а вместе с ним и программу.

std::endl против '\n'

Есть два распространённых способа завершить строку, и оба встречаются в реальном коде:

Вывод:

Hello, World!
Hello again!
Line one
Line two

Видимый результат одинаковый. Разница в том, что std::endl записывает перевод строки, а затем сбрасывает поток, сразу выталкивая весь накопленный в буфере текст в терминал. '\n' записывает только перевод строки, а поток сбрасывается по своему расписанию (самое позднее при завершении программы). В цикле, который печатает тысячи строк, лишние сбросы от std::endl дают ощутимую разницу, поэтому многие программисты на C++ по умолчанию пишут '\n' и используют std::endl, только когда текст должен появиться немедленно. Управляющая последовательность \n работает и внутри строки, как показывает третья строка. Подробнее cout и cin разобраны на странице про ввод и вывод.

Версия с using namespace std;

Во многих учебниках Hello World пишут так:

using namespace std; говорит компилятору искать в пространстве имён std имена, которые иначе он не найдёт, поэтому cout и endl работают без префикса. Для небольших программ и упражнений это нормально. В больших проектах и в заголовочных файлах так обычно не делают, потому что это втягивает в область видимости сотни стандартных имён, и они могут конфликтовать с вашими (например, с вашей функцией count или distance). Запись std::cout стоит пяти символов и снимает этот риск.

Компиляция и запуск Hello World на своём компьютере

Редактор в браузере компилирует за вас. На своей машине вы делаете те же два шага сами: компилируете исходный файл в исполняемый файл, а затем запускаете исполняемый файл. Сначала нужно установить компилятор C++; как это сделать в Windows, macOS и Linux, описано в руководстве по установке.

Сохраните программу как hello.cpp, откройте терминал в той же папке и скомпилируйте её:

g++ hello.cpp -o hello

Если ничего не напечаталось, всё получилось, и рядом с исходным файлом теперь лежит исполняемый файл hello (hello.exe в Windows). Запустите его:

./hello

В Windows вместо этого запустите hello.exe или просто hello. В macOS так же работает clang++ hello.cpp -o hello, а g++ там обычно и есть Clang под другим именем.

Два флага стоит добавлять с самого начала: -std=c++17 (или -std=c++20) выбирает стандарт языка, а -Wall -Wextra включает предупреждения, которые ловят настоящие ошибки:

g++ -std=c++17 -Wall -Wextra hello.cpp -o hello

На странице про компиляцию C++ объяснено, что делают эти флаги, что означает -o и почему без него получается файл a.out.

Частые первые ошибки

Тексты ошибок ниже взяты из GCC (g++). Clang формулирует сообщения иначе, но указывает на ту же строку.

Пропущенная точка с запятой.

hello.cpp:5:5: error: expected ';' before 'return'

Компилятор замечает пропущенную ;, только когда доходит до следующего токена, поэтому номер строки обычно указывает на строку после ошибки. Проверьте конец предыдущей строки.

Нет #include <iostream>.

error: 'cout' is not a member of 'std'

std::cout объявлен в <iostream>. Добавьте include в начало файла.

Нет std::.

error: 'cout' was not declared in this scope; did you mean 'std::cout'?

Либо пишите std::cout и std::endl, либо добавьте using namespace std; после include.

Main вместо main. C++ различает регистр. Программа с int Main() компилируется, но падает на этапе компоновки с undefined reference to 'main', потому что компоновщик не находит функцию, с которой программа должна начинаться.

Компиляция через gcc вместо g++. gcc hello.cpp компилирует код на C++, но не подключает стандартную библиотеку C++, и вы получаете длинный список ошибок undefined reference to std::.... Для файлов C++ используйте g++ (или clang++).

Типографские кавычки. Код, скопированный из текстового редактора или с веб-страницы, может содержать типографские кавычки (“Hello”) вместо прямых ("Hello"). GCC сообщает stray '\342' in program. Наберите кавычки заново в своём редакторе.

Старые заголовки и void main. В некоторых очень старых учебниках используют #include <iostream.h> или void main(). Ни то, ни другое не является стандартным C++: заголовок называется <iostream> без .h, а main должна возвращать int. Современные компиляторы отвергают оба варианта.

Печать через std::println в C++23

В C++23 появился более короткий способ напечатать строку: std::println из заголовка <print>:

#include <print>

int main() {
    std::println("Hello, World!");
}

Он сам добавляет перевод строки и поддерживает заполнители {} для значений. Поддержка появилась в GCC 14, в Clang 18 с libc++ и в свежих версиях Visual Studio, и для неё нужен -std=c++23. Большая часть существующего кода и учебников по-прежнему использует std::cout, так что стоит свободно владеть обоими способами.

Часто задаваемые вопросы

Как написать Hello World на C++?

Начните с #include <iostream>, затем определите int main() и поместите внутрь std::cout << "Hello, World!" << std::endl;, а после этого return 0;. Сохраните файл как hello.cpp, скомпилируйте его командой g++ hello.cpp -o hello и запустите ./hello.

Зачем Hello World на C++ нужен #include <iostream>?

std::cout и std::endl объявлены в заголовке <iostream>, а не встроены в язык. Без этого include компилятор не знает этих имён и останавливается с ошибкой вроде 'cout' is not a member of 'std'.

В чём разница между std::endl и '\n'?

Оба завершают строку. std::endl к тому же сбрасывает буфер вывода, сразу выталкивая текст наружу. '\n' только записывает перевод строки и позволяет потоку сбросить буфер, когда он будет готов, а это быстрее, когда вы печатаете много строк. Для одной строки Hello World видимой разницы нет.

Нужен ли return 0 в конце main в C++?

Нет. main единственная функция, в которой C++ разрешает опустить return: достижение закрывающей скобки считается как return 0;, то есть сообщает операционной системе, что программа завершилась успешно. Многие всё равно его пишут, чтобы код возврата был виден явно.

Иллюстрация языков программирования Coddy

Учитесь программировать с Coddy

НАЧАТЬ