一.导入
我们之前讲了局部变量与全局变量的区别,而作用域其实变量在程序的哪一段代码中能起到作用,哪里不能起到作用的一个概念,所以我们在讲作用域的时候很大一部分都是与上一篇文章相关的,所以如果没有看过上一篇文章建议先回看,那我们正式开始!
二.作用域(局部变量)
我们先来看一段简单的代码:
#include
int main(void){
{
int a = 10;
printf("a=%dn",a);
}
return 0;
}
这段代码输出的结果显然是10,因为变量a的值为10而printf()输出的正是a的值,那么我服务器托管网们再来看下面这段代码:
#include
int main(void){
{
int a = 10;
printf("a=%dn", a);
}
printf("a=%dn",a);
return 0;
}
这次我们讲服务器托管网一个printf()放在括号的外面,当我们尝试编译运行该程序的时候就会收到编译器抛出的错误,如图所示:
编译器告诉我们找不到a这个变量,可能我们会感到疑惑,上面明明定义了并初始化了变量 a 为什么编译器会告诉我们找不到这个变量呢?其实这就是局部变量的作用域导致的,我们的变量a是初始化在这段大括号内部的,所以他的作用域就仅限于大括号内使用,所以我们可以总结出以下结论:
局部变量的作用域是变量所在的局部范围内
那我们如果再讲代码改成如下形式程序还能正常运行吗?
#include
int main(void){
int a = 10;
{
printf("a=%dn", a);
}
printf("a=%dn",a);
return 0;
}
我们运行后可以发现程序可以正常的编译与运行,如图所示:
因为这时候变量a的作用域就是整个main()函数内部而这两个printf()函数都在main()函数的内部所以程序当然是可以正常运行的
三.作用域(全局变量)
说完局部变量我们来看一下全局变量的作用域又是什么呢?我们照例使用代码的形式来进行讲解
#include
int a = 10;
int main(void){
{
printf("a=%dn", a);
}
printf("a=%dn",a);
return 0;
}
我们讲变量a写在main()函数的外部这时候我们编译并运行程序可以发现程序可以正常运行,那如果在main()函数中写一个自定义的函数test(),我们在test()中又是否能输出a的值呢?以下是示例代码:
#include
int a = 10;
void test(void)
{
printf("test a = %dn",a);
}
int main(void){
test();
{
printf("a=%dn", a);
}
printf("a=%dn",a);
return 0;
}
我们编译并运行代码后可以发现程序可以正常的输出main()函数与test()函数中的内容,如图所示:
那么我们可以讲变量a称为全局变量,全局变量的特点是在整个代码的任意地方都可以直接调用,甚至我们可以在整个工程中直接调用,如我们现在有一个工程,里面包含了code.c 与 test.c 两个源文件,我们在code.c中写入以下代码:
#include
void test(void)
{
printf("test a = %dn",a);
}
int main(void){
test();
{
printf("a=%dn", a);
}
printf("a=%dn",a);
return 0;
}
在test.c中输入以下代码:
int a = 10;
这时候我们直接编译是会报错的,所以我们需要在code.c的第一行写入:
extern int a;
这里的extern是用来声明外部符号的一个C语言关键字
我们对上述代码进行编译运行可以发现结果与上一个代码结果是一样的,如图所示:
综上所述:全局变量的作用域是整个工程
四.变量的生命周期
每一个事物都有自己的生命周期,变量亦是如此,我们拿上面这段代码举例:
#include
int main(void){
{
int a = 10;
printf("a=%dn", a);
}
printf("a=%dn",a);
return 0;
}
括号内的变量a被初始化的时候意味着变量生命周期的开始,当括号结束的时候就代表着变量生命周期的结束,这个变量也会被自动销毁,严谨来说:局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束
那么全局变量的作用域是整个工程,也就说当程序开始时全局变量生命周期开始,当程序结束时全局变量的生命周期结束,也就说:全局变量的生命周期是整个程序的生命周期
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net