変数の有効範囲

  C/C++ においても,Java と基本的な考え方は同じですが,微妙に異なります.
01	/****************************/
02	/* 変数の有効範囲           */
03	/*      coded by Y.Suganuma */
04	/****************************/
05	#include <stdio.h>
06	
07	double x = 3.14;
08	
09	int main () 
10	{
11		int max, a, b;
12					// データの入力
13		printf("2つのデータをスペースで区切って入力してください ");
14		scanf("%d %d", &a, &b);
15					// if 文
16		if (a >= b) {
17			max = a;
18			int a = -5;
19			int min = 0;
20			if (a > b)
21				a = b;
22			printf("最小値 = %d,  a = %d\n", min, a);
23		}
24		else {
25			max = b;
26			int min = a;
27			printf("最小値 = %d,  a = %d\n", min, a);
28		}
29					// 繰り返し文
30		for (int i1 = a; i1 <= b; i1++) {   // C では許されない
31			int x = i1 + 5;
32			printf("x = %d\n", x);
33		}
34					// 出力
35		double x = -2.5;
36		double y = ::x;   // C では許されない
37		printf("最大値 = %d,  a = %d,  x = %f,  y = %f\n", max, a, x, y);
38	//	printf("最小値 = %d,  i1 = %d\n", min, i1);
39	}
		
11 行目

  ここでは,3 つの変数の宣言が行われています.こられの変数は,この宣言が行われた以降,main ブロックの最後( 39 行目)まで有効です.

18 行目

  Java においては,この行はエラーとなりますが,C/C++ では問題ありません.ブロック外で同じ名前の変数の定義が既に行われていても,ブロック内で再定義することが可能です.ブロック内で定義された変数は,ブロック外で定義された変数とは別のものとなり,その有効範囲は,ブロック内で,かつ,その変数が定義された後ろです.従って,20 行目~ 22 行目で参照している変数 a は,18 行目で定義された変数 a であり,11 行目で定義された変数 a とは別のものです.また,26,27,30,37 行目で参照している変数 a は,11 行目で定義された変数 a になります.

19 行目

  変数 min に対する宣言は,if ブロックの内部で行われているため,変数 min の有効範囲は,このブロック内の宣言が行われた以降だけです( 19 行目~ 22 行目).else ブロック内で定義されている 26 行目の変数 min,及び,for ブロック内で定義されている 30 行目の変数 i1,31 行目の変数 x も同様です.これらの変数は,すべて,定義されているブロック内だけで有効なため,38 行目のように,ブロック外で変数 min や i1 を参照しようとするとエラーになります.また,これらの変数が定義された後であっても,それらの変数が定義されたブロックの外であれば,35 行目のように,全く同じ名前の変数を定義することが可能です.

36 行目

  関数内において,関数外で定義された変数(この例では,07 行目の x )と同じ名前の変数を型宣言していても,スコープ解決演算子 :: によって,関数外で定義された変数を参照することができます.ただし,C では許されません.

「1 2」を入力したときの出力
最小値 = 1,  a = 1
x = 6
x = 7
最大値 = 2,  a = 1,  x = -2.500000,  y = 3.140000			
「2 1」を入力したときの出力
最小値 = 0,  a = -5
最大値 = 2,  a = 2,  x = -2.500000,  y = 3.140000