WisdomSoft - for your serial experiences.

2.1 最初のプログラム

プログラムの開始点となる main() 関数と、画面に文字を表示するための出力を説明します。

2.1.1 プログラムの起動と終了

まず、最初に何もしないで終了するだけの簡単なプログラムを作成してみましょう。前章の内容に従って、本書のサンプルプログラムを記述するには Windows コンソールアプリケーション用の空プロジェクトを用意してください。

コード1
int main()
{
	return 0;
}
実行結果
コード1 実行結果

コード1を実行してもコマンドプロンプトには何も表示されません。まずは、このプログラムを書いて正しくビルドできることを確認してください。入力に間違いが無ければ、エラーなくビルドできるはずです。

コンピュータ、そしてプログラミング言語は融通の利かない頑固なところがあります。私たち人間は、文章の中に多少の曖昧さや句読点の打ち間違い、誤字脱字などの記述ミスがあったとしても、前後の文章の流れなどから相手の意図を推論して理解できます。しかし、コンピュータの世界ではわずかな曖昧さや記述ミスさえ許されません。

もし、コードの中にセミコロン ; とコロン : の打ち間違いが 1 つでもあればエラーとなって ビルドできなくなります。実際に、このような単純な打ち間違いは初心者がよく頭を悩ませるエラーの原因となっています。もし、本書のサンプルプログラムを打ち込んでエラーが発生するようであれば、記号の位置や種類も含めて正確に入力できているか確認してください。特に、丸括弧 ( と波括弧 { の間違いや、全角文字が紛れている場合は発見が難しくなるので注意してください。

C++ 言語のプログラムは、複数の命令を集めた関数(function)と呼ばれるブロックが実行単位となります。従って、アプリケーションが起動したときに最初に実行する関数を用意しなければなりません。プログラムが起動したときに、最初に実行される場所をエントリーポイントと呼びます。

通常、C++ 言語で書かれたプログラムのエントリーポイントは main() という名前の関数です。アプリケーションが起動すると main() 関数の中の命令が順に実行され、関数の最後まで到達するとアプリケーションが終了します。コード1 の最初の行は、プログラムの開始地点である main() 関数を作成しています。

宣言 main() 関数
int main();

上の main() 関数の宣言とは、実際に Microsoft の Visual C++ の公式ドキュメント内に書かれている main() 関数の作り方を表したものです。関数は値を受け取ったり、値を返すという機能があるため、どのような値を受け取ることができ、どのような値を返すのかを表明する必要があります。このような、関数の名前や受け渡しするデータを表したものを宣言(declaration)と呼びます。

main() 関数について Visual C++ のドキュメントを検索すると上のような宣言が表示されるので、そこから main() 関数の仕組みを調べることができます。上記のように宣言はセミコロンで終わっていますが、プログラムの中で main()  を作るときはコード1 のように { } で括って関数の本体を書く必要があります。これを関数の定義(definition)と呼びます。

main() 関数の定義は、以下の形になります。

int main()
{
	//この関数が処理する命令
}

関数や宣言と定義に違いについては基礎的な文法を一通り解説した後に、もう一度詳しくご紹介します。まずは C++ のプログラムは上記のような形で始まると覚えてください。プログラムが起動したときに、実際に CPU によって実行される命令は  main() 関数の { } 内に記述します。

コード1 の 3 行目は return 文と呼ばれる命令で、main() 関数を終了して 0 を結果として返しなさいという意味です。この return 文が実行された時点で main() 関数の処理が終わり、アプリケーションも終了します。

ここで返した値は、このプログラムを実行したシステムや別のプログラムに実行結果として渡されます。特に意味のある値を返す必要がない場合は 0 を指定すれば問題ありません。

2.1.2 テキストを表示する

プログラムが意図したとおりに動作しているかどうかを確認するためには、結果を画面に表示する必要があります。そこで、プログラミング言語を学習するときは、最初に必ずテキストを表示する方法を学びます。

コンピュータの世界では、機器の間でデータを受け渡しすることを入出力(input/output)と呼びます。このうち、別の機器に向かってデータを送信することを出力と呼び、別の機器からデータを受信することを入力と呼びます。プログラムで扱っているデータを画面に表示するには、データをディスプレイに出力する必要があります。

画面にテキストを表示するだけのプログラムであれば、とても簡単です。C++ 言語では 1 行のコードだけで任意のデータを出力できます。

std::cout << "Kitty on your lap";

これで、画面には二重引用符 "" で括ったテキスト Kitty on your lap が表示されます。このコードに含まれている意味を正しく理解することは簡単ではありません。std::cout にも << という記号にも明確な意味があり、魔法の呪文ではないのです。

最初の std::cout とは、テキストとして画面に表示したいデータの出力先を表しています。std::cout に対してデータを出力すると、通常は画面(Windows であればコマンドプロンプト)にテキストとしてデータが表示されるでしょう。続く << 記号は std::cout に対して右に指定したデータを出力するという意味を持ち、<< 記号に続いて表示したいデータを記述します。二重引用符で囲まれた部分は文字列と呼びます。文字列の内容は任意に変更できます。

これらのコードが持つ本質的な意味や機能を理解するには C++ 言語の全容を理解する必要があります。細かい疑問が残るかもしれませんが、今は C++ 言語の基礎を学習するために、画面にデータを表示するには上記のように書くのだと理解してください。

コード2
#include <iostream>

int main()
{
	std::cout << "Kitty on your lap\n";
	return 0;
}
実行結果
コード2 実行結果

コード2は、コマンドプロンプトに文字列を表示するプログラムです。コードの先頭に #include <iostream> が追加されていますが、これは std::cout の機能を使うために必要になります。この #include 命令は、コンパイル時に < > 内に指定したファイルをコード内に取り込むという作用があります。#include 命令で別のソースファイルを取り込むことをインクルードすると呼びます。また、iostream のような標準機能を利用するためにインクルードするファイルのことをヘッダファイル(header file)と呼びます。

コード2では iostream というヘッダファイルをソースファイルの冒頭に取り込んでいます。この iostream ファイル内に std::cout を使うために必要なコードが含まれています。

文字列の末尾にある \n は改行を表しています。Visual C++ の「デバックなしで開始」から起動すると、プログラム終了時に「続行するには何かキーを押してください . . .」というテキストが追加されるので、プログラムから出力した結果のレイアウトのために使っているだけです。必要なければ省略してもかまいません。

std::cout への出力を複数の行に分けて記述することもできます。出力したいデータが複数ある場合、データごとに std::cout に出力します。

std::cout << "HELLO!!\n";
std::cout << "Dazzling World\n";

複数のデータを << 記号で繋げて同時に出力することもできます。

std::cout << "HELLO!!\n" << "Dazzling World\n";

上記の場合、2 つの文字列を順に std::cout へ出力することを表します。文字列 "HELLO!!\n" に続いて、さらに << 記号と文字列 "Dazzling World\n" が追加されています。これは、std::cout に個別に出力した場合と同じです。

2.1.3 C言語の流儀

C++ 言語は前進となった C 言語と互換性があり、C 言語で書かれたプログラムの大部分は C++ 言語としてもコンパイルできます。これは C++ 言語が C 言語の文法を踏襲し、新しい文法を追加した仕様になっているためです。本書で解説する対象は C++ 言語ですが、基本的な文法の多くは C 言語でも共通しています。

多くの C++ コンパイラは C コンパイラの機能も兼ねています。Visual Studio ではソースファイルの拡張子が cpp であれば C++ 言語のソースファイルと解釈し、c であれば C 言語のソースファイルだと解釈します。Visual Studio の項目には「C++ ファイル(.cpp)」しか存在しませんが、ファイル名の拡張子を .c に変更すれば、自動的に C 言語のソースファイルとしてコンパイルされます。

図1 C言語のソースとC++言語のソース
図1 C言語のソースとC++言語のソース

同一のプロジェクト内で C 言語のソースと C++ 言語のソースを混在させることも可能です。C 言語で書かれた既存のプログラムを C++ 言語のプロジェクトで利用することも難しくはありません。

文法と同じように C++ 言語は C 言語で標準に備えられていた機能に加えて、C++ 固有の新しい機能を追加しています。例えばコード2でテキストを出力するために std::cout と記述しましたが、これは 標準 C++ で追加された新しい機能の 1 つです。当然 C 言語で使うことはできません。C 言語でテキストを画面に表示するには printf() 関数を使っていました。

printf() 関数を利用するには、先に stdio.h ファイルをインクルードしなければなりません。

コード3
#include <stdio.h>

int main()
{
	printf("Kitty on your lap\n");
	return 0;
}
実行結果
コード3 実行結果

コード3コード2と同じ結果ですが std::cout ではなく printf() 関数を使ってテキストを出力しています。C 言語の入門書では、最初にテキストを出力するプログラムとしてコード3のように printf() 関数を使っています。

コード3は C 言語としてもコンパイルすることができ、C++ 言語としてもコンパイルできます。コード3の形で問題はないのですが標準 C++ に準拠した形で printf() 関数を使いたい場合は stdio.h ではなく cstdio をインクルードします。

C 言語では stdio.h のように、標準で提供されるヘッダファイルの拡張子は h でした。しかし C++ 言語では標準で提供されるヘッダファイルには iostream や cstdio のように拡張子が付いていません。しかし、C++ 言語にも歴史的な経緯があり、標準 C++ が定められる前の古い環境では拡張子付きの iostream.h が使われていました。Visual C++ .NET 2003 より前の古い環境や書籍では iostream.h をインクルードしているコードがありますが、これは古いソースファイルなので注意してください。現在では iostream をインクルードします。

コード4
#include <cstdio>

int main()
{
	printf("Kitty on your lap\n");
	return 0;
}
実行結果
コード4 実行結果

コード4コード3と同じ内容ですが、インクルードしているファイルが標準 C++ に従って cstdio になっています。標準 C++ に準拠したコードとして printf() 関数を使いたい場合は stdio.h ではなく cstdio をインクルードするべきです。

他の C 言語用のヘッダファイルも同様の命名規則で提供されています。ヘッダファイル名の先頭に c を付け加え、拡張子を取り除いたものが C++ 言語用のヘッダファイルです。本書は C++ 言語の解説書なので printf() 関数など C 言語の標準関数については割愛します。