电子094徐超0903741182C++中的变量#includeiostream.hinta=10;voidmain(void){inta=20;a=a+::a;{inta=50;::a=::a+a;}couta'\t'::aendl;}(1)块块是用花括号括起来的一部分程序。(2)块作用域在块内说明的变量具有块作用域,其作用域:从变量说明处到块的结束处(即块的右花括号处)。C++语言规定:当程序块嵌套时,如果外层块中的变量与内层块中的变量同名,则在内层块执行时,外层块中的同名变量不起作用,即局部优先。文件作用域在函数外定义的变量(或用extern说明的变量)具有文件作用域。其作用域:从函数外定义变量的位置开始到该源程序文件结束(可用extern进行扩展)。1.局部变量在函数或块内定义的变量称为局部变量,具有块作用域,假如函数同名,快内的变量不影响快外的变量。2.全局变量定义在函数外的变量称为全局变量,具有文件作用域。注意:当具有块作用域的局部变量与具有文件作用域的全局变量同名时,与局部变量同名的全局变量不起作用,即局部变量优先。但与块嵌套不同的是,在块作用域内可通过作用域运算符“::”来引用与局部变量同名的全局变量。全局变量、局部变量:局部变量优先(各有存储空间)局部变量、块内局部变量:块内局部变量优先(各有存储空间)变量类型1.动态变量:在程序执行过程中分配存储空间的变量(new、malloc、快内局部变量auto、register)2.静态变量:程序开始执行时就分配存储空间的变量。Auto、register类型的变量是动态局部变量,具有块作用域。只在块内有生命,脱离快无意义。Inta;voidqsh()externinta;Voidqsh(){coutaendl;}voidqsh()正确报错正确电子094徐超0903741182{coutaendl;}inta;{coutaendl;}Voidmain()voidmain()inta;{}{}voidmain()Inta;这是全局变量,用它的时候得在函数前面定义,若是在函数后面或是来自外部文件的全局变量,必须使用extern声明一下。“局部变量”存在于临时为函数分配的栈空间中,函数退出时该函数的栈帧被销毁,因此局部变量也不复存在,但“静态局部变量”与之不同,它存放在程序的数据段内,数据段是在进程启动系统为其开辟内存空间时就分配的一段专门存放数据的内存,在进程退出前一直存在,所以静态局部变量的数据能够一直保存。它们之间没有属于的关系,是存储方式完全不同的两种类型。尽管它们都是写在函数内部的变量,作用域在局部,不可以在函数外部使用局部变量和静态局部变量,这是它们唯一的共同点。全局变量声明之前加上static,就是静态全局变量。全局变量和静态全局变量都是静态存储的;在存储上无区别。区别在于他们的作用域;全局变量的作用域是整个源程序,当源程序有多个源文件组成时,全局变量在各个源程序文件都是有效的;而静态全局变量怎被限制了作用域,只在定义该变量的源文件内有用在同一程序的其他源文件不能使用!还有静态全局变量/静态局部变量只初始化一次,防止在其他源文件调用!而全局变量可以再其他源文件初始化!!也就是说全局变量可以在同一个源程序的其他cpp文件内使用,用时用extern声明一下;静态全局变量只能在此一个cpp文件内使用,不能用extern在外部cpp文件声明。Extern声明的全局变量等效于静态全局变量。(1)静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。(2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后,尽管该变量还继续存在,但不能使用它。(3)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。根据静态局部变量的特点,可以看出它是一种生存期为整个源文件的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用(尤其是短名全局变量的变量名污染很严重),因此仍以采用局部静态变量为宜。简单的说静态局部变量与全局变量最明显的区别就在于:全局变量在其定义后所有函数都能用,但是静态局部变量只能在一个函数里面用.1、变量的生存期变量的生存期是指变量值保留的期限,可分为两种情况:(1)静态存储:变量存储在内存中的静态存储区,在编译时就分配了存储空间,电子094徐超0903741182在整个程序运行期间,该变量占有固定的存储单元,变量的值都始终存在,程序结束后,这部分空间才释放。这类变量的生存期为整个程序。(2)动态存储:变量存储在内存中的动态存储区,在程序运行过程中,只有当变量所在函数被调用时,编译系统临时为该变量分配一段内存单元,该变量有值,函数调用结束,变量值消失,这部分空间释放。我们说这类变量的生存期仅在函数调用期间。2、变量的作用域变量的作用域也称为可见性,指变量的有效范围,可分为局部与全局两种情况:(1)局部变量:在一个函数或复合语句内定义的变量,称为局部变量,局部变量仅在定义它的函数或复合语句内有效。例如函数的形参是局部变量。编译时,编译系统不为局部变量分配内存单元,而是在程序的运行中,当局部变量所在的函数被调用时,编译系统根据需要临时分配内存,调用结束,空间释放。例:分析程序的运行结果。func11(){intx=3;{intx=2;/*第一个复合语句中的局部变量*/{intx=1;/*第二个复合语句中的局部变量*/printf(*x=%d\n,x);}printf(**x=%d\n,x);}printf(***x=%d\n,x);}main(){intx=10;printf(1:x=%d\n,x);func11();printf(2:x=%d\n,x);}程序的运行结果是:1:x=10/*输出主函数内的变量x*/*x=1/*输出第一个复合语句中的变量x*/**x=2/*输出第二个复合语句中的变量x*/***x=3/*输出函数func11中的变量x*/2:x=10/*输出主函数内的变量x*/(2)全局变量:变量在所有函数之外定义称为全局变量,其作用范围为从定义开始,到本文件结束。全程变量一经定义,编译系统为其分配固定的内存单元,在程序运行的自始至终都占用固定单元。如果在定义之前使用该全局变量,用extern加以说明,则可扩展全局变量的作用域。(3)使用全局变量与局部变量,应注意以下几点:电子094徐超0903741182①不同函数内的局部变量可以重名,互不影响。②全局变量与局部变量可以同名,在局部变量起作用的范围内,全局变量不起作用。③全局变量的初始化只能有一次,是在对全局变量说明的时候。例:分析以下程序的运行结果。intx=100;/*全局变量的定义*/func12(){intx=10;/*局部变量,函数内有效*/f();ff();printf(%d\n,x);}f(){intx=500;/*局部变量,函数内有效*/x+=100;printf(%d\n,x);}ff(){x+=100;/*使用全局变量*/printf(%d\n,x);}程序运行结果:600/*调用函数f()的结果*/200/*调用函数ff()的结果*/10/*函数func12()的结果*/自动变量自动变量是最常见的一类变量,将变量的存储属性定义为自动变量的形式是:auto类型说明符变量名;一般地说,不加说明的变量都属于自动变量,因此:autointa;等价于inta;autofloatb;等价于floatb;autocharstr[100]等价于charstr[100];自动变量的说明必须在一个函数体的内部进行,函数的形参也是自动变量。自动变量的作用域是在所说明的函数中。自动变量实质上是一个函数内部的局部变量。只有该函数被调用时它才存在,从函数中返回时即消失,它们的值也仅限于说明它的函数,其它函数不能存取。自动变量随函数的引用与否而存在和消失,在两次调用之间自动变量不会保持变量值,因此每次调用函数时都必须首先为自动变量赋值后才能使用(参加运算)。如果不置初值,则变量的值为随机的不定值。电子094徐超0903741182由于自动变量具有局部性,所以在两个函数中可以分别使用同名的变量而互不影响。例:分析程序打印结果:main(){intx=1;/*函数main中的自动变量x*/voidf1(),f2();f1();f2(x);/*分别调用函数f1和f2*/printf(x=%d\n,x);}voidf1(void){intx=3;/*函数f1中的自动变量x*/printf(x=%d\t,x);}voidf2(x)intx;/*函数f2中的形参x也是自动变量*/{printf(x=%d\t,++x);/*x加1*/}程序中有三个x分别在三个不同的函数中,这三个x都是自动变量,所以三个x分别局部于三不同的函数,在三个函数中对x的操作互不影响,故运行程序打印如下结果:x=3x=2x=1外部变量外部变量的定义形式是:extern类型说明符变量名;所谓外部是相对于函数内部而言的,C语言的外部变量就是定义在所有函数之外的全局变量。它可以被所有的函数访问,在所有函数体的内部都是有效的,所以函数之间可以通过外部变量直接传递数据。例:分析程序运行结果。#includestdio.hintx;/*说明外部变量x*/main(){voidaddone(),subone();x=1;/*为外部变量x赋值*/printf(xbeginsis%d\n,x);addone();subone();subone();addone();addone();printf(xwindsupas%d\n,x);}voidaddone(void)电子094徐超0903741182{x++;/*使用外部变量x*/printf(add1tomake%d\n,x);}voidsubone(void){x--;/*使用外部变量x*/printf(substract1tomake%d\n,x);}在程序的最前面语句intx;说明了变量x;该说明语句的位置在所有函数之外,所以变量x为外部变量,对函数main、addone和subone来说,变量x是全局变量,在这些函数的内部都是有效的。函数addone和subone都是void型函数,它们没有返回值,没有形参。函数间的数据传递都是靠外部变量x进行的。执行程序中,main中将x赋值为1,调用addone函数,x++后x为2;调用subone时,x--后x为1,第二次调用subone函数,x--后x的值为0,分析程序运行过程可以得到程序的执行结果为:xbeginsis1add1tomake2substract1tomake1substract1tomake0add1tomake1add1tomake2xwindsupas2外部变量在编译的时侯由系统分配永久的存储空间。如果外部变量的说明与使用在同一个文件中,则在该文件中的函数在使用外部变量时,不需要再进行其它的说明,可以直接使用。当外部变量的说明与使用在两个不同的文件,要使用其它文件中说明的外部变量,就必须在使用该外部变量之前,使用extern存储类型说明符进行变量外部说明。extern仅仅是说明变量是外部的,以及它的类型,并不真正分配存储空间。在将若干个文件连接生成一个完整的可运行程序时,系统会将不同文件中使用的同一外部变量连在一起,使用同一系统分配的存储单元。C语言中不仅有外部变量,而且有外部函数。由于C语言不允许在函数内部再定义函数,所以一个函数相对于另一函数本身就是外部的。当要调用的函数在另一个