函数的作用域
作用域的种类:
程序级:所有文件。外部函数。外部变量。
文件级:内部函数 外部静态类变量
函数级:函数的形参 函数内定义的自动类变量 内部静态类变量 语句标号
块级:定义在函数体内的分程序中、if、switch以及循环语句当中
关于重新定义标识符的作用域范围,例:
void fun()
{
int a;
{
float a;
}
}
int 型变量a在整个函数fun内都是有效的、可见的。而float型变量a仅在定义它的分程序内是可见的,在该分程序前和后的函数体内是不可见的。
关于一个标识符的可见性和存在性,有时是一致的,例如上例中的float型变量a;有时是不一致的,例如上例中的int型变量a,它在分程序内虽然不可见的,但是它是存在的。
举例:
#include<iostream.h>
void main()
{
int a(5),b(7),c(10);
cout<<a<<","<<b<<","<<c<<endl;
{
int b(8);
float c(8.8);
cout<<a<<","<<b<<","<<c<<endl;
a=b;
{
int c;
c=b;
cout<<a<<","<<b<<","<<c<<endl;
}
cout<<a<<","<<b<<","<<c<<endl;
}
cout<<a<<","<<b<<","<<c<<endl;
}
输出:
5,7,10
5,8,8.8
8,8,8
8,8,8.8
8,7,10
实例2:
#include<iostream.h>
void main()
{
int x(3);
for(;x>0;x--)
{
int x(5);
cout<<x<<"\t";
}
cout<<endl<<x<<endl;
}
局部变量:
作用在块级和函数级的变量。包含有自动类变量和内部静态变量以及函数参数。
内部静态变量的作用域和自动变量相同,但是生存周期是长的。可见性与存在性不一致。
例子:
#include<iostream.h>
void other();
void main()
{
int a(3);
register int b(5);
static int c;
cout<<"a="<<a<<","<<"b="<<b<<","<<"c="<<c<<endl;
other();
other();
}
void other()
{
int a(5);
static int b(12);
a+10;
b+=20;
cout<<"a="<<a<<","<<"b="<<b<<endl;
}
输出:
a=3, b=5, c=0;
a=5, b=32
a=5, b=52
实例3:
该程序包含三个文件。
文件1(main.cpp)
#include<iostream.h>
void fun1(),fun2(),fun3();
int i(5);
void main()
{
int i=20;
fun1();
cout<<"main():i="<<i<<endl;
fun2();
cout<<"main():i="<<i<<endl;
fun3();
cout<<"main():i="<<i<<endl;
}
文件file1.cpp
#include<iostream.h>
static int i;
void fun1()
{
i=50;
cout<<"fun1():i(static)="<<i<<endl;
}
文件file2.cpp
#include<iostream.h>
void fun2()
{
int i=15;
cout<<"fun2():i(auto)="<<i<<endl;
if(i)
{
extern int i;
cout<<"fun2():i(extern)="<<i<<endl;
}
}
extern int i;
void fun3()
{
i=30;
cout<<"fun3():i(extern)="<<i<<endl;
if(i)
{
int i=10;
cout<<"fun3():i(auto)="<<i<<endl;
}
}
输出:
fun1():i(static)=50
main():i=20
fun2():i(auto)=15
fun2():i(extern)=5
main():i=20
fun3():i(extern)=30
fun3():i(auto)=10
main():i=20
内部函数和外部函数:
1、内部函数:
内部函数是在定义它的文件中可以被调用的函数,而在同一程序的其他文件中不可以调用。
static <类型说明> <函数名> (<参数表>)
{
<函数体>
}
程序示例:
#include<iostream.h>
int i(10);
static int reset(),next(int),last(int),other(int);
void main()
{
int i=reset();
for(int j(1);j<=3;j++)
{
cout<<i<<","<<j<<",";
cout<<next(i)<<",";
cout<<last(i)<<",";
cout<<other(i+j)<<endl;
}
}
static int reset()
{
return i;
}
static int next(int j)
{
j=i++;
return j;
}
static int last(int j)
{
static int i(20);
j=i--;
return j;
}
static int other(int i)
{
int j(15);
return i=j+=i;
}
输出:
10,1,10,20,26
10,2,11,19,27
10,3,12,18,28
程序实例:
文件f1.cpp
#include<iostream.h>
int i(1);
extern int reset(),next(),last(),other(int);
void main()
{
int i=reset();
for(int j(1);j<=3;j++)
{
cout<<i<<","<<j<<",";
cout<<next()<<",";
cout<<last()<<",";
cout<<other(i+j)<<endl;
}
}
文件f2.cpp
static int i(10);
extern int next()
{
return i+=1;
}
extern int last()
{
return i-=1;
}
extern int other(int i)
{
static int j(5);
return i=j+=1;
}
文件f3.cpp
extern int i;
extern int reset()
{
return i;
}
输出:
1,1,11,10,6
1,2,11,10,7
1,3,11,10,8
评论