c/c++中变量的作用域

摘要:
局部变量通常被称为自动变量,因为它们在进入范围时自动生成,在离开范围时自动消失。通常,函数中定义的局部变量在函数的作用域结束时消失。静态局部变量的优点是它在函数范围之外不可用,因此不能轻易更改。

作用域规则告诉我们一个变量的有效范围,它在哪儿创建,在哪儿销毁(也就是说超出了作用域)。变量的有效作用域从它的定义点开始,到和定义变量之前最邻近的开括号配对的第一个闭括号。也就是说,作用域由变量所在的最近一对括号确定。

(1) 全局变量:

   全局变量是在所有函数体的外部定义的,程序的所在部分(甚至其它文件中的代码)都可以使用。全局变量不受作用域的影响(也就是说,全局变量的生命期一直到程序的结束)。如果在一个文件中使用extern关键字来声明另一个文件中存在的全局变量,那么这个文件可以使用这个数据。

(2) 局部变量:

    局部变量出现在一个作用域内,它们是局限于一个函数的。局部变量经常被称为自动变量,因为它们在进入作用域时自动生成,离开作用域时自动消失。关键字auto可以显式地说明这个问题,但是局部变量默认为auto,所以没有必要声明为auto。

(3) 寄存器变量

   寄存器变量是一种局部变量。关键字register告诉编译器“尽可能快地访问这个变量”。加快访问速度取决于现实,但是,正如名字所暗示的那样,这经常是通过在寄存器中放置变量来做到的。这并不能保证将变置在寄存器中,甚至也不能保证提高访问速度。这只是对编译器的一个暗示。

使用register变量是有限制的:(1) 不可能得到或计算register 变量的地址; (2) register变量只能在一个块中声明(不可能有全局的或静态的register变量)。然而可以在一个函数中(即在参数表中)使用register变量作为一个形式参数。

    一般地,不应当推测编译器的优化器,因为它可能比我们做得更好。因此,最好避免使用关键字register

(4) 静态变量

   关键字static有一些独特的意义。通常,函数中定义局部变量在函数中作用域结束时消失。当再次调用这个函数时,会重新创建变量的存储空间,其值会被重新初始化。如果想使局部变量的值在程序的整个生命期里仍然存在,我们可以定义函数的局部变量为static(静态的),并给它一个初始化。初始化只在函数第一次调用时执行,函数调用之间变量的值保持不变,这种方式,函数可以“记住”函数调用之间的一些信息片断。这也就是所谓的静态局部变量,具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只在定义自己的函数体内始终可见。

   我们可能奇怪为什么不使用全局变量。static局部变量的优点是在函数范围之外它是不可用的,所以它不可能被轻易改变。这会使错误局部化。

   此外同样存在静态全局变量,具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。

(5) 外部变量

   extern告诉编译器存在着一个变量和函数,即使编译器在当前的文件中没有看到它。这个变量或函数可能在一个文件或者在当前文件的后面定义。例如extern int i;编译器会知道i肯定作为全局变量存在于某处。当编译器看到变量i的定义时,并没有看到别的声明,所以知道它在文件的前面已经找到了同样声明的i。

(6) const常量

    const告诉编译器这个名字表示常量,不管是内部的还是用户定义的数据类型都可以定义为const。如果定义了某对象为常量,然后试图改变它,编译器将会产生错误。在C++中一个const必须有初始值。

(7) volatile变量

    限定词const告诉编译器“这是不会改变的”(这就是允许编译器执行额外的优化);而限定词volatile则告诉编译器“不知道何时变化”,防止编译器依据变量的稳定性作任何优化。

    从分配内存空间看:全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间

 

 
 

免责声明:文章转载自《c/c++中变量的作用域》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇.Net面试题Xamarin.Forms学习系列之SQLite下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JS高级---把局部变量变成全局变量

如何把局部变量变成全局变量?  把局部变量给window就可以了     函数的自调用---自调用函数 一次性的函数--声明的同时, 直接调用了 (function () { console.log("函数"); })(); 局部变量 页面加载后.这个自调用函数的代码就执行完了 (function (形参) {...

Golang反射上篇

目录 1、反射的定义 2、反射的基础数据类型 3、Type 4、Value 5、反射三大定律 5.1 反射第一定律 5.2 反射第二定律 5.3 反射第三定律 6、反射常用的API 6.1 获取type类型 6.2 获取Field信息 6.3 获取method信息 6.4 获取函数信息 6.5 赋值和转换关系 6.6 是否实现接口 6.7 v...

Delphi部分函数、命令、属性中文说明

Abort 函数 引起放弃的意外处理Abs 函数 绝对值函数AddExitProc 函数 将一过程添加到运行时库的结束过程表中Addr 函数 返回指定对象的地址AdjustLineBreaks 函数 将给定字符串的行分隔符调整为CR/LF序列Align 属性 使控件位于窗口某部分Alignment 属性 控件标签的文字位置AllocMem 函数 在堆栈上分...

r语言 列出所有变量

你希望知道目前工作空间中存在哪些已定义的变量和函数。 解决方案 使用ls函数,或者使用ls.str函数了解每个变量更详细的信息。 讨论 ls函数可以显示当前工作空间中所有对象的名称:> x <- 10> y <- 50> z <- c("three", "blind", "mice")> f <- funct...

[zz]Linux中的/etc/profile文件

【一、让/etc/profile文件修改后立即生效】 方法1:让/etc/profile文件修改后立即生效 ,可以使用如下命令:# .  /etc/profile注意: . 和 /etc/profile 有空格方法2:让/etc/profile文件修改后立即生效 ,可以使用如下命令:# source /etc/profile附:Linux中source命令...

SPSS基础知识

3.1 数据的输入和保存 1. 打开SPSS后,界面包括变量视图和数据视图。 变量视图,用于对变量进行设置,数据视图为用户输入的数据。 2. SPSS有大量的函数调用功能进行数据分析 常用的数据分析包括比较均值、一般线性模型、广义线性模型、回归分析、相关分析、神经网络、分类和降维(适用于经济学、评价因子值和得分计算等问题)等等。 3.2 SPSS图形绘制...