什么是变量
变量是在程序执行的过程中,值可以变化的量。变量被存放于内存空间之中,使用变量之前必须要先声明变量的类型和名字。
变量名是一种标识符,需要遵守标识符的命名规则
标识符命名规则
1,必须以大写字母,小写字母或者下划线开头。
2,必须以大写字母,小写字母,下划线及0~9的数字组成。
3,不能占用c++的关键字
4,区分大小写
常见问题
问题一:有哪些是c++关键字?
c++关键字很多,更加离谱的事情是,按理来说,一门语言的关键字在不发生重大变革的时候,应当是不会继续添加了。但是c++的关键字还在不断增加。我并不打算现在就把所有的c++关键字都贴出来,这样做意义有限。我们也不应当照着关键字表把它们都背下来,以后常用的自然就熟悉了。所以,没有必要太过在意这个问题。
问题二:我用中文好像也可以通过编译,可以用中文吗?
这是一个很奇怪的问题,其实我应该避免提到这个问题会更好一些。因为很多人不知道中文也可以通过编译的话,那他就不需要纠结是否可以使用中文了。一般来说,最好不要这样做,如果你喜欢,而且你认为这样做也不会给你带来困扰,那么为什么不呢?
问题三:命名有什么要求吗,可以用汉语拼音吗?
一般来说,常见的命名规则有四种
1,小驼峰命名风格
单词的首字母小写,其他字母大写
例如:helloWorld
2,大驼峰命名风格
所有单词的首字母都大写
例如:HelloWorld
3,匈牙利命名风格
变量名中标注了变量类型
例如:sHelloWorld,iNum
4,下划线命名风格
所有的单词用下划线分隔
例如:hello_world
按照所谓各种规范,我们可以提出各种要求,比如必须使用英文,函数名和变量名应该用下划线/小驼峰,类名应该用大驼峰等等
但是,正如我之前所说的那样,c++是一种非常自由的语言,我们不应该被这种所谓的各种规范所束缚。按照你喜欢的方式就好了。
变量的声明
刚刚有提到过,变量的声明必须包括数据类型和名字,一次可以声明多个变量。
// 声明了两个int类型的变量,a和b
int a, b;
// 声明了三个float类型的变量,c,d和e
float c, d, e;
为什么使用变量前需要声明?
在强类型语言中,我们必须给出变量的类型,因此需要声明。
但是实际上,在弱类型语言中,可能也会要求我们声明变量,例如:var a = 100;
原因是,如果我们在使用变量前不需要声明,就可以直接使用的话,那么当我们在使用原有变量的过程中,如果不小心将其拼写错了,会自动变成定义一个新的变量,这样的错误难以被发现。本着事先麻烦总是好过事后麻烦的原则,因此在弱类型语言中,可能也会要求必须在使用变量前声明。这样做是有好处的,并非是在为难使用者。
变量的定义
定义和声明的区别
声明是声明一个变量,仅仅只是声明,不需要划分内存空间
定义是定义一个变量,需要划分内存空间
但是实际上,在正常情况下,声明变量的同时都会定义变量(也即划分内存空间),因此在正常情况下,声明变量和定义变量是一个意思。特殊情况中,会出现只声明,但是不定义变量的情况。
变量的赋值
// 先声明,再赋值
int a;
a = 100;
// 声明(定义)的同时,赋值,也即初始化
int b = 150;
// 可以一次声明多个
int c, d, e;
// 也可以连续赋值
c = d = e = a + b;
如果在定义变量时没有初始化,那么变量中会保存什么?答案是,不知道。因为如果你在定义变量的时候,不进行初始化,那么正常来说,编译器也不会给你将其初始化为0,因此,我们无法确定里面到底会保存什么。
变量的存储类型
原本可声明的常用的存储类型有四种
auto:以堆栈方式自动存储(于c++11废弃)
register:存放于寄存器中(于c++11废弃)
static:静态存储,固定地址存放,整个程序运行期间有效
extern:指定外部链接,在当前文件中声明要使用其他文件中定义的变量
c++11以前是可以手动声明为auto类型和register类型的。但是由于默认的就是auto类型,所以auto关键字已于c++11以后被更改。声明为register类型已经在现如今失去意义,因此于c++11废弃,c++17以后register的关键字被投入用作其他用途使用。
以下这段内容属于历史知识的补充,如果你只希望写代码的话,可以跳过
这里再多插一句,为什么当初会有auto。c++中最早的auto是从c语言中继承过来的,但是实际上,之所以在c语言中会有auto,是c语言从b语言中继承来的。当初b语言是一种无类型语言,没有像int这样的关键字,所以使用auto来定义变量。于是就从b语言一直传到了c++,一直用到了c++11才被废弃。
顺便再提一下老版本的register(c++11以前的),当初的register,也就是所谓的寄存器变量,也并非一定是指这个变量会被放入到寄存器中,而是要求编译器,尽可能的提高该变量的访问速度,最好放到寄存器里。由于这种要求的特殊性,因此register没有办法获取到变量地址,不能声明为全局变量或者静态变量,只能在局部使用。当然,即使你将其声明为register变量,那么,编译器到底会怎么处理它,也要取决于编译器的实现。另外,由于很多时候编译器可以做的比写代码的人更好,因此,即使是在二十年前register还没有废弃的时候,也是建议最好不要使用该方法
变量的左值和右值
注意:这是传统意义上的左值和右值,并非现代c++意义上的左值和右值。
最早的传统定义:能在赋值运算符的左边使用的值是左值,在右边使用的值是右值。
1,变量的数值,也即存储于内存中保留的值,这个值也称为右值
2,变量的地址,也即存储于内存的地址值,这个值也称为左值
int a, b;
a = 100;
b = a;
比如观察这样一段简单的代码,b = a,结果是什么,最终的结果应该是现在b和a同样为100
在这个情况下,b是地址,a是保存的值,也即b = a的过程中,b是左值,而a是右值
int a;
// 将a赋值为100,是可以的
a = 100
// 将200赋值为a,是不可以的,它不是一个左值
200 = a
cv限定符
const:如果一个变量要设置为不可变的类型,需要使用const
volatile:如果一个变量要设置为易变的类型,需要使用volatile
const volatile:如果一个变量又不可变,又易变,需要设置为const volatile
如果将一个变量设置为const类型(也相当于是设置为常量),那么你必须在定义的时候给出其值。如果在定义一个const类型的常量的时候,没有给出值,那么就会失去再对其进行赋值的机会。
vovatile是告诉编译器,即使在程序本身中没有修改这个变量,但是在其他地方,例如操作系统,可能把这个变量修改了。因此不要针对这个变量的使用进行优化。
注:设定为const类型的常量,其值是不可以修改的。也许你可以通过一些技巧去尝试修改它的值,但是这可能会报错或者导致出现未定义的行为。因此,不应该这样做。
typedef别名
typedef 类型名 别名
按照以上格式,可以为类型名声明别名。
// 为unsigned long long声明别名ull
typedef unsigned long long ull;
typedef只用来起别名,typedef不会定义新的类型,也不会改变原有的类型,也不会改变原有的名字。也就是原本的名字和新的别名同时可以正常使用。
也可以使用typedef一次声明多个别名。
// 此时ull,unll,un_l_l都是unsigned long long的别名
typedef unsigned long long ull, unll, un_l_l
本文介绍了C++中的变量使用,包括变量的概念、标识符命名规则、变量的声明和定义、赋值、存储类型、左值和右值以及cv限定符。强调了变量在程序中的作用和声明的必要性,同时讲解了不同命名风格和存储类型的含义。
543

被折叠的 条评论
为什么被折叠?



