はじめに
前回の第二回目では、C言語のprintf関数を使って「Hello World!!」を表示させるプログラムの内容を詳しく解説しました。
第三回目は、独自の関数をつくります。その中で必要となる知識として関数の形や型、変数、演算子というC言語の文法を学んでいきます。
このブログシリーズは、C言語文法の基礎を例題プログラムから学んでマスターしていくものです。
それでは、はじめていきます。
関数の形
独自の関数をつくるためにまず関数の形を解説していきます。
関数はプログラムをひとまとまりにして書いたものです。
関数には、入口と出口があります。入口から何かしらのデータを入力して関数で処理すると出力として処理結果のデータが得られるという構成です。
例えば「リンゴジュース製造機」という関数を考えてみます。
「リンゴジュース製造機」に入力として「リンゴ」を入れます。入力した「リンゴ」は「リンゴジュース製造機」によってミキサーにかけられるという処理がされて「リンゴジュース」という形で出力されます。
このように関数は、ひとまとまりの機能(上例だとリンゴをジュースにする機能)であり、入力したデータを演算などによって出力データに変換するものといえます。
専門的な言い方として、入力として与えるデータを「引数」、出力されるデータを「戻り値」と呼びます。引数を持たない関数や引数を1つもつ関数、複数の引数を持つ関数、作りたい関数の形に応じて自由にできます。
戻り値も戻り値がない関数、1つの戻り値を持つ関数をつくることができます。
複数の戻り値を持ちたい場合は、少し工夫が必要になります。詳しくはここでは触れませんが、関数のつくり方によって引数や戻り値の数を変えることもできるので、プログラムの構成を再検討することで戻り値の問題を回避できたりもします。そのあたりを考えるのがプログラムの設計になります。
話が少しそれましたが、関数についてここまでの内容をまとめておきます。
独自関数の例-足し算関数-
では実際にC言語の関数の書き方について「整数の足し算を計算する関数」を例として解説していきます。
「整数の足し算を計算する関数」としてやりたいことは次のようなことです。
1.2つの整数値(正負を扱える)を入力する
2.入力した2つの整数値を足し合わせる
3.足し合わせた整数値を出力として戻す
これをもとにプログラムをつくることになります。作成したプログラムの例は次のようになります。
int add1(int x,int y)
{
int p;
p = x + y;
return(p);
}
上の例にあるようにC言語で関数を書くときは次のような形式で記述します。
ここで、いきなり「型」というものが出てきます。
C言語では、戻り値と引数を書く際に「型」を設定する必要があります。
型
「型」というものは何かというと、扱うデータの種類を示すものです。
データの種類には、例えば、数値、数値でも0,1,2といった整数値や1.2、1.3などの小数点数値があります。そのほかに、a、b、cなどの文字もあります。
具体的に型の種類としては、下の表のようなものがあります。
型名 | サイズ[バイト] | 説明 |
char | 1 | 符号つき整数 -128~127 (文字を扱う型) |
unsigned char | 1 | 符号なし整数 0~255 |
short | 2 | 符号つき整数 -32,768~32,767 |
unsigned short | 2 | 符号なし整数 0~65,535 |
long | 4 | 符号つき整数 -2,147,483,648~2,147,483,647 |
unsigned long | 4 | 符号なし整数 0~4,294,967,295 |
int | 2 4 | 符号つき整数(環境依存) Arduino Uno(ATmegaベースのボード) Arduino DueおよびSAMDベースのボード |
float | 4 | 浮動小数点数: -3.4028235E + 38~3.4028235E + 38 |
double | 4 8 | 浮動小数点数(倍精度) UnoおよびATMEGAベースのボード Arduino Due |
void | – | 値なし |
文字にはchar型、整数値は扱う数値の大きさによってchar、short、long、intを使い分けます。
また、負の値を取り扱うかによっても違いがあり、正の整数のみを扱う場合は、unsignedを付けるとその分、正の値で扱える領域が増えます。
小数点数値を扱う場合は、float型かdouble型を使います。double型の方が精度が良いですが、使用するメモリサイズが大きくなります。メモリサイズとはという部分は、次回、解説します。
型については、扱うデータによってはじめは表を見ながら使っていくことで徐々に覚えていくと思います。
C言語では関数作成で指定する型と実際に引数や戻り値に入ってくるデータの種類を一致させる必要があります。面倒くさいと思う部分もありますが、これがあるお陰でミスや意図しない動作(バグといいますが)、バグを放置せずに済むところもあります。ほかの言語では、型の記述がなく自動的に割り振ってくれる言語もありますが、C言語はこの辺りは厳格になっています。
変数
さて、関数の中身に戻ります。
int add1(int x,int y)
{
int p;
p = x + y;
return(p);
}
戻り値、引数にそれぞれ型を付けるところまで解説しました。
この例では、戻り値の型として「int型」、引数は2つの引数があり、それぞれ「int型」と「int型」の型を持つことがわかります。上の表のようにint型は、符号付(正負を扱える)整数の型なので、2つの整数値を引数として取り込み、戻り値として整数値を返すという構造がつくれています。
続いて、関数と引数に独自の名前を付けます。それが、関数名と引数名になります。
「足し算計算の関数」の例では「add1」が関数名、「x」と「y」が引数名となります。
これで入力として2つの整数値xとyがadd1関数内で使えるようになります。
この2つの値を使って足し算という処理を行ってその結果を戻り値として返すという部分をつくっていきます。
ここで、「変数」と「演算子」というC言語文法の登場です。
まずは、「変数」からです。
変数とは、整数値や小数点数値、文字などのデータを入れるための「箱」のようなものをイメージするとわかりやすいと思います。
この「箱」をつくるには、名前と大きさを決める必要があります。すなわち、変数名と変数の型を設定します。
変数は、計算結果を一時的に持っておきたいというような場合に用意します。
この例では、xとyの足し算をした結果を入れるために変数名pというint型の変数を準備しています。
その記述がこの部分です。
int p;
変数を決めるときに大切なことは、計算するそれぞれの値の型と計算結果を入れる変数の型を一致させるということです。開発環境によってこの型の不一致の扱いをエラーにするかワーニングにするか、スルーするかは変わると思いますが、意図しない型の不一致は不具合につながりますので注意が必要です。それと、1行の終わりにセミコロンを忘れないようにします。
ここまで変数についてまとめておきます。
演算子
int型の変数pを使えるようにしたら続いて足し算のプログラムをつくります。
入力としてint型の2つの引数x,yを足し合わせてその結果をint型変数pに代入するというプログラムにします。その記述が次の部分になります。
p = x + y;
ここでは2つの「演算子」というものが使われています。
ひとつは、「+」という足し算をする演算子、これは算術演算子と呼ばれるもののひとつです。
もうひとつは、「=」という代入演算子です。
算術演算子と代入演算子は、算数で使う記号と同じなので感覚的にもわかりやすいと思います。
算数には足し算の他に引き算、掛け算、割り算がありますが、C言語文法上の算術演算子はそれぞれ「-」、「*」、「/」という記号で書くというルールになっています。
このように算術演算子は、2つの値を計算(演算)してその結果を返す役割があります。
また、代入演算子は、その名の通り、演算子の右側の値を左側に入れる役割のものです。
演算子には、他にも関係演算子や論理演算子、ビット演算子などがありますが、それは別の例題で扱っていこうと思います。
戻り値の書き方
最後に足し算の計算結果を戻り値として返す部分をみていきます。
return(p);
戻り値は、「return( )」という記述で値を返します。
括弧の中に戻したい値を入れます。ここに入れる値の型と関数の戻り値の型は一致しておかなければなりません。ここでは、変数pはint型なので関数aad1の戻り値の型もint型となります。
これで関数add1は、int型変数pの値を関数の外に返すことができます。
それで返した値はどうなるか、どう扱うのかというところになります。
例えば、main関数にint型の変数resというものをつくります。
そのres変数にadd1の計算結果を入れるというプログラムは次のようになります。
main()
{
int res;
res = add1(1,2);
}
ここでも代入演算子の「=」が出てきました。
add1関数の引数に1と2という値が入ります。
add1では、その値をint型のxとyという変数で受けます。
関数内の変数pには「1+2」の計算結果「3」が入り、returnで値「3」が関数外に返されます。
返ってきた「3」がどうなるかというと、その値は、代入演算子によって変数resに代入されます。
このように戻り値を関数を呼び出した側でキャッチする必要があるというわけです。
このキャッチする変数(ここではres)の型は関数の戻り値の型と一致していなければなりません。
なので、resをつくるときにint型の変数にするということが決まります。
まとめ
ここまで、独自関数をつくるということで、足し算の計算する関数add1を例題として解説してきました。足し算の関数をつくる中で、C言語文法の型や変数、演算子というものが出てきます。演算子については、まだ一部の演算子しか見ていないのでその他の演算子はこれから扱っていきます。
ここまでできれば、例えば、引き算をする関数、掛け算をする関数、割り算をする関数というような独自関数をつくることができると思います。
次回は、ここでつくった関数を実際に動かしてみます。動かすにあたってC言語のプログラム構成についてと、今回作成したプログラムがコンピュータの中でどのように扱われているのか、変数や演算の実態について解説していきたいと思います。
価格:2,530円 |
コメント