【問題15】変数を制する者は関数を制する:完全マスター! 組み込みC言語プログラミング(16)(2/3 ページ)
C言語において変数とはある値を記録して出力する機能を指しますが、「外部変数」と「再帰」の理解を深めることで、関数をより自在に扱えるようになります。
外部変数と再帰関数への理解を深める
今回はC言語のテクニックとして、新たに外部変数と再帰を使っています。
外部変数(またはグローバル変数)とは関数の外で宣言される変数を言い、convert.cでは3行目と4行目の
int base; char *p;
で宣言された、型intのbaseと、型「charへのポインタ」のpが外部変数です。外部変数はプログラムのどこでも使用できます。
ちなみに、関数の中で宣言される変数は内部変数(またはローカル変数)と言います。例えば14行目の
int n, b;
で宣言された、型intのnとbは内部変数で、mainの中でのみ使用可能です。
一方、再帰とは関数の中から自分自身を呼び出すことを言います。convert.cでは_convertが再帰になっていて、37行目の
if (num >= base) _convert(num / base);
は、_convertの関数定義でありながら、_convertを呼び出しています。
変数のスコープ
スコープとは変数の使用可能な範囲、すなわち有効範囲のことです。変数は宣言された場所によって、使えたり(見える)、使えなったり(見えない)します。
convert.cでの変数のスコープを図示すると、次の様になります。
外部変数であるbaseとpのスコープは、青色で示す範囲です。baseとpはプログラムの終わりまで使用可能で、このようなスコープを「ファイルスコープ」と呼びます。
ファイルスコープを持つ変数は、ソースプログラムのどこからもアクセス可能です。ですから関数間のデータのやり取りは、引数と戻り値、そして外部変数を通じて行うことができます。
内部変数は関数の中しか使うことができません。例えばmainの中で宣言されるn、b、strのスコープは、mainの関数定義の終わりの波カッコ(20行目の})までとなります。実はC言語では波カッコ({と})で囲んで複合文(ブロック)を構成しますが、始まりの波カッコ({)の直後であれば変数宣言することができます。そこで宣言された変数は、対応する終わりの波カッコ(})までのスコープをもち、このようなスコープを「ブロックスコープ」と呼びます。
ブロックスコープを持つものは、複合文内で宣言された変数だけではありません。関数の仮引数もブロックスコープを持ちます。例えばconvrtにはs、num、bの3つの仮引数がありますが、使用できる範囲はconvertの終わりの波括弧(31行目の})までとなります。
内部変数は外部変数と同じ名前を付けることができます。すると内部変数が妨げになって、同じ名前の外部変数のスコープはなくなります。
Copyright © ITmedia, Inc. All Rights Reserved.