C++学习日记(8)——数据的基本类型

C++内置的类型有两种

基本类型和复合类型

我们这节讲的是基本类型

就是整数和浮点数

它俩有很多种变体


变量名

还记得上节函数讲过的驼峰命名法吗

变量对此有更详细的规定

  • 只能使用字母字符数字和下划线(函数其实也是)
  • 名称的第一个字符不能是数字
  • 区分大写和小写
  • 不能用关键字做名字
  • 两个下划线或一个下划线或者大写字母开头的变量保留给IDE使用
  • 一个下划线开头的变量作为全局的标识符
  • 长度一般没有限制,但不排除某些平台有限制

第五和第六听起来挺玄乎的,你只要知道一般不用就可以了

每个程序员的命名风格其实都不一样

但有时候,为了方便多人合作,必须按照一个统一的标准


整型

就是没有小数部分,也就是整数

不同的整型用不同的内存量来存储整数

内存量越大能存的范围当然也就越大

宽度是用来描述存储整数时使用的内存量

short/int/long/long long

计算机内存由一些叫做位(bit)的单元组成

也就是说不同的类型使用了不同数量的位来存储值

但是每种类型的宽度不是永远固定的

在不同平台可能不一样

于是C++就给了个最低标准

  • short最少16位
  • int至少和short一样长
  • long至少32位,并且至少和int一样长
  • long long至少64位,并且至少与long一样长

实际上short是short int的简称

而long是long int的简称

但大家一般都不这么叫

头文件climits(就是limits.h)包含了关于整型限制的信息


sizeof运算符

sizeof返回类型或变量的长度

(事实上返回的都是类型的长度)

sizeof(int)的值就是int的长度

假设我定义了一个int a;

那么sizeof(a)的值依然是int的长度


初始化

前面其实讲过了

你可以直接用数值赋值,也可以直接用表达式

用表达式的话里面每个式子都必须先定义过

如果你不对函数内部的变量进行初始化

这个变量的值就会是不确定的

它的值会是这个变量对应内存存储的值

C11的初始化方法

int a(1);

int a={1};

大括号用的其实不多,但是C11出台后变得更常用了

int a{1};

等号是可以省略的

int a{};

你可以不写任何东西,这样就是赋值0

用大括号可以防范类型转换的错误(后面才会讲的事情了)


无符号类型

无符号类型是只有整型才有的

优点就是增大变量能存储的最大值(宽度实际上是不变的)

假如short的范围是-32768到+32767

无符号就把负数变正,范围变成0到65535

只有数值不会是负数的情况下才能使用无符号类型

只要使用关键字unsigned就可以了

就像unsigned long population;

无符号的long变量,用来存放人口

unsigned本身是unsigned int的缩写


整型类型的选择

一般没啥特别情况都用int

因为int计算机处理起来效率最高

但是如果长到超过16位,那你得小心

IDE有可能就要跳出来报错了

那你就换成long就ok了

当然,unsigned也是一种选择

有一点要特别说明

如果节省内存很重要,那么尽量使用short

程序从int为16位的系统上转移到int为32位的系统上

int的内存量要翻倍,可是short是不受影响的


特殊的整型:char类型(字符和小整数)

我们拿char来存放字母和汉字比较多

但事实上char也是一种整型,一个字节可以表示的东西是非常多的

所以它不仅仅用来处理字符,也用来出来比short更小的整型

一般我们给char赋值字母的时候都要注意单引号和双引号的区别

使用单引号,那你就是赋值了个字母的字符编码

例如char a=‘A’

a的值就是65,A对应的字符编码

你可以试试按住键盘上的alt键,然后输入65后再松开

看是不是出现了A字母

因为大家普遍用的ASCII这套系统是这么定义的

使用双引号,那你就是赋值了个字符串

例如char a=”ABCD”

那么a的值真的就是ABCD

cin和cout这两个对象会完成字符编码和字母的转换

例如你用cin输入M给某个char类型

再用cout输出char,他不会输出77而是M

因为他已经自动帮你转好了

这个要注意


转义字符

我们在平时工作学习中使用word或者其他编辑器的时候

想要换行都会直接按一下回车键

但是很可惜,在C++中你不能这么干

因为按回车键并不能添加一个换行符

你得手动把它加上去

除了换行符,还有很多像这样不能直接通过键盘输入到程序中的字符

C++提供了一种特殊的方法,叫做转义序列

久违的插了张图,因为实在是懒得打了

在讲到框架的组成的时候,我们提到了\n,也就是换行符,可以替代endl


bool类型

一个新的类型,至少对C++来说是这样

C++把非零值解释为true,把零解释为false

而bool类型就可以直接判断真假

也就是说你可以直接使用true和false

int ready = true;

在这里的true会被转换为1

而false就会被转换为0

任何数字值或者指针的值都可以被隐式转换为bool

在判断的时候我们会经常用到bool的这一特点


const限定符

假如我正在编写一个程序

里面有一个变量用了很多次

现在我突然改变心意了,想把这个变量换一个数值

那怎么办呢

有人说我直接把代码里的这个数字整体替换掉就好了

这样可能会误伤到其它不相关的相同数值

所以为了避免这种情况的出现

我们就有了const限定符

const int demage=10;

我定义了一个常量为10

那在之后的所有程序里

你只要使用demage就可以了

而修改数值只要改一处地方

注意,const限定和初始化必须在一块

你不能const int demage;

demage=10;

这样的做法是错误的

C里面通常会使用另外一种方式

在预处理的时候写入这样一句语句

#define demage 10

const某种程度上会比define要好

因为它指定了类型

可以使用C++的作用域规则将定义限制在特定的函数或文件

可以把const用在更复杂的类型,如数组和结构


浮点数

靠终于到浮点数了,打了一早上了

浮点数能表示带小数部分的数字

如果数字特别大的话也可以使用浮点类型来表示

书写浮点数

第一种就是常见的表达

  • 12.334
  • 21312.12
  • 0.000012
  • 9.0

第二种叫做E表示法

例如E6,就是10的六次方

6就是指数

那3.45E6就是3450000

(E也可以用小写的e)

  • 2.53e+8
  • 8.33E-4
  • 7e5

E表示法适合用于非常大或者非常小的数

为啥还有非常小

因为指数是负数的话不就变成了除以10的乘方

那就变得复杂了起来

例如8.33E-4就变成了8.33/10的4次方

就是0.000833

所以为啥小数叫浮点数就是因为这一点

d.dddE+n指的是把小数点向右移n位

d.dddE-n指的是把 小数点向左移n位

因为小数点是可以移动的

float/double/long double

通常我们把float叫单精度浮点数

double叫双精度浮点数

他们一样有最低的位数要求

  • float至少32
  • double至少48,不少于float
  • long double至少和double一样多

通常是float32, double64, long double80或者96或者128

指数范围至少是-37到+37

浮点数的优缺点

优点

可以表示整数之间的值

可以表示的范围较大

缺点

运算速度比整数慢

精度降低


终于整完了,这节内容比较多

好好记一记不会吃亏的

发表评论

您的电子邮箱地址不会被公开。