「コンパイルできる」から「読める」へ
前のページでは、ソースファイルをコンパイラで実行可能なプログラムに変えました。今度は少し立ち止まって、そのファイルの中に実際に何があったのかを見ていきます。すべてのC++プログラムは同じわずかな構造要素から組み立てられており、それらを名付けられるようになれば、見慣れない .cpp ファイルがもはやノイズのようには見えなくなります。
ここに完全で実行可能なプログラムがあります。まず一度読んでから、一行ずつ分解していきましょう。
意味のある5行で、そのどれもが特定の役割を果たしています。順に見ていきましょう。
#include の行
#include <iostream>
この行は <iostream> ヘッダーを取り込み、cout のような入出力機能を使えるようにします。#include はプリプロセッサ指令で、本当のコンパイルの前に実行され、本質的にはそのヘッダーの内容をあなたのファイルに貼り付けます。
#include の行を特別なものにしている点が2つあります。
#で始まり、それがプリプロセッサ指令であることを示します。- セミコロンで終わらないこと。これは、これから身につける「すべての行は
;で終わる」という習慣の、唯一のよくある例外です。
cout を使っていながら #include <iostream> を忘れると、コンパイラは cout が何なのかを知らず、'cout' was not declared in this scope のようなエラーが出ます。解決策はほとんどの場合、include の付け忘れです。
main 関数
int main() {
// ...
return 0;
}
main はプログラムが始まる場所です。コンパイルしたプログラムを実行すると、実行は main の中の最初の行から始まり、main が値を返すと止まります。すべてのC++プログラムにはちょうど1つの main があります。それより多くも少なくもありません。
各部分は次のとおりです。
int-mainは整数をオペレーティングシステムに返します。慣例として0は「正常に終了した」を意味します。main()- 名前と、それに続くパラメータ用のかっこ(ここでは空)。{ ... }- 波かっこが本体、つまり実行される文を包みます。return 0;-mainを終了し、成功を報告します。省略しても、C++はmainが代わりに0を返したものとして扱いますが、書いておくと意図が明確になります。
文とセミコロン
文とは1つの完結した命令です。C++では、すべての文はセミコロンで終わります。
C++は改行や余分な空白を完全に無視します。コンパイラは文を1行に書こうと10行に書こうと気にしません。各文がどこで終わるかをコンパイラに伝えるのは ; です。次の3つはコンパイラにとってまったく同じです。
int a = 1; int b = 2;
int a = 1;
int b = 2;
int
a
= 1;
この自由さには、初心者が最もよく陥る落とし穴がついてきます。セミコロンの付け忘れです。ここで何が起こるか見てみましょう。
int x = 5 // <-- セミコロンがない
int y = 10;
expected ';' before 'int' のようなエラーが出ます。ここで注意すべき点があります。コンパイラは次の行に到達して初めて何かがおかしいと気づくため、報告される行番号は実際の間違いより1行下を指すことがよくあります。エラーが ; の欠落について触れているときは、メッセージにある行の1つ上の行を確認しましょう。
波かっこがブロックを定義する
コードをまとめるためにインデントを使う言語もありますが、C++は波かっこ { } を使います。対応する1組の波かっこに挟まれたものすべてが1つのブロックです。関数の本体、ループ、if 文はすべてこれを使います。
if の波かっこの中の2行は、条件が真のときだけ実行されます。最後の cout は波かっこの外にあるので、常に実行されます。
構造を定義するのはインデントではなく波かっこなので、C++はインデントを強制しません。それでもインデントはすべきです。インデントは、波かっこが定義する構造を人間が読み取るための手段だからです。よくあるバグは対応の取れていない波かっこです。すべての { には閉じ } が必要です。1つ忘れると、コンパイラはたいていファイルの末尾付近でエラーを報告し(expected '}' at end of input)、実際にミスした場所からは離れています。波かっこを数えたり、エディタに対応付けさせたりすれば、多くの混乱を避けられます。
cout と << による出力
cout はもう何度か見てきました。これは標準出力ストリームで、<< 演算子で値を送ります(「これを出力に入れる」と読みます)。
<< をつなげて、いくつかのものを続けて表示できます。endl は行を終わらせます(バッファのフラッシュも行います)。エスケープシーケンス "\n" は改行を出力するより軽量な方法です。簡単なプログラムならどちらでも構いません。
先頭にあるあの using namespace std; について。標準ライブラリの名前は std 名前空間にあるので、完全な名前は std::cout です。using namespace std; を一度書くと、std:: という接頭辞を省いて単に cout と書けます。短い例では便利ですが、大きなプロジェクトでは名前の衝突を避けるために明示的な std::cout を好むチームが多いので、どちらの書き方も見かけても驚かないでください。
これでどんなプログラムの骨組みも読めるようになりました
先頭の include、入口となる main 関数、セミコロンで終わる文、コードをブロックにまとめる波かっこ、そして出力のための cout << - この骨組みは、あなたがこれから開くほとんどすべてのC++ファイルにあります。言語の残りの部分は、このわずかな形の上に重ねられた細部にすぎません。プログラムが手ごわく見えたら、まず main を見つけ、次に文を順に読んでください。構造があなたを導いてくれます。
次は:コメント
今のところ、プログラムの各行はコンパイラが読むコードです。次は、コンパイラがあえて無視する行 - コメント - を加えて、自分自身や他の読み手のためにメモを残せるようにします。1行用の // 形式とブロック用の /* ... */ 形式、そしてそれぞれがどんなときに適切かを見ていきます。
よくある質問
なぜC++のすべての文にセミコロンが必要なのですか?
C++は改行や空白を無視するため、ある文がどこで終わり、次の文がどこから始まるのかを示す明確な目印が必要です。その目印がセミコロン ; です。セミコロンの付け忘れは初心者が最もよく遭遇するコンパイルエラーであり、報告される行番号は、付け忘れた行の次の行を指すことがよくあります。
C++のint main()は何をしますか?
main はプログラムが実行を開始する関数で、その最初の行から実行が始まり、戻り値を返したところで終了します。すべてのC++プログラムにはちょうど1つの main が必要です。int は整数のステータスコードをオペレーティングシステムに返すことを意味し、慣例的に 0 は成功を表します。
coutの前にstd::と書かなければなりませんか?
std::cout(完全修飾)と書くか、先頭に一度 using namespace std; を追加してから単に cout と書くかのどちらかです。修飾形は大きなファイルでより安全です。using namespace std; は小さな例やチュートリアルでよく使われる省略法です。