サイトマップ / C言語講座>出入り口>総目次>目次:入出力(1)>関数を自作する
[printf( )とscanf( )の戻り値]←このソース→[変数の記憶クラス]
/* 関数の宣言より前に、必ずプロトタイプ宣言を書きます。ソースプログラムの中で、プロトタイプ宣言のある行より後ろでその関数を使うことができます。プロトタイプ宣言はコンパイラに関数の仕様を教える役割を持つだけでなく、ソースプログラムを読みやすくします。
関数は名前を付けて宣言します。今回は"Myfunc( )"という名にしました。本講座では標準ライブラリ関数と区別するために、自作の関数は大文字で始まることにします。C言語では関数の名前はアルファベットの大文字か小文字か、'_'(アンダースコア)で始まることになっています。関数の名前はそれが何をする関数か、容易に理解できる名前にすることが推奨されています。今後、その方針で自作関数の名前を付けます。関数のプロトタイプ宣言の所か、関数の宣言の前にその関数の簡単な説明を付けます。
今回自作する関数はmain関数からint型のデータを受け取り、その値の1/2の値を返します。戻り値はint型の整数です。main 関数の中で、int型の整数m に、scanf( )で値をキーボードから入力します。それをMyfunc( )に渡します。Myfunc( )の宣言を下記に示します。
int Myfunc(int n)
受け取る引数の名前がnになっています。 このように、変数の名前が異なっても、変数の型が一致すれば文法ミスにはなりません。
関数Myfunc( )が受け取るのはmain関数の中の変数mそのものではなく、その値がスタックへコピーされたものです。関数Myfunc( )はmain関数の中の変数mを書き換えることはできません。正式には呼び出し側は引数と呼び、関数の側では仮引数と呼びますが、多くの場合呼び方を区別しません。本講座でも、区別しません。
Myfunc( )に続いて'{'と'}'で範囲が決められたブロックがあります。これが関数本体です。関数の本体の最後の行に下記の記述があります。
return (n / 2); // ここで戻り値をスタックに積んで返る
return ( )は関数と同じ形をしていますが、関数ではありません。returnはC言語の予約語です。変数や関数の名前に使うことはできません。
int Myfunc(int n) return (n / 2);
上の2行を見比べてください。関数では、関数の名前と( )の間にスペースがありませんが、予約語ではスペースが入っています。今後、この形式でソースを書くことにします。
returnはそれに続く( )の中の値を、その関数を呼び出した側に制御が移った時に、戻り値として返すことを指示するコマンドです。( )は省略できる場合があります。returnと( )の間にスペースが入っています。後はソースプログラムの中のコメントを見て下さい。 */
#include <stdio.h> int Myfunc(int n); /* プロトタイプ宣言 */ void main(void); /* 整数を受け取りその 1 / 2 の値を返す */ int Myfunc(int n) { printf("私たちはMyfunc( )の中にいます。\n"); printf("引数として%dを受け取りました。\n", n); printf("その半分を戻り値として返します。\n"); return (n / 2); /* ここで戻り値をスタックに積んで返る */ } void main(void) { int m, n; printf("整数を入力して下さい "); scanf("%d", &m); printf("\n"); /* 改行 */ n = Myfunc(m); /* 自作関数の呼び出し */ /* nに戻り値が代入される */ printf("関数から戻って来ました。\n"); printf("戻り値は%dです。\n", n); } |
/* プログラムを実行して、奇数を入力して下さい。整数型の変数の割算では、余りは捨てられます。 */
[printf( ) と scanf( ) の戻り値]←このソース→[変数の記憶クラス]
/* (C) 2000- YFプロ. All Rights Reserved. */ 提供:C言語講座−それ自体コンパイルできる教材を使った講座です−