staticの使い方1〜関数内静的変数〜


目次に戻る


先日紹介した、「qsortに渡す関数ポインタにクラスのメンバ関数を渡したい」でstaticという 予約語を使用しました。ただ、このstaticはとても癖のあるもので、正しい使用方法を知っ ていればとても便利でかつプログラムの信頼性があがるのですが、下手に使うと発見し づらいバグを生む原因になります。
 
staticにはいくつかの使用方法がありますが、ここでは関数内で静的変数を使う方法 を紹介します。
 
関数内静的変数とは何か。一言で言うと「内容をずっと保持している変数」となります 。では、普通に宣言した場合の変数とstaticをつけて、静的変数として宣言した場合との 挙動の差を見てみましょう。
 
#include <stdio.h>

void testfunction( void )
{
    int a = 0;    /* 普通に宣言した場合の変数 */
    static int b = 0;     /* static をつけて静的変数として宣言したもの */

    a++;
    b++;

    printf("a = %d , b = %d\n",a,b);

    return;
}

int main()
{
    testfunction();
    testfunction();
    testfunction();

    return 0;
}

実行結果
a = 1 , b = 1
a = 1 , b = 2
a = 1 , b = 3
staticをつけるとどんな感じになるかのイメージはわかりましたか?
ちなみに、宣言の時
static int b = 0;
変数名の後についている「 = 0 」は、最初に一度だけ実行されます。つまり、静的変数の 初期値ですね。静的変数は外部変数と扱いが似ているので、初期値は0なのですが、例 え初期値が0でもわかりやすいように「 = 0 」を入れておいたほうが良いでしょう。
 
では、どのような時に関数内静的変数が使えるでしょうか?外部変数(グローバル変 数)を使わないと作れないようなものの中で、ただ単純に前回の結果を保持しておきたい だけで外部変数を使っている関数は静的変数にできます。
 
/* 例:呼び出すたびに0、1を交互 に返す関数 */
int alternatereturn( void )
{
    static int data = 0;
    int result = data;

    if( data == 0 ){
        data = 1;
    } else {
        data = 0;
    }

    return result;
}



目次に戻る