Loading [MathJax]/extensions/tex2jax.js
NOIP学习小站
西安交通大学附属中学航天学校

局部变量与全局变量

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#include<iostream>
using namespace std;
int main()
{
int s = 0;
for(int i=1;i<=100;i++){
s += i;
}
cout<<s<<endl;
return 0;
}
#include<iostream> using namespace std; int main() { int s = 0; for(int i=1;i<=100;i++){ s += i; } cout<<s<<endl; return 0; }
#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循环语句中↑

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#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;
}
#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; }
#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语句的条件中使用了前面循环的控制变量,这个时候就不能将循环控制变量的申明语句放在循环语句中:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#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;
}
#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; }
#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循环中使用,出了循环后就不能再使用了,这样的变量称为局部变量,局部变量能够使用的范围称为局部变量的作用域

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#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 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 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;
}

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#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;
}
#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; }
#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函数的前面,这个时候的数组就是全局数组。我们也可以将普通变量定义到函数外部,这个时候的变量就是全局变量。来看下面的程序:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#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;
}
#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; }
#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。同样的,全局数组所有的元素同样也会被自动初始化。

登录

注册