変数のスコープ

 プログラムの中で変数を宣言する位置によって、使用できるかできないかが決まります。つまり、変数には有効範囲があります。これを変数のスコープと呼びます。次のような種類があります。

■ ブロックスコープ

 ブロックスコープは有効範囲がブロック内に限定されます。ブロックとは次の章で学習する制御構文のような開始と終了がある単位です。

 次のプログラム例は、if文の中に宣言した変数を、if文の外で表示するために利用しようとしています。しかし、次の図のようにエラーとなります。ブロック内で宣言した変数はブロック内で使用できます。

○ プログラム

  1. #include <stdio.h>
  2. int main(void){
  3.  int num = 1;
  4.  if(num == 1){
  5.   //配列の宣言
  6.   char str[100];
  7.   //配列に文字列をセット
  8.   strcpy(str, "ブロックスコープの変数");
  9.  }
  10.  //値を表示
  11.  printf("%s\n", str);
  12.  return 0;
  13. }

○ コンパイル

c:¥work>cl test.c
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24210 for x86
Copyright (C) Microsoft Corporation. All rights reserved.

test.c
test.c(14): error C2065: 'str': 定義されていない識別子です。
test.c(14): warning C4477: 'printf' : 書式文字列 '%s' には、型 'char *' の引数が必要ですが、可変個引数 1 は型 'int' です

c:¥work>

■ 関数スコープ(ローカルスコープ)

 関数スコープは有効範囲が関数内に限定されます。関数とは下のプログラムの「int main(void){~}」で指定された単位です。ローカル変数と呼ばれます。

 次のプログラム例は、main関数の中に宣言した変数を、test関数で表示するために利用しようとしています。しかし、次の図のようにエラーとなります。関数内で宣言した変数は関数内で使用できます。

○ プログラム

  1. #include <stdio.h>
  2. void test(void){
  3.  //値を表示
  4.  printf("%s\n", value);
  5. }
  6. int main(void){
  7.  //配列の宣言
  8.  char value[100];
  9.  //配列に文字列をセット
  10.  strcpy(value, "ブロックスコープの変数");
  11.  return 0;
  12. }

○ コンパイル

c:¥work>cl test.c
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24210 for x86
Copyright (C) Microsoft Corporation. All rights reserved.

test.c
test.c(5): error C2065: 'value': 定義されていない識別子です。
test.c(5): warning C4477: 'printf' : 書式文字列 '%s' には、型 'char *' の引数が必要ですが、可変個引数 1 は型 'int' です

c:¥work>

■ グローバルスコープ

 グローバルスコープは有効範囲が複数の関数に及びます。

 次のプログラム例は、関数の外に宣言した変数を、test関数で表示するために利用しようとしています。この場合のスコープはプログラム全体に及ぶので、エラーにはなりません。

○ プログラム

  1. #include <stdio.h>
  2. //配列の宣言
  3. char value[100];
  4. void test(void){
  5.  //値を表示
  6.  printf("%s\n", value);
  7. }
  8. int main(void){
  9.  //配列に文字列をセット
  10.  strcpy(value, "ブロックスコープの変数");
  11.  test();
  12.  return 0;
  13. }

○ コンパイル・実行結果

c:¥work>cl test.c
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24210 for x86
Copyright (C) Microsoft Corporation. All rights reserved.

test.c
Microsoft (R) Incremental Linker Version 14.00.24210.0
Copyright (C) Microsoft Corporation. All rights reserved.

/out:test.exe
test.obj

c:¥work>test.exe
ブロックスコープの変数

c:¥work>

前へ   次へ