#include <iostream> 🔗
ソースコードの1行目から見ていきましょう。1行目にはこう書かれています。
まず #include
です。読み方はいくつかありますが、「シャープ インクルード」と読まれることが多いです。
しかし本当は、#
はナンバーサイン[1]という記号であって、シャープ(♯)[2] とは違います。
include は「含める」や「組み込む」といった意味をもつ英単語です。なにを含めるのかというと、その続きに書かれている <iostream>
をです。そして、どこに含めるのかというと、#include <iostream>
と書かれているところにです。
iostream はファイルの名前です(拡張子📘がないので変な感じがしますが)。<
と >
は単なる囲み記号ですが、必ずこの通りに書かなければなりません。なお、<iostream>
は「アイオーストリーム」と読みます。
iostream というファイルは、Visual Studio などの C++ のコンパイラ📘に付属しています。Visual Studio をインストール📘したときに、PC のどこか(インストールしたフォルダ)に作られています。
【C言語プログラマー】#include <iostream>
は、C言語の #include <stdio.h>
に代わるもので、標準の入出力機能を使うために必要な記述です。iostream は C++ の標準ライブラリに含まれている標準ヘッダの名前です。C言語の標準ヘッダと違って、C++ の標準ヘッダには拡張子が付きません。
【C言語プログラマー】stdio.h は使えなくなってしまったのか? と思われるかもしれませんが、C++ でも stdio.h は使えます。ただし、それはあくまでC言語の入出力機能を使っているということになります。C++ の入出力機能(iostream)とC言語の入出力機能(stdio)の混在には注意をはらわなければならないことがあるので、特別事情がないかぎりは、iostream だけを使っていたほうがいいです。
【上級】【C++23】<print> が追加され std::print関数や std::println関数という、C言語の printf関数に近い書き方ができる関数を使えるようになりました[3]。今後はこれらの関数を使う方向になっていくと思われますが、新C++編の解説は C++14ベースなので、以降のページでもこの方法は使いません。
#include <iostream>
と書くことによって、「この位置に、 iostream というファイルの内容を含める」という意味になります。言い換えると、「iostream に書かれている内容が、Hello, World のソースコードの中に直接書き込まれているかのようにあつかう」ということです。
イメージとしては、こういうことになります。
(この部分には iostream の内容がそっくりそのまま書かれていると考える)
int main()
{
std::cout << "Hello, World\n";
}
では、iostream にはどんなことが書かれているのでしょう。名前にヒントがあります。
iostream の「io」の2文字は、input と output を合体した表現である「I/O」のことです。
入力📘 (input) とは、データ📘をプログラムに与えることです。キーボードで文字を打ち込むことは入力にあたります。
出力📘 (output) とは、プログラムがデータを表示したり、書き出したりすることです。画面に “Hello, World” と表示することは出力にあたります。
そして、入出力📘 (input output、I/O) とは、入力と出力を両方ともする、あるいは両方ともできることをあらわしている言葉です。
iostream の「stream」の部分は「流れ」といった意味の英単語です。入力や出力のときのデータの流れ、という感じの意味合いです。
iostream に書かれているのは、入出力を実現するために必要な C++ のソースコードです。これ自体が C++ で書かれているので、#include <iostream>
と書いて、中身をそっくりそのまま取り入れられます。
Hello, Worldプログラムが #include <iostream>
という記述を必要としているのは、画面に “Hello, World” と「出力」することが目的のプログラムだからです。この実現のために出力機能を使いたいので、「iostream の内容を含める」という指示をしています。
なお、#include <iostream>
と記述することを人間の言葉では、「iostream をインクルードする」「iostream を取り込む」などと表現します。
「出力機能が使いたいから iostream をインクルードする」ように、今後は「〇〇が使いたいから、△△ をインクルードする」という対応関係がいくつも登場します。調べればわかることなので、暗記しなければならないわけではありませんが、インクルードを正しく記述しないと使えない機能があることは覚えておきましょう。
main関数 🔗
3行目には、次のように書かれています。
これは、main関数(main function)です。main関数は、C++ のプログラムに必ず必要なものです。なぜなら、C++ のプログラムの実行は、main関数からスタートするルールになっているからです。スタート地点が分からなければ実行を始められないので、main関数がないプログラムはビルドエラーになります。
int
と main
と ()
をそれぞれ分解して説明することもできますが、今のところは、int main()
をセットとしておきます。この通りに書けばいいです。特に main
は、main関数であることを表す名前なので、変えてはいけません。
実際には、4行目と6行目にある {
と }
もmain関数を記述するために必要です。{
と }
の内側にやりたいこと(=コンピュータにしてほしいこと)を書きます。
int main()
{
ここにやりたい処理を書く。
何行書いてもいい。
}
{
は main関数の始まりを表していて、C++ のプログラムの実行が開始されると、{
の次に書かれている処理が実行されます。その後は、下へ下へと実行が進みます。
}
は main関数の終わりを表しています。ここまで実行されたら、プログラムの実行そのものが終了します。
std::cout << “Hello, World” 🔗
続いて、5行目です。
std::cout << "Hello, World\n";
main関数の {
と }
に挟まれた部分です。プログラムの実行がはじまったら、ここが実行されます。
複雑なので、1つ1つ分解して説明します。
空白 🔗
まず、行の先頭には空白(半角の空白文字か、タブ文字📘)があります。
空白を入れる目的は、ソースコードの見やすさ・読みやすさを向上させるためです。ソースコードから、取り除くことができる空白を取り去ったとしたら、こうなります。
#include<iostream>
int main()
{
std::cout<<"Hello, World\n";
}
これでも、意味は変わらないのですが、少し見づらくなりました(主観ではありますが)。
どこにどのくらいの空白を入れるかについて、明確にルールがあるわけではありませんが、一般的に “よくある方針” はあります。{
と }
で囲まれた部分は、行ごとに先頭に同じ量の空白を空けるのも “よくある方針” の1つです(2、4、8個のいずれかの空白文字か、1個のタブ文字を入れることが多い)。ソースコードは自分1人が見るものだとは限りませんから(本格的な開発ではなおさら)、変なところで個性を出さず、“よくある方針” やチームのルールにしたがった方が良いです。
このソースコードにも、取り除かれていない空白があることに注目してください。int
と main
のあいだや、“Hello, World” の途中には空白が残っています。
int
と main
のあいだにある空白は、これがないと、intmain
のようにくっついてしまって、main関数であると認識できなくなります。main関数がないプログラムはビルドが成功しませんから、この空白は取り除けません。
一方、“Hello, World” の途中の空白は取り除けないわけではありませんが、出力する内容が変わってしまいます。それでも良いのなら、取り除くことは自由です。“Hello, World” の意味は、あとで説明します。
ところで、さらにいえば、ソースコード上の改行も取り除けるものがあります。たとえば、次のようにしても、プログラムの意味は変わりません。
#include<iostream>
int main(){std::cout<<"Hello, World\n";}
#include <iostream>
だけは1行で書かなければなりませんが、ほかの改行は無くせます。
もちろん、見づらいですから、すすんでこのような書き方をしてはいけません。
std::cout と << 🔗
次に登場するのは std::cout
です。
std
と ::
と cout
の3つに分けて説明できるのですが、当面、3つ合わせた std::cout
のつもりで扱うことにします。
std::cout は、C++ に標準で用意されている出力処理の機能のことです。画面に何か出力したいときに使います。この機能が使いたいから、#include <iostream>
が必要なのです。
std::cout を使うときの記述は、次のようになります。
<<
という記号を挟んで、出力したいものを記述します。
なぜ <<
なのかと思うかもしれませんが、左方向に向かっているようにみえる記号なので、データが出力機能へ向かって送り込まれているようにイメージするといいです。
【C言語プログラマー】<<
は見てのとおり、左シフト演算子です。C++ では、いくつかの演算子については、その意味をオペランド📘の型に応じて変更できます。ここでは、左オペランドが std::cout
(これはある型の変数名です)のときに、<<
の意味が出力処理に変更されています。
文字列リテラル 🔗
次に "Hello, World\n"
が現れます。これが「出力したいもの」です。
std::cout << "Hello, World\n";
注意が必要なのは、“” で囲まれていることです。文字の並びを “” で囲んだものを 文字列リテラル (string literal) といいます。文字列リテラルの内容は、プログラマーが自由に決められます。
文字列リテラルは、#include
とか int
などのように、C++ の機能を表したものとは少し異なる存在です。その区別のために “” が必要です。
たとえば、#include
に “” を付けて、
というように書いたら、文字列リテラルの "#include"
になってしまい、インクルードをおこなう機能の意味ではなくなります。文法的にもおかしくなってしまうので、ビルドエラーになります。
また、"Hello, World\n"
の “” を取って、
std::cout << Hello, World\n;
とすることも間違いです。“” で囲まれていない Hello, World\n
は、C++ の機能であるように解釈されますが、そのような機能はないので、ビルドエラーになります。
改行文字 🔗
"Hello, World\n"
にはもう1つ注目すべきものがあります。それは \n
です。
\n
は文字列リテラルの内側に記述できる特殊な文字で、この位置で改行📘することを示しています。"Hello, World\n"
であれば、「Hello, World」を出力した直後に改行を行います。
改行されたあとで何か出力すると、次の行の先頭から始まります。2つの Hello, World を出力して試してみます。
#include <iostream>
int main()
{
std::cout << "Hello, World\n";
std::cout << "Hello, World\n";
}
実行結果:
Hello, World
Hello, World
一方、次のプログラムは改行を行っていません。
#include <iostream>
int main()
{
std::cout << "Hello, World";
std::cout << "Hello, World";
}
実行結果:
Hello, WorldHello, World
おそらくこれは望んだ結果ではないでしょう。しかし、ビルドもできて、実行もできていることから分かるように、改行が必須というわけではありません。それでも、1行分の出力を終えるときには、きちんと改行したほうがいいです。
そうでないと、出力処理を書くたびに、直前の出力で改行してくれていたかどうかを気にしなければならなくなり、たとえば std::cout << "\nHello, World\n"
のように、先頭で改行しないと、新しい行に出力されることを保証できません。しかし、直前の出力がきちんと改行していたら、先頭の \n
のせいで余計な改行を入れてしまいます。
セミコロン 🔗
行の末尾に ;
があります。
;
は、1つの文📘 (statement) が終わることをあらわします。
std::cout << "Hello, World\n";
これで1つの文です。「文」も C++ の用語の1つなのですが、現時点できちんとした説明をすることは難しいので、とりあえずは日本語の「文」のイメージをしてください。日本語の「文」でいえば、;
は「。」に当たります。
難しいのは、#include <iostream>
には ;
が付いていませんし、main関数の終わりの }
の後ろにも ;
はないということです。;
があったりなかったりするのは、C++ の文法のルールなので、覚えるしかありません。