とある科学の備忘録

とある科学の備忘録

CやPythonのプログラミング、Arduino等を使った電子工作をメインに書いています。また、木製CNCやドローンの自作製作記も更新中です。たまに機械学習とかもやってます。

【C言語】NO.7 関数

関数は、よく自動販売機にたとえられます。例えば、こんな感じ。

自動販売機には、入力と出力があります。入力は「購入者が入れたお金」と、「選んだジュースのボタンを押すという動作」です。一方、出力は勿論「ジュース」と「おつり」です。私たちは自動販売機の動作の仕組みは外から見ただけではわかりません。しかし、自動販売機は、二つの入力の値(投入金額と、選んだジュースの種類)をもとに、的確な出力(ジュースとおつり)を返してくれます。

f:id:pythonjacascript:20180706004332p:plain

このように、ある値を入力すると、内部で、決まった処理が行われ、一定の値が出力されるものを「関数」といいます。また、プログラミングの世界では、関数へ入力されるデータのことを「引数」、出力されるデータのことを「戻り値」といいます。

これをC言語で再現してみましょう。例えば、次のような関数を作ってみます。

入力として整数aとbを渡されて、その積を出力する関数

結論から言います。このようなプログラムを書いてください。

int func(int, int);  //関数の宣言

int main(){
    int a, b, c;
    a = 10;
    b = 20;
    c = func(a, b);   //関数の呼び出し
    printf("aかけるbは%dです", c);   //「aかけるbは200です」と表示される
}

int func(int a, int b){   //関数の定義
    int c;
    c = a * b;
    return c;
}

実行結果

aかけるbは200です

では、このプログラムはどのように動いているのでしょうか。


1.関数の宣言

関数も変数と同じように宣言をする必要があります。「今から『func』という名前の関数を使うよ」という意味を持ちます。
宣言の方法は、

戻り値のデータ型 関数名(引数のデータ型);

です。上の例では、

int func(int, int)

の部分です。



2.関数の呼び出し

実際にその関数を使うには、その関数を呼び出す必要があります。
呼び出し方法は、

関数名(引数, 引数...);

です。このように書くと、実際のその関数が実行されます。そして、その関数の処理が終わると、関数を呼び出したところの次のプログラムから再び実行されます。


3.関数の定義

関数の中身を記述することを、「関数を定義する」といいます。上のプログラムでは、

int func(int a, int b){
......
}

の部分です。関数が呼び出されると、毎回この中の処理が実行されます。


4.引数について

(1)書き方

関数が実行されると、func()のカッコ()の中の変数のデータがそのまま、関数の定義のところのfunc(int a, int b)のaとbに順番に代入されます。
f:id:pythonjacascript:20180905222937j:plain


(2)引数のない関数

引数のない関数もあります。つまり、入力される値がない関数ということです。
そのような関数は、次のように書きます。

int SampleFunc();    //関数の宣言

int main(){
  .....   //色々な処理
  int a = SampleFunc()   //関数の呼び出し
  ......//いろいろな処理
}

int SampleFunc(){     //関数の定義
  ......//いろいろな処理
  return 0;
}

関数の宣言の所で、「関数名 ()」の()の中に何も書かれていません。これは、本来そこに書くべき引数がないからです。


5.戻り値について

(1)書き方

関数の定義のところで

return データ

と書くと、そのデータが戻り値として出力されます。出力されたデータは、

変数 = func(a,b)

と書くことで、変数に格納されます。


(2)戻り値のない関数

いつも戻り値があるとはかりません。戻り値がない関数には、void というキーワードを使います。

void SampleFunc2(int);

int main(){
   .....   //色々な処理
  SampleFunc()   //関数の呼び出し
   ......//いろいろな処理
}

int SampleFunc(){     //関数の定義
   ......//いろいろな処理
  return;   //戻り値がないので、returnのみで何も返さない
}

何も返さない場合、return文は省略できます。