C++变量

在一个C++程序中,我们希望能够使用数据。编程的大部分内容实际上都是在使用数据。而我们在程序中使用的任何数据,包括修改、读写这些数据,都需要通过一种叫做变量的东西来进行存储。变量允许我们给数据命名,允许我们将数据存储在内存中,以便使用这些数据。

举个例子,假设你正在制作一款游戏,游戏有一个球员,球员角色附带有在地图上的某个位置信息,且角色可以移动。当需要把球员放在屏幕上,与关卡的其他部分互动时,我们需要能够存储球员的位置,位置也是一种数据。我们可以看到,球员到底在哪里?我们想要用一个变量存储球员位置,用变量记录数据这是写所有程序的最基本的。无论任何编程语言,我们都需要能够利用数据,将数据存储在某个地方。当我们创建一个变量时,它将被存储在内存中的两个地方堆和栈,这个会在后续的篇章中继续讲解。现在,只要知道变量确实会占用内存。那是我实际存储数据的地方。在我们计算机的内存中。

在C++中,我们有一堆原始数据类型。这些基本的数据类型基本上构成了我们在程序中存储的任何数据。每种数据类型都有特定的用途,虽然它有特定的目的,实际上你也不一定就是用于这个目的。有趣的是,C++是一种非常强大的语言,这意味着当你实际上做某件事的时候实际上很少有规则限制。

当我解释变量时,我喜欢这样说,在C++中不同变量类型之间唯一区别是占用内存大小。这个变量会占用多少内容,这实际上是这些原始数据类型之间的唯一区别。

2. 案例

下面,进入案例

我们现在有这么一个项目,项目中只有一个Main.cpp文件,内容如下

我们已经有了一个变量类型,main函数的返回值int

1. int类型

int表示整数,它让我们在给定的条件下存储一个整数。

如果我们想声明一个全新的变量,我们可以这样做,输入这个变量类型int并给这个变量起个名字,如variable,然后给他一个如:int variable = 8;,当然赋值不一定要现在就赋值,这是可选的。如下

int传统上为4个字节的数据类型。

数据类型的实际大小取决于编译器,不同的编译器会有所不同

由编译器确定类型的大小,int数据类型的意思,在一定范围内存储整数,因为它是4个字节大小,所以存储的数字被限制在一定的范围内。具体来说,int是一个有符号整数,它的取值范围可见表,任何在范围之外的数字,都需要比int类型更大数据类型来存储。

让我们来试着打印变量,以查看它实际上是什么,我们将用variable这个变量来替换"Hello World",这样我们可以打印这个variable变量到控制台。如下

让我们按下F5来运行程序

可以看到打印出了数字8

我们可以继续修改变量,例如,将它重新分配到20这样的值。然后再打印一次。如下

再来按下F5运行程序,看看会发生什么。

可以看到先打印8,然后打印20。这就是我们的结果。

就像我们说的,int数据类型可以存储的-2147483648 到 2147483647的值。所以你可能会说,为什么是这个范围,这些限制来自哪里,有什么意义?答案是肯定的,他们是有意义的。变量的类型大小与它能存储多大的数据直接相关一个整数int是4个字节,那么就可以在这个范围内存储这4个字节的数据值。

让我们分析一下,一个字节是8个比特位的数据,这意味着4个字节是32位的数据。因为这个变量有符号,这意味着它可以是负的,它包含一个像负号一样的符号。因为这个变量有符号,这32位中的一个表示符号,这样我们就知道了,它是正的还是负的。实际数字只剩下31位一个比特位可以是0或是1。一个比特有两个可能的值,用一点数学,我们可以说我们有31个比特位,每个比特位有两个可能的值。所以2的31次方是多少,通过计算器可以计算出来是2147483648,这个值是我们得到的最大值,可以用来存储整数。记住,我们还有一个预留位,看这个数是否为负数。因此,这个数可以是从0到这个数的正值,但是由于0也需要一个比特位,所以正值区间是0到2147483647;也可以是负的这个值到0,所以负值区间是-2147483648到0

2. unsigned关键字

如果你不想要负值,有没有什么办法,把这一个符号位去掉,然后把它作为我数字的一部分?

答案是有的,那就是我们所说的无符号数。这意味着它是一个没有符号的数,这意味它总是正值。在C++中,我们可以通过unsigned关键字实现。在int前面输入unsigned,现在我们有32位存储整数的比特位,也就是2的32次方4294967295,同样,因为是从0开始,所以0也要占用一个比特位,所以整数区间是0 到 4294967295。这就是unsigned关键字在C++中的作用。unsigned关键字可以定义了一个没有符号位的数据类型

我们还有什么其他数据类型可用?如果我不想要4个字节的整数呢?还有其他的类型吗,我们实际上有不少。

如,有Char,它是1字节的数据类型;有short2字节的数据类型;有int4字节的数据类型;long,这个通常也是4字节的数据,具体取决于编译器;有long long通常是8字节的数据;还有其他类型,比如long int,这里还有不少这样的修改,这里不会一一讲解。但最基本的是这个5个,Charshortintlonglong long。我们还可以将unsigned添加到其中任意一个,他会移除符号位,可以让你设置一个更大的数字。

3. char类型

char传统上用于存储字符,不仅仅是数字,除了给它分配数字,比如char a = 50

你也可以给它分配字符,比如char a = 'A'

这并不是说你不能给其他整数类型分配字符,你其实是可以的。我刚刚最后写的字母是'A',实际上,它只是一个数字,与该字符相关联的数值是65字符A的整数值65。如果数字是字符,如果字符只是数字,那为什么还要区分出一个char类型,这是因为我们常常会对某些数据作出类型假设。如果我传入一个char,那我通常希望是真的分配的一个字符给我。

