「6さいからのプログラミング」第5話では、最も重要な概念である関数を紹介し、実際にプログラムを書いていきたいと思います。第4話では、型とリテラルについて解説しました。今回は、最も重要な概念である「関数」を紹介し、これらを用いて実際にプログラムを書いていきます。「関数」とは、複数の命令を1つの便利な命令としてまとめたものです。見た目は数学の関数に似てはいますが、プログラミングにおける関数はあくまで「命令をまとめたもの」だと考えましょう。プログラミングにおける関数は、数学の関数と同様、与えられた値に応じて値を返すことができます。C言語に初めから用意されている「sin」やJavaの「Math.sin」は、数学のsin関数と同じような振る舞いをします(表1-1)。0.8414709848078965数学の関数に中身はありませんが、C言語のsinなどは命令をまとめたものに過ぎないため、この中には数学のsin関数と同じ結果になるように命令が書き連ねられています。C言語のsin関数の中身を見てみましょう(図1-1)。<math.h>」と書くことで好きなプログラムに埋め込むことができます。「#include」とは、他の場所にあるソースコードを呼び出す機能です。<math.h>」と書く代わりにこのsin関数の中身を書いても、同じプログラムが出来上がります。2引数と戻り値sin関数は、与えられた値に応じて値を返す関数でしたが、この与えられる値のことを「引数ひきすう」といい、返す値を「戻もどり値ち」といいます。引数を複数受け取ったり、引数を受け取らない関数を作ることもできます。多くの言語では、関数は戻り値を最大1つまでしか返すことができませんが、戻り値を返さない関数も作成できます。表2-1に、C言語の関数をいくつか紹介します。画面に文字列を表示させる他の言語でもこれらと似たような関数が用意されていますので、ひとまずC言語の関数を押さえましょう。C言語の「voidヴォイド」とは、「値が無い」ことを示す型です。この表のrand関数は引数が無いことを意味し、exit関数は戻り値が無いことを意味します。pow関数は、「xのy乗」を計算する関数で、引数を2つ(xとy)受け取り、両方ともdouble型です。文字列を画面に表示させるprintf関数は、2つ目の引数が「...」となっていますが、これは引数をいくつでも受け取れるという意味です。このように、受け取る数が決まっていない引数のことを「可変長引数かへんちょうひきすう」といいます。関数の戻り値を返す命令として、C言語やJavaなどでは「return文」を使います。この命令が実行されると、戻り値が返されると同時に、関数を抜けます(図3-1)。戻り値;」と書きます。戻り値が無い(void)関数の場合は、「return;」とだけ書くことで関数を途中で抜けることができます。引数を受け取らずに常にint型の「4」を返す関数を「piyo」という名前で作ると、図4-1のようになります。引数2,...)」と書きます。引数が無い場合は、括弧の中を空にします。このpiyo関数を呼び出すときは「piyo()」と書きます。JavaやC#などでは関数はどこに作っても良いですが、C言語やC++では、関数はその関数が呼び出される箇所よりも上に書かなければならないという制約があります。}」の部分を「;」に置き換えた「プロトタイプ宣言せんげん」と呼ばれるものを代わりに上に書きます(図4-2)。piyo(void);このあたりでpiyo関数を呼び出す。プロトタイプ宣言の例やや面倒なルールですが、コンパイラがソースコードをコンパイルするときには上から順番に見ていきますので、呼び出し部分より上に関数のことが書かれていたほうがコンパイラにとって都合が良いのです。ちなみに同じプログラムをC#で書いた例は図4-3の通りです。基本的にC言語と同じですが、C#やJavaでは引数が無いときは「()」とだけ書きます。JavaScriptやPHPで書いた例は図4-4の通りです。JavaScriptやPHPの関数定義の例JavaScriptやPHPでは基本的に型を明記しません。戻り値の型の代わりに「function」と書いて関数を定義します。ところで出てきた「printf」を例に、C言語の関数の仕組みに踏み込んでいきましょう。いう値のアドレスが、スタック領域に積まれます(図5-1)。world!\n」の文字列が書き込まれていて、先頭アドレスA4がスタック領域に積まれています。printf関数の中では、スタック領域に積まれたアドレスを取り出し、アドレスにある文字列を画面に表示します。最後にprintfを呼び出した側がスタック領域を空にします。このように、関数の引数とは一般にスタック領域を通じて値がやり取りされる仕組みになっています。ちなみに、printf関数に引数を複数渡したときの挙動は図5-2のようになります。world!\n」「5」の順番で値が積まれます。このように、引数を逆順に積んで、関数を呼び出した側がスタックを空にするという流れは、「cdeclシーデクル」と呼ばれます。この他にも、呼ばれた関数内でスタックを空にする「stdcallスタンダードコール」や、引数を左から積む方法、さらにはCPUのレジスタを使って引数を渡す方法など、いろいろな関数の呼び出し方があります。これらの方法を「呼よび出だし規約きやく」といいます。呼び出す側と呼び出される側が同じ呼び出し規約でやりとりする必要があります。world!\n");」の「\n」が気になっていると思いますが、これは「改行」を表しています。world!」を表示したあとに改行しています。このようにC言語やJavaなどでは「\」を使って特殊な文字を表すことができます。これらの文字を「エスケープシーケンス」といいます。C言語の主なエスケープシーケンスは表6-1の通りです。文字コード「5A」の文字C言語では文字列は「"」で囲むので、文字列の中で「"」という文字を使いたい場合は文字列の終わりと区別するために「\"」と書く必要があります。「\」という文字を普通に表現したいときは「\\」と書きます。Windowsなどでは、改行が「\n」ではなく「\r\n」と決められていることがあり、その場合「\r\n」と書かないと改行されないことがあります。「\r」は「復帰」という意味の特殊文字で、単体で使われることは滅多にありません。この他にもいくつかのエスケープシーケンスがあり、「\a」と書くと音が鳴ったりしますが、実際のプログラムではほとんど使われません。7書式指定文字列C言語のprintf関数には、エスケープシーケンスの他に、引数の値を埋め込む機能が存在します。こちらは「書式指定文字列しょしきしていもじれつ」と呼ばれ、「%d」のように「%」の記号を用います。書式指定文字列は、引数を1つ取ってきて、その値を埋め込みます。4);」と書くと、引数から「4」という値を取ってきて「%d」の部分に埋め込まれ、画面には「AB4CD」が表示されます。書式指定文字列1つにつき、引数が1つずつ順番に埋め込まれます。3);」と書くと、画面には「123」が表示されます。「%」という文字そのものを画面に表示したい場合は「%%」と書きます(「\%」ではありません)。printf関数の書式指定文字列はとても多機能です。表7-1に一部を紹介します。Stringの略この他にも、「%d」の代わりに「%04d」と書くと「1」が「0001」と表示されたり、「%.10f」と書くと小数点以下10桁が表示されたりと多機能です。プログラムを見てみましょう(図8-1)。<stdio.h>」では、printf関数の定義をここに埋め込んでいます。}」で「main」という名前の関数を作っていますが、これは「メイン関数」と呼ばれ、C言語では、プログラムはメイン関数の呼び出しによって開始し、メイン関数を抜けたときに終了することになっています。メイン関数の戻り値は、プログラムが正常終了したかどうかの値を返すことになっていて正常終了時には0を返します(6行目)。プログラムがすべて理解できるはずです。次回は、メインメモリ上の値を書き換えたりして、いよいよコンピュータに様々な計算をさせる方法を解説します。前へ目次ホームへ次へ©Kuina-chan1579922021jaf。