NOIP学习小站
西安交通大学附属中学航天学校

局部变量与全局变量

我们来看前面累加求和和判断素数的程序代码:

#include<iostream>
using namespace std; 
int main()
{
    int s = 0;
    for(int i=1;i<=100;i++){
    	s += i;
	}
	cout<<s<<endl;
    return 0;
}

↑控制变量i申明语句放在了for循环语句中↑

#include<iostream>
using namespace std; 
int main()
{
    int n,i;
    cin>>n;
    for(i=2;i*i<=n;i++){
    	if(n%i==0) break;
	}
	if(i*i>n) cout<<"YES";
	else cout<<"NO";
    return 0;
}

↑控制变量i申明语句放在了for循环语句前↑

判断素数的程序,在for循环结束后判断循环的条件不成立(说明循环正常结束,没有被break掉)来判断是素数。循环结束后的if语句的条件中使用了前面循环的控制变量,这个时候就不能将循环控制变量的申明语句放在循环语句中:

#include<iostream>
using namespace std; 
int main()
{
    int n;
    cin>>n;
    for(int i=2;i*i<=n;i++){   //i是局部变量,只能在循环语句中使用
    	if(n%i==0) break;
	}
	if(i*i>n) cout<<"YES"; 	//出现编译错误
	else cout<<"NO";
    return 0;
}

上面的程序会出现编译错误,原因是for(int i=2;i*i<=n;i++)方式申明的变量i只能在这个for循环中使用,出了循环后就不能再使用了,这样的变量称为局部变量,局部变量能够使用的范围称为局部变量的作用域

同样地,自定义函数的参数和函数体中申明的变量也都是局部变量,只能在函数体中使用。甚至可以简单地认为{}中申明的变量就是局部变量,只能在{}范围内使用,也就是局部变量的作用域是包含局部变量定义语句的最内层花括号{}(即使省略了花括号),并且从定义局部变量语句后算起。

#include<iostream>
using namespace std;
int count(int n){	//参数n是count函数的局部变量,只能在count函数中使用 
	int cnt = 0;	//cnt是count函数的局部变量,只能在count函数中使用 
	for(int i=1;i<=n;i++){	//i是for循环的局部变量,只能在for循环中使用 
		if(i%5==3 && i%7==6) cnt++;
	}
	//如果在这里使用变量i会出现编译错误 
	return cnt;
} 
int main()
{ 
    int n;	//n是main函数的局部变量,只能在main函数内使用 
    cin>>n;
    cout<<count(n)<<endl;
    //cout<<cnt<<endl;  //会出现编译错误
    return 0;
}

来看下面一段有意思的程序:

#include<iostream>
using namespace std;
int main()
{ 
    int n = 123;
    for(int i=1;i<=5;i++){
    	cout<<n<<endl;	//此时n是for循环外的变量n 
    	int n = 0;		//在for循环体中申明局部变量n(与循环体外变量n同名) 
    	cout<<n<<endl;	//此时n是for循环体中申明的变量n
    	//申明同名变量n后for循环体中无法使用循环外的变量n
		//也就是for循环外的同名变量n被“屏蔽”掉了 
	}
	cout<<n<<endl;		//此时n是for循环外的变量n 
    return 0;
}

前面我们已经接触到全局变量的使用——开大数组的时候将数组的申明语句放到main函数的前面,这个时候的数组就是全局数组。我们也可以将普通变量定义到函数外部,这个时候的变量就是全局变量。来看下面的程序:

#include<iostream>
using namespace std;
int n;	//全局变量 
void test(){
	cout<<"test函数中修改n值前,n="<<n<<endl;
	n++;
	cout<<"test函数中修改n值后,n="<<n<<endl;
}
int main()
{
	cout<<"执行输入语句前,n="<<n<<endl;
	cin>>n;
	cout<<"main函数中n="<<n<<endl;
	test();
	cout<<"main函数中n="<<n<<endl;
	n = 0;
	test();
	cout<<"main函数中n="<<n<<endl;
    return 0;
}

运行程序可知,全局变量在main函数和test函数中都可以使用,并且在任意地方修改了全局变量的值,在其它地方获取到的是修改后的新值。

全局变量还有一个特点,就是其值会被自动初始化,例如数值型(int、long long、float、double等)全局变量被自动初始化为 \(0\),字符型全局变量被自动初始化为'\0'(其实就是十进制 \(0\)),bool类型全局变量被自动初始化为false。同样的,全局数组所有的元素同样也会被自动初始化。