Menu

C++のHello World:最初のプログラムを1行ずつ解説

C++のHello Worldプログラムを1行ずつ解説します。#include <iostream>、int main()、std::cout と <<、std::endl と '\n' の違い、return 0、さらにコンパイル方法と初心者が最初につまずくエラーの直し方まで。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

プログラム

C++ の Hello World プログラムの全体は次のとおりです。Run を押すと、ブラウザ上でコンパイルして実行できます。

表示されるのは1行です。

Hello, World!

コードは5行で、それぞれに決まった役割があります。以下のセクションでは各行を順に見ていき、そのあと同じファイルを自分のコンピューターでビルドする方法と、最初に出るコンパイルエラーの意味を説明します。

1行ずつ見る

#include <iostream>

# で始まる行はプリプロセッサへの指示で、コンパイラ本体より前に実行されます。#include <iostream> は、標準ヘッダー <iostream>(入出力ストリーム)の宣言をその場所に取り込みます。std::cout と std::endl はこのヘッダーで宣言されています。C++ には組み込みの print 文がありません。出力は標準ライブラリの機能であり、この行でそれを使えるようにします。

int main() {

C++ のプログラムは、すべて main という関数から実行を始めます。main はちょうど1つだけ存在しなければならず、小文字で書く必要があります。前にある int は、main が終了時に OS へ整数を返すことを表します。空のカッコは、ここでは引数を受け取らないことを意味し、開き波カッコ { から関数の本体が始まります。

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

実際に出力を行うのはこの行です。

  • std::cout は標準出力ストリームで、ふつうはターミナルです。std:: という接頭辞は、cout が std 名前空間にあることを示します。標準ライブラリ全体はこの名前空間に置かれています。
  • << は挿入演算子です。右側の値を左側のストリームに送り込みます。連結して書くことができ、<< ごとに次の要素が同じ出力に追加されます。
  • "Hello, World!" は文字列リテラル、つまりダブルクォートで囲んだテキストです。
  • std::endl は行を終わらせます。
  • セミコロンは文の終わりを示します。C++ の文にはすべてセミコロンが必要です。

return 0;

return は main を終了し、OS に値を返します。慣例として 0 はプログラムの成功を意味し、それ以外の数値はエラーを表します。スクリプトやビルドツールはこの終了コードを読み取ります。main の中では、この行は省略できます。実行が閉じ波カッコに到達すると、C++ は return 0; と書いたものとして動作します。

閉じ波カッコ

閉じ波カッコで main の本体が終わり、それとともにプログラムも終わります。

std::endl と '\n' の違い

行を終わらせる方法は一般的に2つあり、どちらも実際のコードで使われています。

出力:

Hello, World!
Hello again!
Line one
Line two

見た目の結果は同じです。違いは、std::endl が改行を書いたあとにストリームをフラッシュし、バッファにたまったテキストをすぐターミナルへ送り出すことです。'\n' は改行を書くだけで、ストリームは自分のタイミングでフラッシュします(遅くともプログラム終了時)。何千行も出力するループでは、std::endl による余分なフラッシュがはっきりした差になるので、多くの C++ プログラマーはふだん '\n' を使い、テキストをすぐに表示する必要があるときだけ std::endl を使います。3行目のように、\n エスケープは文字列の中でも使えます。cout と cin について詳しくは 入力と出力のページ を参照してください。

using namespace std; を使う書き方

多くのチュートリアルでは、Hello World を次のように書いています。

using namespace std; は、ほかでは見つからない名前を std 名前空間から探すようコンパイラに指示するので、接頭辞なしで cout と endl が使えます。小さなプログラムや練習問題なら問題ありません。大きなコードやヘッダーファイルでは、ふつう避けられます。数百もの標準の名前がスコープに入り込み、自分で定義した名前(たとえば count や distance という関数)と衝突することがあるからです。std::cout と書くのは5文字増えるだけで、このリスクがなくなります。

自分のコンピューターで Hello World をコンパイルして実行する

ブラウザのエディターはコンパイルを代わりに行ってくれます。自分のマシンでは、同じ2つの手順を自分で行います。ソースファイルを実行ファイルにコンパイルし、その実行ファイルを実行します。まず C++ コンパイラをインストールしておく必要があります。Windows、macOS、Linux での導入方法は インストールガイド で説明しています。

プログラムを hello.cpp として保存し、同じフォルダでターミナルを開いてコンパイルします。

g++ hello.cpp -o hello

何も表示されなければ成功で、ソースファイルの隣に hello(Windows では hello.exe)という実行ファイルができています。実行してみましょう。

./hello

Windows では代わりに hello.exe、または単に hello を実行します。macOS では clang++ hello.cpp -o hello でも同じように動き、macOS の g++ はたいてい Clang の別名です。

最初から付けておきたいフラグが2つあります。-std=c++17(または -std=c++20)は言語の規格を選び、-Wall -Wextra は本物のミスを見つける警告を有効にします。

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

これらのフラグの意味、-o が何をするのか、そして -o を付けないと a.out というファイルができる理由は、C++ のコンパイルのページ で説明しています。

最初によく出るエラー

以下のエラーメッセージは GCC(g++)のものです。Clang ではメッセージの文言が違いますが、指し示す行は同じです。

セミコロンの付け忘れ。

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

コンパイラは次のトークンに到達して初めて ; がないことに気づくので、行番号はたいていミスの1行後を指します。その前の行の末尾を確認しましょう。

#include <iostream> の書き忘れ。

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

std::cout は <iostream> で宣言されています。ファイルの先頭にインクルードを追加しましょう。

std:: の付け忘れ。

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

std::cout と std::endl と書くか、インクルードのあとに using namespace std; を追加します。

main ではなく Main と書く。 C++ は大文字と小文字を区別します。int Main() のプログラムはコンパイルは通りますが、リンクの段階で undefined reference to 'main' となって失敗します。プログラムの開始点となる関数をリンカーが見つけられないためです。

g++ ではなく gcc でコンパイルする。 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++ ではありません。ヘッダーは .h の付かない <iostream> で、main は int を返さなければなりません。最近のコンパイラはどちらも受け付けません。

C++23 の std::println で出力する

C++23 では、1行を出力するもっと短い方法として、<print> ヘッダーの std::println が追加されました。

#include <print>

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

改行は自動で付き、値を埋め込む {} プレースホルダーも使えます。GCC 14、libc++ を使う Clang 18、最近のバージョンの Visual Studio で対応しており、-std=c++23 が必要です。既存のコードやチュートリアルのほとんどはまだ std::cout を使っているので、両方に慣れておく価値があります。

よくある質問

C++でHello Worldはどう書きますか?

まず #include <iostream> を書き、int main() を定義して、その中に std::cout << "Hello, World!" << std::endl; と return 0; を書きます。ファイルを hello.cpp として保存し、g++ hello.cpp -o hello でコンパイルして、./hello で実行します。

C++のHello Worldに #include <iostream> が必要なのはなぜですか?

std::cout と std::endl は言語に組み込まれているのではなく、<iostream> ヘッダーで宣言されています。インクルードしないとコンパイラはこれらの名前を知らず、'cout' is not a member of 'std' のようなエラーで止まります。

std::endl と '\n' の違いは何ですか?

どちらも行を終わらせます。std::endl はさらに出力バッファをフラッシュし、テキストをすぐに書き出させます。'\n' は改行を書くだけで、フラッシュはストリームの都合のよいときに任せるので、何行も出力する場合は速くなります。Hello World の1行だけなら、見た目の違いはありません。

C++の main の最後に return 0 は必要ですか?

必要ありません。main は C++ で return を省略できる唯一の関数で、閉じ波カッコに到達すると return 0; と書いたものとして扱われます。これはプログラムが成功したことを OS に伝えます。終了ステータスを明示するために、あえて書く人も多くいます。

Coddyのプログラミング言語のイラスト

Coddyでコードを学ぼう

始める