2.3.6名字的作用域:
C++程序中,每个名字都和实际的实体(变量,函数,类型等)相关联。尽管与实体相关联但是可以在同一个程序中使用同样的名字,只要他们在不同的上下文中,而不同的上下文是区分这些同名实体的意义的依据。用来区分不同意义的上下文叫做作用域。作用域是程序中的一段区域,同一个名字,可以和不同作用域中的实体相关联。
一、C++程序作用域范围:
1、C++程序中不同作用域是用花括号来界定的,名字从其声明点到所在作用域结束都是可见的。
2、在所有花括号之外定义的名字叫全局变量,有全局作用域权利,名字在整个程序可见。
3、函数内定义的叫局部变量具有局部作用域权利在函数内可见。
4、语句内定义这只能在语句中使用。具有语句作用域权利。
程序示例如下:
#include <iostream>
using namespace::std;
int main(int argc,constchar * argv[])
{
int sum =0;
for (int val =1; val<=10; ++val) {
sum+=val;
}
cout<<"sum of 1 to 10 inclusive is"<<sum<<endl;
return0;
}
函数中,main在所有花括号外定义,具有全局作用域,sum在函数内部定义,具有局部作用域,而val在for语句内定义,具有语句作用域。
二、作用域可嵌套
对于全局变量来说,可以在局部内部使用,但是当函数内部定义与全局变量同名的实体时,会屏蔽掉全局变量。
程序示例:
#include <iostream>
using namespace::std;
int b=5,c=10;
int main(int argc,constchar * argv[])
{
int sum =0;
for (int val =1; val<=10; ++val) {
sum+=val;
int b = sum;
cout<<b<<" "<<c<<endl;
}
cout<<"b: "<<b<<" c: "<<c<<endl;
cout<<"sum of 1 to 10 inclusive is"<<sum<<endl;
return0;
}
程序输出:
1 10
3 10
6 10
10 10
15 10
21 10
28 10
36 10
45 10
55 10
b: 5 c: 10
sum of 1 to 10 inclusive is55
全局变量b和c,在for语句内部,b定义被覆盖成新的语句内定义的内容,c不变。在for语句外,b离开函数内定义作用域恢复全局定义。c不变。
在变量第一次被使用的地方定义变量更能提高程序的可读性,必须在使用该变量最外层作用域里面或之前定义该变量。
习题解答:
1、下列程序中的j值是多少?
int i =42;
int main()
{
int i =100;
int j = i;
}
答:j=100。2、下列程序段将会输出什么?
#include <iostream>
using namespace::std;
int main()
{
int i =100,sum =0;
for(int i=0;i!=10;++i){
sum+=i;
}
cout<<i<<" "<<sum<<endl;
return0;
}
答:100 45。3、下列程序合法吗?
int sum =0;
for(int i = 0;i !=10;++i)
{
sum+=i;
}
cout<<"sum from 0 to"<<i<<"is"<<sum<<endl;
2.3.7在变量的使用处定义变量
一、变量的定义或声明可以在程序的任何地方,但是一个变量在使用之前一定要先定义或声明。在变量的使用处定义或声明变量可以提高程序可读性。变量只在定义开始处到其声明所在作用域截至处才可以访问
习题解答:
1、下列程序中j的值是多少?
int i=42;
int main()
{
int i=100;
int j=i;
}
2、下列程序将会输出什么?
int i=100,sum=0;
for (int i=0; i!=10; ++i) {
sum=sum+i;
}
cout<<i<<" "<<sum<<endl;
答:输出:100,453、下列程序合法吗?
int sum=0;
for (int i=0; i!=10; ++i) {
sum+=i;
}
cout<<"sum from 0 to "<<i<<"is"<<sum<<endl;
答:不合法,i是语句作用域,不能输出值。