今回は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.