プログラム言語 II TOP

関数(2)

例題6.2



1. #define 前処理指令
あるプログラムが

 #define Constant3 3
   ・
   ・
 a = Constant3;

となっていた場合,"a = Constant3" は "a = 3" として処理されます。つまり,Constant3 が 3 に置き換えられ,処理されます。

このことは, 3 という定数に Constant3 という名前がつけられているといえます。ということは,意味のある定数に,その意味を表すような名前をつけることができるわけです。

例えば,学生125人分のデータを処理するプログラム中に,人数を意味する定数125が何箇所かに現れているとします。このような時は,まず

 #define NumberOfStudents 125

とし,プログラム中で 125 の代わりに NumberOfStudents を使います。

こうすれば,125の意味が明確になるだけでなく,学生数が変わった時でも,#define のところだけ変更すれば済みます。

プログラムの最初にいつも使っている #include も前処理指令で,その後に指定したファイルをこの指令のある場所に読み込むことを指示するものです。

詳細な説明は,教科書p.92以降を参照してください。


2. void型
返却値のない関数の型として指定します。

 void errorNo(int code)
 {
  printf("Error occurred (code : %3d)\n", code);
  return;
 }

これは誤りが発生したときなどに,その種類(code)を表示するものです。メッセージを表示するのが目的なので,返却値がありません。そこで return文では,返却値を指定しません。

この例のような,関数の終わりにある返却値を指定していない return 文は省略することができます。


3. 自動変数(auto variable)と静的変数(static variable)
今までの変数は,それを含む関数が呼び出されると,その変数のための記憶領域(メモリ)が割り付けられ,値を格納することができるようになります。そし て,その関数の実行が終了すると,その記憶領域の割付けが解除されてます(つまり,格納してあった値がなくなる)。このような変数を自動変数と呼びます。



[実行結果]


関数 f が呼び出されるたびに,変数 a に必要なメモリが用意され,初期値として 0 が格納されます。


一方,プログラムの実行開始時に,記憶領域を割り付けられ,終了するまでその場所を確保し続ける変数を静的変数と呼びます。静的変数は,宣言するときに static という指定をつけます。



[実行結果]


変数 b はプログラムの実行開始時にメモリが用意され,初期値として 0 が格納されます。b のためのメモリは,プログラム終了まで確保されます。


4. long 型
int 型で扱える範囲を超えた整数を扱いたいときに用います。つまり,long 型の変数には,int 型の変数よりもメモリをたくさん割り当てます。ただし,文法的には,"int 型よりも範囲が狭くない"となっていることに注意してください。

宣言の例
 long x;
 long int y;

scanf や printf では,long 型の変数には,%d の代わりに %ld と指定します。


5. 桁あふれ(オーバフロー)と符号なしの型
変数には,ある大きさのメモリが割り当てられ,値が格納されます。割り当てられたメモリに入りきらないような値を格納することができません。このような状況になることを桁あふれといいます。

とりあえず,正又は0の整数を4ビットで表した場合を考えます。

 

このように桁あふれが発生すると,おかしな結果になってしまいます。


大学の実習環境では,整数型の変数には4バイト(32ビット)のメモリが割り当てられます。ただし,負の整数を扱うために1ビットを符号としていますので,整数として扱うことができる値の範囲は
  -2147483648 〜 2147483647
となります(2の補数表現ということを思い出すこと)。

INT_MAX は最大の整数値(2147483647),INT_MIN は最小の整数値(-2147483648)を表す名前です。



[実行結果]


という数学の世界では考えられない結果になります。


もし,負の値が必要ないときは,int の前に unsigned を付けます(出力するときは,%uを指定します)。



[実行結果]


もちろん,こうしても桁あふれは起こります(1ビット増えるだけですから)。

UINT_MAX は符号なし整数の最大値(4294967295)を表す名前です。



[実行結果]



桁あふれ補足


6. 例題6.2
教科書参照

乱数を求めるときに,桁あふれを使っていることに注意してください(プログラムの行番号30と31 教科書p.97参照)。


7. 演習
2つの整数を受け取り,和,差,積,商,余りを求めて表示する関数を作りなさい(参考 例題3.1)。また,それを呼び出す適当な関数mainを作り,実行させなさい。


プログラム言語 II TOP