20140927142231_6249
栏目导航
www.5144.net
www.1883.cm > www.5144.net > 文章
因而因为隐真上“局部变量”战“全局变量”这
发布时间:2019-09-10  浏览次数:

  对于静态局部变量来说,正在函数内以static声明的变量虽然取从动局部变量的感化域不异(即感化域都只限于函数内),但存储空间是以静态分派而非默认的从动分派体例获取的,因此存储空间所正在区域分歧(一般来说,静态分派时存储空间于编译时正在法式数据段分派,一次分派全程无效;而从动分派时存储空间则是于挪用栈上分派,只正在挪用时分派取),且两次挪用间变量值一直连结分歧;必需留意,静态局部变量只能初始化一次,这是由编译器来保现。

  对于静态变量来说,正在C++中,正在类的定义中以static声明的变量属于类变量,也即正在所有类实例享,取之相对的就是过程变量。

  林昌意. C 言语法式设想[J]. 中国电力教育: 上, 2006 (0S2): 364-365.

  classRequest{ private: staticintcount;//不克不及为外部挪用 stringurl;//只能被函数挪用 public: Request() { count++; } stringgetUrl()const{returnurl;} voidsetUrl(stringvalue) { url=value; } staticintgetCount() { returncount; } }; intRequest::count=0;//count能够正在类声明外进行初始化

  对于静态全局变量来说,针对某一源文件的以static声明的文件级变量取函数的感化域只限于文件内(只正在文件内可见),也即“内部毗连”,因此能够用来限制变量的感化域;

  除明白标识出变量的生命周期外,将变量声明为static存储类还会按照变量属性分歧而有一些特殊的感化:

  #includestdio.hvoidfunc(){staticintx=0;//正在对func的三次挪用中,x只进行一次初始化printf(%d\n,x);//输出x的值x=x+1;}intmain(intargc,char*constargv[]){func();//输出0func();//输出1func();//输出2return0;}

  静态变量也能够用于存储。具体来说,静态变量(全局变量及汇编言语里定义的符号亦同)可用const,constant或final(按照言语决定)等环节字标识,这时其值就会正在编译时设定,而且无法正在运转时改变。编译器凡是将静态常量取文本一路置于方针文件的文本区域,而很是量初始化数据则置于数据区;而如如有需要,有些编译器还可选择为其斥地公用区;为防止变量被错误的指针写入笼盖,亦可正在这块区域启用内存机制。

  声明:百科词条人人可编纂,词条建立和点窜均免费,毫不存正在及代办署理商付费代编,请勿上当。详情

  易见存储类为extern的变量(包罗提到的未明白声明存储类的文件级变量)婚配前段所述静态变量的定义1,但不婚配定义2。

  )正在计较机编程范畴指正在法式施行前系统就为之静态分派(也即正在运转时中不再改变分派环境)存储空间的一类变量。取之相对应的是正在运转时只临时存正在的从动变量(即局部变量)取以动态分派体例获取存储空间的一些对象,此中从动变量的存储空间正在挪用栈上分派取。

  正在C言语及由其派生出的C++Objective-C等法式言语中,“static”是用于节制变量的生命周期和毗连体例(即其感化域,亦即可见性)的保留字。切当来说,正如C族言语中的extern,auto取register这些保留字一样,static也是一种存储类(此处的“类”取面向对象言语的“类”的定义分歧)标识。每个变量取函数都有以上的一种存储类标识,若是正在声明中没有明白标识其存储类,编译时就会按照上下文来选择其默认存储类,如正在源文件里的所有文件级变量对应的默认存储类是extern,而正在函数体内的变量对应的则是auto,各存储类的属性如下表所列。

  而正在以Pascal为代表的很多法式言语中,所有局部变量都由系统从动分派存储空间,而所有全局变量的存储空间则以静态分派的体例获取(对应“静态变量”),因而因为现实上“局部变量”和“全局变量”这两个术语已脚以涵盖所有的环境,正在这些法式言语中凡是晦气用“静态变量”这一术语,而间接以“全局变量”代之。一般来说,正在这些法式言语中,静态变量就是全局变量,而即便正在有明白区分全局和静态变量的法式言语中,正在编译后的代码里二者也以不异的体例获取存储空间。而今术语“静态变量”的概念则次要基于C族言语的“static”的定义(即定义2)。