寒假2 C++primer 第二章 (第一部分)
part 0.写在前面
鉴于第一章的总结内容有些晦涩,甚至写成了没有书就没有办法读懂的‘字典’,所以我将尝试在第二章的叙述中加以改进。
特殊符号解释:
- ※标内容为拓展内容,会在有星标内容部分以及结尾部分提供相关链接以供有兴趣的小伙伴研究。(内容多半超前很多~ _ ~)
- *标内容为当前未点明,但在本章中可以找到相应解释的重要内容。
ps:如果小伙伴真的有一些想法或者好的建议,站长的邮箱是可以发送信息的哦!欢迎通过邮箱方式与我取得联系!ヾ(≧▽≦*)o
part 1.摘要
这一章中包含的知识点是有关于变量与基本类型的。什么是变量?书中有严格的定义:
变量,具名对象。
而在本章的开头也强调了这样一件事:很多人把变量与对象分开使用,认为二者有一定的区别;但在实际区分中,往往不能形成统一的标准来进行区别对待。
一些人眼中,对象是始终与男女关系(ಥ _ ಥ),不是,类,绑定在一起。认为在类内定义的变量是对象。还有人认为命名与否是变量与对象的区别方式……
其实这些说法都是公说公有理,婆说婆有理的习惯问题,在此处我沿用书中的介绍方式,不进行刻意区分。
那对于变量,你有什么印象呢?就拿int a
这段最简单的代码来说吧!我们通常会说这段代码定义并声明了一个基本类型——整型变量,这个变量的名字是a
;
这样一来,就出现了三个重要知识点,也就是黑体加粗的这三个关键词。在后面的部分里会进行详细的介绍的。
变量类型又不止这一种!那在实际应用中,会出现很多类似于:
double h = 1.2;
int tab = 3;
std :: cout << h + t << std :: endl;
这样的代码,输出的结果会是整型还是浮点型的呢?其中就涉及到了类型转换这个知识点。
然后对于爱好学习的同学,可能已经在网上阅读过不少代码,会发现老师所写的代码和网上大牛分享的代码中有一个明显的区别:const
这个东东,网上的代码好像用得特别多!
还有一些切入进计算机内存地址的“高级变量”,指针与引用,这些变量类型,也会在本章讲到,当然最痛苦的,莫过于俄罗斯套娃了!指针的指针,指针的引用,指针的const
……
那么内置基本类型就有这么多的情况下,我要是突然失忆了,忘记这变量是什么类型了,难道要一点点的去推理吗?我选择狗带X_X,当然有办法了!那就是让我们的编译器小盆友进行推算的处理类型啦!
还有一些小伙伴想要在“大数据时代”里体验一把私人定制的快感,想要给这些基本类型起一个类型别名,想要自己定制一个属于自己的自定义数据结构,我想说,这,也是本章的重要内容哦!
当然,起名并不是随便起的,在C++中对于标识符,也就是自定义的名字有一定的限制。我们也要意识到,对于每个变量来说,都有它自己的出生与消亡的生命周期,有它发挥作用限制的地盘———作用域。
以上就是本章的知识点内容总结啦!这些如果都写进一篇文章会很长,所以我将分开上传,希望能对大家有一定帮助!(如果读完还是有问题,可以私信我哦!)
tips:这边建议收藏本站的呢,亲! (/▽\)
part 2.主要知识点总结
Q1:内置基本类型有哪些?
C++定义了包括算术类型与**空类型 * (void)**在内的基本数据类型。
算数类型包含很多种,详见下表(未包含无符号类型 * (unsigned),但无符号类型是内置类型):
类型含义 | 类型说明符 * | 最小尺寸 * | 特 性 与 常 用 场 合 |
---|---|---|---|
布尔类型 | bool | 未定义 | 在程序中常作为条件判断语句,只有ture 和false 两个值 |
字符 | char | 8位 | 就,很常见的字符型变量 (o゚v゚)ノ |
宽字符 | wchar_t | 16位 | 用于 ※ 扩展字符集 |
Unicode类 | char16_t | 16位 | 同wchar_t |
Unicode类 | char32_t | 32位 | 同wchar_t |
短整型 | short | 16位 | 一种可表示范围较小的,占内存较少的整数类型 |
整型 | int | 16位 | 只是一个四平八稳,平平无奇的小int罢了(+_+) |
长整型 | long | 32位 | 一种可表示范围与占据内存空间两方面都比int大的整数类型 |
长整型 | long long | 64位 | 没错,比long还长 (o゚v゚)ノ |
单精度浮点型 | float | 6位 ※ 有效数字 | 一种精度低内存小的浮点类型 |
双精度浮点型 | double | 10位有效数字 | 一种精度较高内存较大的浮点类型,非常常见 |
扩展精度浮点型 | long double | 10位有效数字 | 一种比double还精度高,内存大的浮点类型 |
- **空类型:**不对应具体的值,仅用于特殊的场合。最常见的应用就是在函数没有返回值的时候使用空类型作为返回类型。
- **尺寸:**比特(bit)——>字节(Byte)——>字(word),一般地,有8 bit = 1 Byte ; 2 Byte = 1 word ;
- **比特:**bit为最小信息单位,每位为0或1。
- **字节:**最小寻址内存块,指针只能最小以字节为单位来进行间接调用数据内容。一般1字节等于8比特的原因,是因为要求1个字节至少要容纳机器基本字符集中的字符。而(signed) char的大小,之所以最小为8位比特,是因为这种大小去除负数无效部分,正好有128个有效值,可以对应ascll码表中的128个字符,其中,33个为不可显字符,95个为可显字符。
- **※ 字:**计算机一次运算的单元。也是在申请地址时的基本单位。
对于unsigned类型,会零散在各部分介绍,在此只用知道两件小事:
- unsigned类型就是把原类型表达范围内负数部分删去,然后将原来类型所能表达的最大数之后的正数部分,填充到表达范围中。(如:signed char可表示-128~ 127,而unsigned char则可表示0~ 255)
- char类型与其它类型不同,被分成了unsigned char, char,signed char三种类型,而对于一般的int类型,就是指带符号类型。而一般的char类型的状态,则带不带符号皆有可能,具体由编译器决定。
Q2:类型转换的规则?
首先,类型转换常发生在赋值语句情况中:
对于bool类型,
#include<iostream>
int main() {
bool a = 0;
if(a) {
std :: cout << "hyjtab 1" << std :: endl;
}
a = -1;
if(a) {
std :: cout << "hyjtab 2" << std :: endl;
}
return 0;
}
代码运行之后,屏幕上只会显示“hyjtab2”的字样,说明,对于bool类型来说,只有赋值为0时,才会转化为false,其余情况,全都是true。
而当我们把一个bool类型赋给非bool类型时,true对应1,false对应0。
对于浮点类型,
#include<iostream>
int main() {
int h = 12;
double t =1.2;
int a = 0;
a = t;
std :: cout << a << std :: endl;
a = h + t;
std :: cout << a << std ::endl;
std :: cout << h + t << std :: endl;
return 0;
}
代码运行结果为“1,13,13.2",说明,当我们把一个浮点数赋给一个整数类型时,我们进行了近似处理,结果只保留小数点前的部分。
与整型数进行运算时,会将整型数转化为浮点数,得到的转化值小数点后位全为零,然后运算,得出浮点型结果。
对于无符号类型(unsigned),
(代码省略)
- 除非有符号类型的容量大于无符号类型,在进行运算时,总是将有符号类型转换为无符号类型。
对于赋值超过了本身的最大范围(或容量)的情况,
如果在整型值赋给浮点型时,整数所占空间超过了浮点型的容量,可能损失部分精度。
对于**无符号类型(unsigned)**结果是初始值对无符号类型容量取模后的值。
对于有符号类型,则结果为未定义的,程序可能崩溃,可能产生垃圾数据,也可能继续运行。
类型转换的其它发生条件:
条件语句:
当表达式作为条件时,会发生其它类型转化为bool型的隐性操作。
注意:我们在实际操作中,极有可能以后一不注意,就将负数赋值给了无符号对象,会引发意想不到的错误。还有在计算中,很多情况下,我们会将无符号类型与带符号类型混合计算,这时就要根据无符号类型类型转化规则进行提前推测,得出结果。
小零食:空类型(void)之所以不能访问是因为它只指明了访问的起始地址,而未指明起点向后读取多少内存,以及如何解析二进制数据的问题。而其它数据类型这三个问题的答案都是确切的。
Q3: 字面值常量的类型到底是?
对于整型与浮点型:
整型字面值:
对于整型字面值常量,其类型由符号与值决定,而是否有符号,与进制有一定关系。对于一般的十进制数,默认都是有符号数。而十六进制与八进制数既可能是有符号类也可能是无符号类型。
区分进制方法就是看前缀,十进制数无前缀,而八进制数前缀为0,十六进制数以0x为前缀。
一般的,对于-123这样的数,在内存中的储存形式会认为是123,这里的 - 被认为是一种取负运算。
对于浮点型字面值常量,主要在于精度,识别精度的难度往往在表示方法上,如:1e2,3.14e-1……这里的e,就是一种科学计数法。它们的具体值分别为100,0.314;
然后就到了重点,他们的类型是啥?
对于浮点型字面值,一般都是double类型。
而对于整型:
字面类型 | 可能类型 |
---|---|
整型(10进制) | int , long , long long |
整型(16进制与8进制) | int , unsigned int , long , unsigned long , long long , unsigned long long |
具体类型为可能类型中能容纳下该字面值的占内存最小的那一种。
布尔字面值与指针字面值
布尔:true
与false
;
指针:nullptr
*;
字符与字符串字面值
单引号引起的单字符为字符字面值常量,而双引号中的内容为字符串字面值常量。
转义序列:
有两类字符程序员不能直接使用:一类是不可视字符,如退格以及其它控制字符。一类是在C++中有特别含义的字符。在这些情况下需要用到转义序列。转义序列均以反斜线作为开始。如:\n(换行符),\a(响铃符),\t(制表符)……(详见网络)
转义序列与十六进制和八进制数的对应关系:
又称泛化的转义序列,其形式是\x后紧跟1个或多个十六进制数字,或者\后紧跟1~3个八进制数字,其中,数字部分为字符对应的数值。
我们可以像使用普通字符那样使用转义序列。
指定字面值的类型
字符/字符串
前缀 | 含义 | 类型 |
---|---|---|
u | Unicode 16字符 | char16_t |
U | Unicode 32字符 | char32_t |
L | 宽字符 | wchar_t |
u8 | UTF-8(仅用于字符串字面值常量) | char |
整型
后缀 | 最小匹配类型 |
---|---|
u/U | unsigned |
l/L | long |
ll/LL | long long |
浮点型
后缀 | 类型 |
---|---|
f/F | float |
l/L | long double |
一个下午,终于写在这里,准备结束了,这只是第二章的第一小节,之后更新的部分将会进入第二章的第二小节。期望不会让你们等太久~
※部分的链接: