今日は、簡単なプログラムを例として、「とりあえず C++ を使ってみる」ことを第一の目標にする。それから、 Fortran と対応さ せながら関数、制御構造などを見ていく。
#include <iostream> using namespace std; int main() { double a, b, c; cin >>a >> b; c = a + b ; cout << "a+b=" << c << endl; return 0; }
上のプログラムは、簡単な C++ プログラムである。まずこのプログラ ムを動かしてみるということが目標である。まず、このプログラムはどういうも のかを説明しておく。
なお、同じことを Fortran で書くと多分こんな感じである。
program sample real*8 a, b, c read(5,*) a, b c = a + b write(6,*) 'a+b=', c end
比べてみると、まあ、似ているところもあるし違うところもある。とりあえず 順番に見ていこう、、、、といいたいところだが、最初の2行はちょっと後回 し。
まず int main() である。これは、「プログラムの始まり」を示すものであるところは Fortran における program sample と変わらないが、細かくいうといろいろ違 う。 Fortran では、 program 文は実はなくてもよくて、プログラム文で始ま る、またはいきなり始まるプログラム単位(とはなに、、、というのは省略) が「メインプログラム」、つまり、プログラムの実行がそこから始まるもので あった。
つまり、 Fortran では、まずメインプログラムがあって、それがサブルーチ ンとか関数を呼び出すという形になっており、メインプログラム、サブルーチ ン、関数のどれであるかで書き方がすこしずつ違っていた。
C/C++ でも同じようにメインプログラムがあって、それがサブルーチンや関数 を呼び出していくわけだが、 Fortran と大きく違うのは「宣言のしかたに区 別がなくてみな関数の形で宣言する」ということである。メインプログラムは 「 main という名前の関数」であり、そういう名前をつけておくとリン カがここから実行を始めるようにしてくれる。逆に、main という名前の関数 がないとリンク時にエラーにになる。
関数とサブルーチンの違いは値を返すかどうかということだけなので、 C/C++ で は値を返さない関数も許すことで統一的な記法を可能にしている。
元に戻ると、 main関数の宣言は
int main() { 関数の本体 }という形になっている。ここで int は関数の型であり、ここでは整数 型ということになる。
C/C++ で使う基本的な型には以下のようなものがある
整数型では長さを指定出来る。このあたりから処理系依存になってくるが、 short, long, long long といったものが指定できる。さらに、符号ありかど うかを signed/unsigned とつけることで区別できる。したがって、 unsigned long long int と書くと非常に長い符号なし整数ということ になり、ここの計算機では 64 bit の整数で0から までを表現で きることになる。
さて、メインプログラムが値を返しても受けとるところがないと思うかもしれ ないが、これは実は OS (というか、 UNIX の通常の環境ではプログラムを起 動したシェル)が受けとる。帰ってきた値によって、プログラムが正常に終了 したかどうかを判断したりするのにつかうわけである。
次に mainは関数の名前で、これはメインプログラムなら main でないといけない。それ以外では好きな名前をつけていいわけだが、 名前はアルファベットまたはアンダースコアで始まり、アルファベット、アン ダースコアまたは数字が続く。 Fortran 77 の規格では名前は 6 文字以下と いう制限があったが、 C/C++ では少なくとも 31 文字までは問題なく使える ことになっている。
その次の () は引数リストを書くためのものだが、今日のメイン関数は引数が ないので中身は空である。そのあとの中括弧 { から } までの間に
を書く。まあ、この辺はそう決めたからそう書くことになっているというだけ。
なお、 Fortran との違いとして、 改行や行内での位置が意味を持たないとい うことがある。 Fortran だと(少なくとも昔のでは)文は 7 カラム目から 72 カラム目までに書くとか 1-5カラムはコメント記号/文番号であるとか6カ ラム目は継続行マークとかいうのがあったが、 C/C++ ではその辺は全く気に する必要はない。長い式なら適当に改行して構わないし、 72 カラムをはみ出 したものが無視されるとかいうこともない。
そのかわり、変数名、キーワード中に空白をいれたりはできない。例えば Fortran では
p r o g r a m sam ple wr ite(6,*)'Test' r e t u r n e n dというようにプログラムの中に好きなように空白を入れることができたが、 C/C++ ではそんなことはできない。
なお、この「空白が無視される」という Fortran の仕様は割合問題が多いも のである。 DO 10 I = 1.10 が一体なんであると解釈されるか?を考えてみるとちょっ と面白い。
次は double a, b, c; である。これは a, b, c が double型の変数であると宣言している。上に書いたように改行に特別な意味 がないので、宣言の終りをしめすためにセミコロン ``;'' をつける。これは 実行文でも同様である。 Fortran では変数は宣言しなくても使えたが、 C/C++ では必ず宣言しないといけない。これは、タイプミスによって妙なバグ が発生することを防げるので好ましいと思う。
なお、 Fortran でも C で関数やサブルーチンの中の変数宣言は先頭にまとまっ ている必要があったが、 C++ ではそんな必要はなく使うところより前であれ ばどこでも宣言できる。
次にくるのが
cin >>a >> b;であるが、これはキーボード(正確には「標準入力」)からの入力がまず変数 a、次に変数 b に格納される。基本的には Fortran の read 文と同じような もの。細かいことをいい出すと無限にあるのでそのあたりは参考書を見ること。
次の c = a + b ; は最後にセミコロンがつくのを別にすれば Fortran と同じ。式の書き方、使える数学関数などは Fortran とさして変わ りはない。こまかな違いはいろいろあって、例えば
整数に対する多様な操作が提供されていることは、ハードウェア制御など、普 通には高級言語ではできないような操作を可能にする。これが C/C++ が広く 使われる理由の一部ではある。
さて、出力の
cout << "a+b=" << c << endl;である。これも、とりあえずは Fortran の write 文と同じようなものと思っ ておいていい。文字列定数は一重ではなく二重の引用符で括る。いくつかのも のを並べて書くには << でつないでいく。改行には endl を「書く」 。 これをつけないと行が変わらないので、その次に何か書くと同じ行につながっ て書かれる。Fortran では、特別な制御をしない限りwrite文では自動的に改 行が入ったが、 C/C++ ではそうではない。なお、実数の書式制御とかの細か い指定ももちろんできる。これも参考書のほうを見て欲しい。
最後は return 0; である。これは、この関数が 0 を返して終るとい うことになる。 0 の代わりにint 変数や整数値になる式を書けば、もちろん その値が戻る。
通常の UNIX シェルでは、この値が $status というシェル変数に格納 される。