【c++教程】1.4-变量的使用

本文介绍了C++中的变量使用,包括变量的概念、标识符命名规则、变量的声明和定义、赋值、存储类型、左值和右值以及cv限定符。强调了变量在程序中的作用和声明的必要性,同时讲解了不同命名风格和存储类型的含义。

什么是变量

变量是在程序执行的过程中,值可以变化的量。变量被存放于内存空间之中,使用变量之前必须要先声明变量的类型和名字。

变量名是一种标识符,需要遵守标识符的命名规则

标识符命名规则

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类型的常量,其值是不可以修改的。也许你可以通过一些技巧去尝试修改它的值,但是这可能会报错或者导致出现未定义的行为。因此,不应该这样做。

如果要在指针中使用const限定,请查看这里

如果要在迭代器中使用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++教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值