c语言变量作用域
① c语言中,变量的按作用域角度分类的几种情况
声明不同的数据类型,你对编译说明了这个数据的大小和运算方式,这样编译程序就可以内分配内存的容大小和位置。比如你声明一个 int 类型的变量,编译程序就知道分配两个字节,这个空间可以被用来做加、减等数学运算。 存储类型是对编译器说明分配空间的位置。比如一个 int 数据,被声明为auto时,在数据区分配内存,被声明为static时,在程序区分配内存,被声明为寄存器时,在寄存器分配内存(但要不是操系统,不要用这个类型),外部类型是你用其它文件的外部声明是要用。 作用域从编程的角度来讲的,并不像上两个从编译器的角度讲。也就是一个变量可以被不同的作用域使用,或说是否透明。其实外部类型也可以这么理解,但是由于外部类型的声明用到extern关键字,所以常在学习过程中与自动类,寄存器类,外部类和静态类一起学。作用域在C中是由位置决定的,在C++中类的封装中是由public,protect,private关键字决定,在类内也是由位置决定的。
② c语言中变量的作用域主要取决于变量的什么
他定义的位置,在函数中定义的范围只能是在函数内,全局的话都可用,类中的,类的成员可用
应该是说:
C语言中一个变量的作用域的开始位置只取决于它在函数的定义位置。
提前是可以改变。
③ 关于C语言中定义的变量的有效范围的问题。
C 语言, 用大括号括起的范围叫“域”,每个域都是变量在前,之后才是语句。变量的有效范围只能在域之内,也叫作用域。
外层域定义的变量在内层也是有效的。
④ C语言中变量作用域和区别是什么
总的分为局部变量和全局变量:局部变量又可分为动态局部变量(没特殊声明的变量一般都为动态局部变量)和静态局部变量(用static关键字声明的变量如:static int a;);两者的区别在于:静态的局部变量生存期比动态的局部变量来的长,动态的局部变量的生存期为所定义的范围内,如在函数内定义的,函数结束,变量也跟着结束,变量的值不会保存下来。而静态变量的生存期为整个源程序(也可说是一个文件,不同环境不同称呼)。而两者的作用域是一样。只能在定义他的函数内起作用,离开了这个函数就不起作用了。
全局变量:在函数之外定义的变量称为全局变量。全局变量可以为本文件中其他函所共用(作用域),它的有效范围(生存期)从定义变量开始到文件结束。
如果在同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,即全局变量不起作用。
下面来看一个例子:
#include"stdio.h"
int d=1; //声明一个全局变量
int fun(int p)
{
static int d=5; //定义一个静态局部变量 d初值为5 //第二次调用时没有执行此行
d=d+p; //此时局部变量d的值为9,(第一次调用) //第二次调用是局部变量d 的值为13,因为上一次执行完后d的值为9,
printf("%d",d); //第一次输出为9,//第二次输出13
}
void main()
{
int a=3;
d=d+a; //此时d的值为4;a变量的值为3,全局变量d的值为1。
for(i=0;i<2;i++)
fun(d); //此处的d值为4,传送给形参p,再一次调用时还是将4传给开参p
printf("d=%d",d); //输出d的值为4.此处的d为全局变量。
}
看以上内容时,你先把程序看一篇,然后把会值代进去远算,每一次看注释时在同一行中只要看到第二个”//“时结束.第2个“//”为第二次调用时看的。
以上内容有一点乱,但是希望可以帮助到你...88有什么不明白可以再问!
⑤ c语言的执行顺序问题(变量的作用域)
作用域的定义是这样的:如果一个变量在某个文件或函数范围内是有效的,则称该专文件或函数为该变量的作属用域,在此作用域内可以引用该变量,所以又称变量在此作用域内“可见”,这种性质又称为变量的可见性。例如
文件file.c
int
a;
main函数
{…
f2();
…
f1();
}
f1函数
{auto
int
b;
…
f2()
…
}
f2函数
{static
int
c;
…
}
这里a的作用域就是整个文件,b的作用域是f1函数,c的作用域是f2函数!其实作用域就是作用范围没什么很复杂的概念!
⑥ 在c语言中什么是变量的作用域
作用域的定义是这样的:如果一个变量在某个文件或函数范围内是有效的,则称该文件或函数为该变量的作用域,在此作用域内可以引用该变量,所以又称变量在此作用域内“可见”,这种性质又称为变量的可见性。例如
文件file.c
int a;
main函数
{…
f2();
…
f1();
}
f1函数
{auto int b;
…
f2()
…
}
f2函数
{static int c;
…
}
这里a的作用域就是整个文件,b的作用域是f1函数,c的作用域是f2函数!其实作用域就是作用范围没什么很复杂的概念!
⑦ C语言变量的作用域
准确而又通俗点来讲,按变量是在函数体之内之外定义分两大种。
1、局部变量:在函数内定义的,属于所在的函数自己所有,与其他函数无关。局部变量随所在函数被调用而产生,随函数返回而消灭。
2、外部变量:也称全局变量。在函数外定义,也就是定义不落在任何函数体内的,本质上属于所有函数共用,从程序一开始运行就存在直到程序结束。
细一点分的话,局部变量还可以分出一种局部静态变量。
3、局部静态变量:定义时在类型名前加static关键字,特点是可以在函数下次被调用时恢复到上一次函数返回前的状态。实质上是它从未消灭,只是因为它只归函数自己使用,函数返回了便没有其他函数能看到它,相当于暂时隐藏消失了而已。不是静态的局部变量称为自动变量,因为自动产生自动消灭。
外部变量也有在定义时类型名前加static关键字的一种分类,可称为外部静态变量。
4、外部局部变量:但不同于局部静态变量是局部变量的恒久版,因为外部变量号称全局,其本身就已经是恒久存在的。外部静态变量实际上反倒变成了外部变量的限制版,仅限同一个文件内的函数使用,因此它更多被称为本地变量,与全局变量相对。
这里看出static关键字的使用前后含义不一,确实有些别扭。与本地变量相类比,函数也有本地版的函数,仅限于被同一个文件内的函数调用,定义时也是在类型名前加static关键字。
这里不得不提到 声明和定义的区别,非常重要。C语言要求所有的名字在使用前都至少要有声明,以知道名字的类型等信息,所有在声明或定义之前就使用的变量默认为其类型是int型,函数则其返回值为int型。任何名称的定义只能有一处,声明则不限,但声明不得与定义相抵触。
通常在多文件的项目中,多将全局变量和外部函数的声明收集在一个头文件中,因为这些名字都是共用的。
因此,C语言的要求是先声明后使用,通过包含头文件、在代码前头位置声明或者在其他函数体内声明,可以延伸作用域。
声明的语法形式与定义很相似,有一些很零散的规则可以区分声明和定义,外部变量的声明和定义可以在类型名前显式加extern关键字。但只有在定义时才可以用“=”后跟值或者表达式的形式予以初始化。
定义时如果不初始化,除将被自动变量外,其他变量默认初始化为全0或者NULL。
自动变量没有默认初始化,因此如果自动变量定义时不初始化,起始值就是不确定的。
⑧ C语言中全局变量的作用域一定比局部变量的作用域大 对不
错 如果同一个源文件中,只有一个主函数,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,即它不起作用。所以是错的
8.1.1 局部变量
局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内, 离开该函数后再使用这种变量是非法的。
例如:
int f1(int a) /*函数f1*/
{
int b,c;
……
}
a,b,c有效
int f2(int x) /*函数f2*/
{
int y,z;
……
}
x,y,z有效
main()
{
int m,n;
……
}
m,n有效
在函数f1内定义了三个变量,a为形参,b,c为一般变量。在 f1的范围内a,b,c有效,或者说a,b,c变量的作用域限于f1内。同理,x,y,z的作用域限于f2内。m,n的作用域限于main函数内。关于局部变量的作用域还要说明以下几点:
1) 主函数中定义的变量也只能在主函数中使用,不能在其它函数中使用。同时,主函数中也不能使用其它函数中定义的变量。因为主函数也是一个函数,它与其它函数是平行关系。这一点是与其它语言不同的,应予以注意。
2) 形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。
3) 允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。如在前例中,形参和实参的变量名都为n,是完全允许的。
4) 在复合语句中也可定义变量,其作用域只在复合语句范围内。
例如:
main()
{
int s,a;
……
{
int b;
s=a+b;
…… /*b作用域*/
}
…… /*s,a作用域*/
}
【例8.12】
main()
{
int i=2,j=3,k;
k=i+j;
{
int k=8;
printf("%d\n",k);
}
printf("%d\n",k);
}
本程序在main中定义了i,j,k三个变量,其中k未赋初值。而在复合语句内又定义了一个变量k,并赋初值为8。应该注意这两个k不是同一个变量。在复合语句外由main定义的k起作用,而在复合语句内则由在复合语句内定义的k起作用。因此程序第4行的k为main所定义,其值应为5。第7行输出k值,该行在复合语句内,由复合语句内定义的k起作用,其初值为8,故输出值为8,第9行输出i,k值。i是在整个程序中有效的,第7行对i赋值为3,故以输出也为3。而第9行已在复合语句之外,输出的k应为main所定义的k,此k值由第4 行已获得为5,故输出也为5。
8.1.2 全局变量
全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量,一般应作全局变量说明。 只有在函数内经过说明的全局变量才能使用。全局变量的说明符为extern。但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。
例如:
int a,b; /*外部变量*/
void f1() /*函数f1*/
{
……
}
float x,y; /*外部变量*/
int fz() /*函数fz*/
{
……
}
main() /*主函数*/
{
……
}
从上例可以看出a、b、x、y 都是在函数外部定义的外部变量,都是全局变量。但x,y 定义在函数f1之后,而在f1内又无对x,y的说明,所以它们在f1内无效。a,b定义在源程序最前面,因此在f1,f2及main内不加说明也可使用。
【例8.13】输入正方体的长宽高l,w,h。求体积及三个面x*y,x*z,y*z的面积。
int s1,s2,s3;
int vs( int a,int b,int c)
{
int v;
v=a*b*c;
s1=a*b;
s2=b*c;
s3=a*c;
return v;
}
main()
{
int v,l,w,h;
printf("\ninput length,width and height\n");
scanf("%d%d%d",&l,&w,&h);
v=vs(l,w,h);
printf("\nv=%d,s1=%d,s2=%d,s3=%d\n",v,s1,s2,s3);
}
【例8.14】外部变量与局部变量同名。
int a=3,b=5; /*a,b为外部变量*/
max(int a,int b) /*a,b为外部变量*/
{int c;
c=a>b?a:b;
return(c);
}
main()
{int a=8;
printf("%d\n",max(a,b));
}
如果同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,即它不起作用。
⑨ C语言“局部变量作用域”的问题
没有什么不对啊。完全正常的。
因为从main()调用add( )函数时的实参num=3在完成了传递值以后版,main( )与add( )函数的变量之间就相互没有了权关系。add( )函数中num++并输出4以后,对main( )函数中的变量没有丝毫的关系,所以返回后,输出main( )中的num的值仍是3。