4.6 静的変数, 演習4-11 K&R プログラミング言語C

4.6 静的変数

static 宣言した変数・関数のスコープ

外部変数や関数を static 宣言すると、そのスコープはソース・ファイルの宣言以下の部分に限定される。

以下に示す3つのファイルをコンパイルすると static 宣言した同名の変数 i のスコープはそれぞれのソース・ファイル内に限定される。

main.c

#include <stdio.h>

void print1(void);
void print2(void);

int main(void)
{
    print1();
    print2();

    return 0;
}

print1.c

#include <stdio.h>

static int i = 10;

void print1(void)
{
    printf("print1 => %d\n", i);
}

print2.c

#include <stdio.h>

static int i = 20;

void print2(void)
{
    printf("print2 => %d\n", i);
}

実行結果

$ gcc -Wall -o static_test main.c print1.c print2.c
$ ./static_test
print1 => 10
print2 => 20

static 宣言した内部変数

内部変数を static 宣言すると、その値は保持され続ける。

#include <stdio.h>

void print_val(int x);

int main(void)
{
    print_val(10);
    print_val(8);

    return 0;
}

void print_val(int x)
{
    static int val = 0;

    val += x;
    printf("val => %d\n", val);
}

実行結果

$ ./static_val
val => 10
val => 18

演習4-11

ungetch が不要となると getchgetchar に置き換えられるため不要になる。

int getop(char s[])
{
    int i, c;
    static int buf = EOF;

    if (buf != EOF && buf != ' ' && buf != '\t') { /* 1文字戻って読み込む */
        s[0] = c = buf;
        buf = EOF;
    } else {
        while ((s[0] = c = getchar()) == ' ' || c == '\t')
            ;
    }

    s[1] = '
int getop(char s[])
{
    int i, c;
    static int buf = EOF;

    if (buf != EOF && buf != ' ' && buf != '\t') { /* 1文字戻って読み込む */
        s[0] = c = buf;
        buf = EOF;
    } else {
        while ((s[0] = c = getchar()) == ' ' || c == '\t')
            ;
    }

    s[1] = '\0';
    if (!isdigit(c) && c != '.' && c != '-') {
        return c; /* 数ではない */
    }
    i = 0;
    if (c == '-') {
        if (!isdigit(s[++i] = c = getchar())) { /* 次の文字が数字でない場合 */
            buf = c; /* 1文字押し戻す */
            return '-';
        }
    }
    if (isdigit(c)) { /* 整数部を集める */
        while (isdigit(s[++i] = c = getchar()))
            ;
    }
    if (c == '.') { /* 小数部を集める */
        while (isdigit(s[++i] = c = getchar()))
            ;
    }
    s[i] = '\0';
    if (c != EOF) {
        buf = c; /* 1文字押し戻す */
    }
    return NUMBER;
}
'
; if (!isdigit(c) && c != '.' && c != '-') { return c; /* 数ではない */ } i = 0; if (c == '-') { if (!isdigit(s[++i] = c = getchar())) { /* 次の文字が数字でない場合 */ buf = c; /* 1文字押し戻す */ return '-'; } } if (isdigit(c)) { /* 整数部を集める */ while (isdigit(s[++i] = c = getchar())) ; } if (c == '.') { /* 小数部を集める */ while (isdigit(s[++i] = c = getchar())) ; } s[i] = '
int getop(char s[])
{
    int i, c;
    static int buf = EOF;

    if (buf != EOF && buf != ' ' && buf != '\t') { /* 1文字戻って読み込む */
        s[0] = c = buf;
        buf = EOF;
    } else {
        while ((s[0] = c = getchar()) == ' ' || c == '\t')
            ;
    }

    s[1] = '\0';
    if (!isdigit(c) && c != '.' && c != '-') {
        return c; /* 数ではない */
    }
    i = 0;
    if (c == '-') {
        if (!isdigit(s[++i] = c = getchar())) { /* 次の文字が数字でない場合 */
            buf = c; /* 1文字押し戻す */
            return '-';
        }
    }
    if (isdigit(c)) { /* 整数部を集める */
        while (isdigit(s[++i] = c = getchar()))
            ;
    }
    if (c == '.') { /* 小数部を集める */
        while (isdigit(s[++i] = c = getchar()))
            ;
    }
    s[i] = '\0';
    if (c != EOF) {
        buf = c; /* 1文字押し戻す */
    }
    return NUMBER;
}
'
; if (c != EOF) { buf = c; /* 1文字押し戻す */ } return NUMBER; }
プログラミング言語C 第2版 ANSI規格準拠
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 9726
«
»