4.6 静的変数, 演習4-11 K&R プログラミング言語C
2010年01月23日
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
が不要となると getch
も getchar
に置き換えられるため不要になる。
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; }
プログラミング言語C 第2版 ANSI規格準拠
posted with amazlet at 09.11.27
B.W. カーニハン D.M. リッチー
共立出版
売り上げランキング: 9726
共立出版
売り上げランキング: 9726