C/C++中的变量与常量

删除回忆录丶 提交于 2020-02-28 06:15:11

    C/C++中的变量

在定义变量时,C与C++ 有明显的区别。这两种语言都要求变量使用前必须定义,但是C(和许多其他传统过程语言)强制在作用域的开始处就定义所有的变量,以便在编译器创建一个块时,能够给所有的这些变量分配空间。(这个说法已经是老皇历了,现在的编译器即使是不在开始处定义变量也是可以做优化的,所以写C程序时完全可以像C++那样在任何方便的地方定义变量)。在C/C++中变量与函数在内存中是分开存放的。

       全局变量

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

       局部变量

      局部变量出现在一个作用域内,是局限于一个函数的。局部变量经常被称为自动变量(automatic variable),因为是进入作用域时自动生成,离开作用域时候自动消失。关键字auto可以显示的说明这个问题,但是局部变量默认为auto,所以没有必要声明为auto。局部变量的内存中会被放在栈上。

       寄存器变量:是一种局部变量。关键字register告诉编译器“尽可能快地访问这个变量”。加快访问速度取决于实现,但是,正如名字所暗示的那样子,这经常是通过在寄存器中放置变量来做到的。这并不能保证将变量放置在寄存器中,甚至也不能保证提高访问速度,这只是对编辑器的一个暗示(所以说register关键字的意义在哪里啊喂!这么多年来我一直以为是直接放在寄存器里的啊)使用register的限制:不可能得到或计算register变量的地址,register变量只能在一个块中声明(不能有全局的或静态的register变量);但是可以作为形参;总之,尽量不要使用register变量。

       静态变量

      关键字static有一些特殊的意义。

       静态局部变量:当在一个块内定义了静态局部变量之后,局部变量不会随着作用域的结束而自动的被销毁,会一直存在,如果下一次再调用这个块,那么静态局部变量的值回保留上次执行之后的结果。静态局部变量虽然不会随着作用域的结束而销毁,但是在作用域之外是不可见的(这也符合“局部变量”这个名号)。之所以不会被销毁是因为静态局部变量分配在内存的静态存储区上。

       静态全局变量,静态函数:static关键字修饰全局变量与修饰函数时候功能都一样,意思是“在文件的外部不可以使用这个名字”,即函数或变量时局部于文件的,具有文件作用域(file scope)。如果其他文件使用extern关键字来引用一个static类型的变量或函数会导致编译器报错。

       静态类成员函数、静态类数据成员:表示这个数据成员或者这个成员函数是为整个类所共享的,访问时候不需要用对象名,直接用类名即可访问。

       外部变量

       extern关键字告诉编译器存在一个函数或者变量,即使不在当前的文件中也会在其他文件中。

        volatile变量

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

 

C/C++中的常量

       旧版本的C中,定义常量必须使用预处理器,如

       # define PI 3.14

这种方式仅仅是做了一个替换。此时不能对PI 进行类型检查,不能得到PI的地址(所以不能向PI传递一个指针或引用),PI不能是用户定义的类型。PI的意义是从定义它的地方直到文件结束;因为预处理器并不识别作用域。

       后来在C/C++中引入了关键字const,用来定义命名常量,命名常量如同变量一样,只不过其值不能改变;const告诉编译器这个名字表示常量。无论内部还是用户定义的数据类型都可以定义为const;也可以获得命名常量的地址;也有作用域;

         Const 由C++ 采用,并且加入到标准C中,但是在C中使用const和C++中使用const是完全不一样的。在C中,编译器对待const如同变量一样,只不过不会改变其值;且会为其分配存储空间,所以在两个不同文件中(或在头文件中)定义多个同名const时候,连接器会生成发生冲突的消息。另外,在C++中,一个const必须有初始值,而C则不是这样(因为C把const当做变量对待?)。总之,在C++中使用const会更好。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!