我们来看前面累加求和和判断素数的程序代码:
#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
。同样的,全局数组所有的元素同样也会被自动初始化。