関数

◎関数定義
  その関数が呼び出された時の処理の手順を記述する
○形式

  型名  関数名 (仮パラメタの名前のリスト)
  仮パラメタの型宣言
  { ブロック

   }

   ・関数名の前の型名は関数が返す値の型を示す。
   ・型名がないと int と仮定される
   ・関数名の後の ( ) は、仮パラメタがなくても必ず必要である。
   ・仮パラメタの型宣言の形は、記憶クラスを指定しない以外は
     局所変数と同じである。
     (関数呼び出しの時に記憶場所が確保されていて戻ると開放される)

  例1: main 関数の定義
  main( )
  {
       int i;
 
       i = 3;
       printf("%d\n", i * i);
  }

  例2: 2乗 を計算する関数
  double square(double x)
  {
       return x * x;
  }


◎関数の型宣言 処理の内容の本体が別途定義されている時、戻り値の型だけを宣言する。 ○形式 型名 関数名( ) ; ( ) は必ず必要である。 ・変数宣言の様に同じ型のものは、,で区切って並べて宣言してよい。 ・同じ型の変数宣言と組み合わせてよい。 [例] double sin( ), cos( ); /* math.h には、このような宣言がたくさん入っている */ double x, sqrt( ); /* 変数と一緒に宣言した例 */
◎関数の呼び出し ○形式 関数名(実パラメタのリスト) ・関数名の後の ( ) は、実パラメタがなくても必ず必要である。 ・「実パラメタのリスト」は、各々の実パラメタを , カンマ comma で区切ったものである。 ・個々の実パラメタは式である。 例1: sin(theta), atan2(y, x) ・値を返す関数は、式の要素の一部として使われることが多い 例2: x = r * cos(theta); ・値を返さない関数(他の言語のサブルーチンに当たる)は、 単独で文として使われることが多い 例3: sayhello( ) { printf("Hello\n"); } main( ) { sayhello( ); } ・値を返す関数が単独で使われた場合、返してきた値は単に無視する。 (当然他にも何らかの作用がある) 例4: printf("x=%f\n", x); /* 結果として出力した文字数を返すがほとんどの場合無視する。*/
○関数の呼び出しの仕組 1.実パラメタがある場合は、各実パラメタの型に合わせて臨時の記憶場所が 確保され、各々の値が計算されてその記憶場所に格納される。 2.はじめに、局所変数の場所が確保され、関数のブロックが実行される。 ・ブロックの中で、仮パラメタを扱う部分は、臨時記憶の中の対応箇所が 対象となる ・戻る方法1 return 式 ; が実行されると、式の値を関数値として、呼び出した部分に戻る。 ・戻る方法2 式のない return ; が実行されるた場合は、呼び出した部分に戻るが、値は「不定」である。 ・戻る方法3 return が実行されずにブロックの実行が終了した場合は、戻る方法2と同じ 3. 実パラメタのための、臨時の記憶場所が開放される。 このように、実パラメタは、臨時の記憶場所にコピーされて関数に渡されるので、 関数中で、変更しても、呼び出した方の実パラメタそのものの値は変化しない。
◎ C の関数の宣言の補足 1. C の関数の宣言の方法には、仮パラメタの宣言で示した以外に、処理内容を 示さずに、返す値だけを宣言する方法がある。 例 double kansuu(); もちろんこれは、「他のところ」で処理内容を示したものが なくてはならない。 (#include で示したファイルには、あらかじめ用意された 関数の型宣言が含まれている。) 2. C では、新たな規格にもとづいた、関数の仮パラメタ宣言方法がある。 これは、通常のコンパイラ cc の代わり別のコンパイラ gcc を使う ことで、利用できる。 従来方式 traditional double kansuu(x, y) double x, y; { .... } 比較的新しい方式 (ANSI 方式) double kansuu(double x, double y) { .... } こうすると、呼び出すときにパラメタを与える方法がわかる。 ANSI 方式の関数型だけの宣言は double kansuu(double x, double y); である。この x と y はなくてもよい。