如果你真的尝试打印出一个字符。如下。

我们按下F5运行程序。

我们不会得到与它相关的数字65。而是会把字符'A'打印出来。

如果我用实际的数值65替换这个字符'A'

按下F5运行程序

可以看到,还是会将'A'打印出来。因为cout,传入一个char到cout,cout会把变量a看成是一个字符,而不是一个数字。

4. short类型

如果我们把数据类型变为short类型,如下

F5运行程序

可以看到打印了65,cout不再把它当作一个字符,而是会打印出数值

即使我将它赋值为一个字符'A',如下

F5运行程序

可以看到打印的是65

所以到这里我这些是因为,我想让你们理解数据类型。数据类型的使用取决于程序员。我们有一些既定的约定,但是没有什么具体的东西需要你去遵循。在C++中没有太多规则限制你。正因为如此,我希望你们能意识到,这是数据类型之间唯一的区别,变量是通过数据类型确定分配多少内存。

5. float、double类型

如果我想存储一个含小数点的值,如5.5,我应该怎么做,我们有两种数据类型,有floatdouble,也有一些其他的修改,比如long double,这个这里就不讲了。

float基本上是一个小数,占用4个字节存储空间的数据类型。

如下,我们定义一个float变量variable并赋值为5.5。

F5运行程序

可以看到打印了5.5。

现在你可能认为你已经定义了一个float类型的数,但实际上你没有。你实际上定义了一个双精度double类型的数

回到VS,我们鼠标悬停在变量a的值上,也就是5.5上,可以看到VS给出的提示,显示的double

使用 F/f 后缀区分浮点数和双精度

我们有两个变量类型可以用来存储小数,float和double。那么我们如何区分,哪些是double,哪些是float?

区别的方式就是在数字的后面追加f,可以是大写的F,也可以是小写的f,但是关键是如果我们有一个f在后面,那就是声明这个变量是一个浮点数

浮点数基本上4个字节,双精度数是8个字节

6. bool类型

最后,我们还有一个更原始的数据类型那就是bool类型,bool的意思就是boolean,他的值代表true或false,如下

F5运行程序

可以看到打印出的数值是1,为啥?因为计算机是不懂什么是真的假的,只知道0和1这两个数字。所以基本上0意味着false,除了0之外的任何数字,都是true。在这个例子中,我们会打印1到控制台,表明它是true的。

如果我们改变变量的值为false

F5运行程序

我们会得到0,这意味着false。

bool数据类型占用一个字节的内存。现在你可能会问了,为什么是一个字节?bool数不是true就是false?当然,这只需要一个比特来表示就够了,你想的是对的,它确实只需要一个比特来表示,然而,当我们处理内存寻址时,也就是说,我们需要从内存中找回我们的bool变量的值时,我们没有办法去寻址只有一个比特位的内容,我们只能寻址字节,因此,我们不能创建只有1个比特位的变量,因为我们需要能够访问它。当然,你也可以做一件事,需要动点脑筋,你可以在一个字节内存储8个bool数,这没有问题,每个bool一个比特,但这样你仍然分配的是一个字节的内存。我们以后可能会谈论像那样高级的技巧。但现在,bool占一个字节的内存。

好了,我们说了那么多的sizes大小和bytes字节。我们如何知道一个数据究竟有多大。毕竟,它依赖于编译器。有什么地方可以查一下吗,是的,有的。我们有一个操作符,在C++中调用sizeof操作符。

7. sizeof操作符

回到代码

如果我们要查看boolsize大小,可以如下

F5运行程序

可以看到bool是1个字节

其他的数据类型可以使用一样的方式。如下

F5运行程序。

这就是变量所需要讲的东西了。已经涵盖了所有的基本数据类型。自定义类型都是基于这些基本的类型创建的。在这些基本类型的基础上我们可以创建任何的类型,并存储我们的任何数据。现在有了这些原始数据类型,我们还可以将他们转换为指针或引用。

指针可以通过写一个 * 来声明,紧挨着数据类型后面,如bool*;

引用可以通过写一个 & 来声明,紧挨着数据类型后面,如bool&

指针和引用是如此庞大和复杂,这个在后续的章节中继续深入。现在,我们主要讲了基本的数据类型,确保你要能理解这些,它们几乎是所有东西的基础,所以他们真的很重要。

相关推荐
可均可可37 分钟前
C++之OpenCV入门到提高005:005 图像操作
c++·图像处理·opencv·图像操作
zyx没烦恼42 分钟前
【STL】set,multiset,map,multimap的介绍以及使用
开发语言·c++
机器视觉知识推荐、就业指导1 小时前
基于Qt/C++与OpenCV库 实现基于海康相机的图像采集和显示系统(工程源码可联系博主索要)
c++·qt·opencv
myloveasuka2 小时前
类与对象(1)
开发语言·c++
ROC_bird..3 小时前
STL - vector的使用和模拟实现
开发语言·c++
机器视觉知识推荐、就业指导3 小时前
C++中的栈(Stack)和堆(Heap)
c++
Mr_Xuhhh5 小时前
递归搜索与回溯算法
c语言·开发语言·c++·算法·github
无敌岩雀5 小时前
C++设计模式行为模式———命令模式
c++·设计模式·命令模式
爱吃生蚝的于勒7 小时前
C语言内存函数
c语言·开发语言·数据结构·c++·学习·算法
小白学大数据9 小时前
Python爬虫开发中的分析与方案制定
开发语言·c++·爬虫·python