Hello, Worldプログラム | Programming Place Plus 新C++編

トップページ新C++編

このページの概要

このページでは、Hello, Worldプログラムを題材にして、C++ のプログラムの基本構造や、文法のルールを確認します。

以下は目次です。要点だけをさっと確認したい方は、「まとめ」をご覧ください。



Hello, Worldプログラム

このページから、本格的に C++ の学習に入っていきます。ここから先は、プログラミングとはどんなものなのか、どうやって書くのか、何が必要なのか、どうやって実行するのかといった事前の知識があるものとして進めます。前提知識に不安がある場合は先に、【導入】をひととおりお読みください。


【導入】初めての C++プログラミング」のページで登場した Hello, Worldプログラムを再び取り上げ、その内容をきちんと理解することから始めます。

Hello, Worldプログラムのソースコードは、以下のとおりです。

#include <iostream>

int main()
{
    std::cout << "Hello, World\n";
}

実行すると、次の結果が得られます。

実行結果:

Hello, World

#include <iostream>

ソースコードの1行目から見ていきましょう。1行目にはこう書かれています。

#include <iostream>

まず #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 だけを使っていたほうがいいです。

#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 をインクルードする」ように、今後は「〇〇が使いたいから、△△ をインクルードする」という対応関係がいくつも登場します。調べればわかることなので、暗記しなければならないわけではありませんが、インクルードを正しく記述しないと使えない機能があることは覚えておきましょう。

空の行

Hello, Worldプログラムの2行目には何も書かれていません。

何も書かれていないので、プログラムの動作には影響しませんが、ソースコードを見やすくするという、人間側にとっての効果があります。

ソースコードの “見やすさ”、“読みやすさ” を軽く考えてはいけません。Hello, Worldプログラム程度の量のソースコードでは大した効果を実感できませんが、プログラムの規模が大きくなってくると効果が出てきます。

main関数

3行目には、次のように書かれています。

int main()

これは、main関数(main function)です。main関数は、C++ のプログラムに必ず必要なものです。なぜなら、C++ のプログラムの実行は、main関数からスタートするルールになっているからです。スタート地点が分からなければ実行を始められないので、main関数がないプログラムはビルドエラーになります。

intmain() をそれぞれ分解して説明することもできますが、今のところは、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人が見るものだとは限りませんから(本格的な開発ではなおさら)、変なところで個性を出さず、“よくある方針” やチームのルールにしたがった方が良いです。

このソースコードにも、取り除かれていない空白があることに注目してください。intmain のあいだや、“Hello, World” の途中には空白が残っています。

intmain のあいだにある空白は、これがないと、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 を使うときの記述は、次のようになります。

std::cout << 出力したいもの;

<< という記号を挟んで、出力したいものを記述します。

なぜ << なのかと思うかもしれませんが、左方向に向かっているようにみえる記号なので、データが出力機能へ向かって送り込まれているようにイメージするといいです。

【C言語プログラマー】<< は見てのとおり、左シフト演算子です。C++ では、いくつかの演算子については、その意味をオペランドの型に応じて変更することができます。ここでは、左オペランドが std::cout(これはある型の変数名です)のときに、<< の意味が出力処理に変更されています。

文字列リテラル

次に "Hello, World\n" が現れます。これが「出力したいもの」です。

std::cout << "Hello, World\n";

注意が必要なのは、"" で囲まれていることです。文字の並びを "" で囲んだものを 文字列リテラル (string literal) といいます。文字列リテラルの内容は、プログラマーが自由に決められます。

文字列リテラルは、#include とか int などのように、C++ の機能を表したものとは少し異なる存在です。その区別のために "" が必要です。

たとえば、#include に "" を付けて、

"#include" <iostream>

というように書いたら、文字列リテラルの "#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++ の文法のルールなので、覚えるしかありません。

まとめ


新C++編の【本編】の各ページには、末尾に練習問題があります。ページ内で学んだ知識を確認する簡単な問題から、これまでに学んだ知識を組み合わせなければならない問題、あるいは更なる自力での調査や模索が必要になるような高難易度な問題をいくつか掲載しています。


参考リンク


練習問題

問題の難易度について。

★は、すべての方が取り組める入門レベルの問題です。
★★は、自力でプログラミングができるようなるために、入門者の方であっても取り組んでほしい問題です。
★★★は、本格的にプログラマーを目指す人のための問題です。

問題1 (確認★)

次のプログラムのエラーを指摘してください(複数あります)。

include <iostream>

int Main{}
{

    std::cout >> "Hello,     World\n"

}

解答・解説

問題2 (確認★)

次のプログラムの問題点を指摘してください。

    #include <iostream>

    int      main()
{


std::cout 
<<
    "Hello, World\n";

        }

解答・解説

問題3 (確認★)

以下の実行結果になるように、プログラムを作成してください。

12345

解答・解説

問題4 (確認★)

以下の実行結果になるように、プログラムを作成してください。

1
2
3

解答・解説

問題5 (確認★)

次のプログラムを実行すると、どのような出力結果になるか考えてください(この手の練習問題は、実際にプログラムを実行する前に、自分でソースコードを読んで、どうなるか考えてみてください)。

#include <iostream>

int main()
{
    std::cout << "Hello";
    std::cout << ",";
    std::cout << "World";
}

解答・解説

問題6 (調査★★★)

お使いの PC から、iostream というファイルがどこにあるか探してみてください。

※オンラインコンパイラを使っている場合は、この問題は飛ばしてください。

解答・解説


解答・解説ページの先頭



更新履歴




はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る