文章目录
前言
本文所有内容都是以我的角度和理解去讲解c++,若有什么错误或不对的地方,欢迎指正。
若没有c++基础的,并且想要学习c++的人建议先去b站上看黑马程序员有关于c++的教程视频 https://b23.tv/Bgh4Bw0,该教程视频是免费的;若有一定c++基础的便可直接阅读本文章。
本文所有内容与我所推荐的视频的讲解顺序大致相同,因此本作者建议和该视频配套使用,这样效果更佳
本文所有内容主要是帮助大家以我的角度再去理解一遍c++,用以更好的掌握c++。
后续会不断更新。
c++在创建一个变量或常量时,必须要指定出相应的数据类型,而不同的类型所占用的内存空间是不同的。编译器给变量或常量分配内存空间是需要时间的,如果选取类型的内存空间越大,那么分配内存空间花费的时间也就越多,这会直接导致程序的性能变差。因此在创建一个变量或常量时,我们必须选取合适的数据类型。
一.整型
含义: 整型变量用于表示是整数类型的数据。
1.short(短整型)
占用空间:2字节
取值范围:-2^15~2^15-1(-32768~32767)
#include<iostream> using namespace std; int main() { short a = 1; return 0; }
2.int(整型)
占用空间:4字节
取值范围:-2^31~2^31-1(-2147483648~2147483647)
#include<iostream> using namespace std; int main() { int a = 2; return 0; }
3.long(长整型)
占用空间:在Windows中为4字节;在Linux中,环境为32位,则为4字节,环境为64位,则为8字节。
取值范围:-2^31~2^31-1(-2147483648~2147483647)注:该取值范围为4字节下的。在不同的环境中大小可能会不同。
#include<iostream> using namespace std; int main() { long a = 3; return 0; }
4.long long(长长整型)
占用空间:8字节
取值范围:-2^63~2^63-1(-9223372036854775808~9223372036854775807)
#include<iostream> using namespace std; int main() { long long a = 4; return 0; }
二.实型(浮点型)
含义: 浮点型变量表示的是小数类型的数据。
1.单精度float
占用空间:4字节
有效数字范围:6~7位有效数字
#include<iostream> using namespace std; int main() { float a = 3.14f; return 0; }
2.双精度double
占用空间:8字节
有效数字范围:15~16位有效数字
#include<iostream> using namespace std; int main() { double a = 3.1415926; return 0; }
3.扩展精度long double
占用空间:具体大小取决于编译器和平台
有效数字范围:18~19位有效数字
#include<iostream> using namespace std; int main() { long double a = 3.1415926; return 0; }
三.什么是无符号型和带符号型
整型和浮点型都可以划分为无符号型和带符号型。
用法:
- 带符号型:数据类型(如果不刻意去强调该类型是无符号型,那么默认该数据类型为带符号型)
- 无符号型:unsigned 数据类型
#include<iostream> using namespace std; int main() { //在我们日常编程中,如果不刻意去强调该类型是无符号型,那么默认该数据类型为带符号型。 int num1 = 0;//带符号型 unsigned int num2 = 1;//无符号型 return 0; }
区别:带符号类型可以表示正数、负数和0;无符号类型只能表示大于等于0的数。
所表示的范围区别:为了方便理解。我们假设带符号类型的范围为[-1,1],那么无符号类型的范围就为[0,2]。带符号类型和无符号类型各自表示的区间长度是一样的,只不过是将带符号类型原本用来表示负数的部分改成了用来表示正数。


例如 int 和 unsigned int 的表示范围:
- int:(-2147483648~2147483647)
- unsigned int:(0~4294967295)// 4294967295=2147483648+2147483647
在我们选择数据类型时,最好以下规则来规范自己:
- 定义整型时,尽可能的使用int类型。在实际应用中,short 类型常常显得太小,而 long 类型一般和 int 类型有一样的范围。如果所要表示的数据超过了 int 类型的表示范围,就选用 long long 类型。
- 定义浮点型时,就选用 double, 这是因为 float 通常精度不够而且双精度浮点数( double )和单精度浮点数( float )的性能代价相差无几。事实上,在某些情况下,双精度运算速度甚至比单精度还快。long double 提供的精度在一般情况下是没有必要的,况且它运行时,带来的性能消耗也不容忽视。但是 long double 可能会在某些要求高精度的算法题中被使用。
四.字符型
含义: 字符型变量表示的是单个字符。
语法:char ch = 'a'
#include<iostream> using namespace std; int main() { char ch = 'a'; return 0; }
注意事项:
- 在给字符型变量赋值时,要用单引号将字符括起来,而不能使用双引号将字符括起来。
- 单引号内只能有一个字符,不可以是字符串(即多个字符,底下有介绍什么是字符串)。
- c和c++中字符型变量只占用1个字节。
- 字符型变量并不是把字符本身放到内存中存储,而是将字符对应的ASCII编码放入到储存单元(简单来说字符型变量的本质是以数字的形式保存在计算机中的)。
五.转义字符
最常用的转义字符有:\n、\\、\t、\'、\"。
| 转义字符 | 含义 | ASCII码值 |
|---|---|---|
| \a | 警报 | 007 |
| \b | 退格(BS),将当前位置移到前一列 | 008 |
| \f | 换页(FF),将当前位置移到下页开头 | 012 |
| \n | 换行(LF),将当前位置移到下一行开头 | 010 |
| \r | 回车(CR),将当前位置移到本行开头 | 013 |
| \t | 水平制表(HT) | 009 |
| \v | 垂直制表(VT) | 011 |
| \\ | 代表一个反斜杠字符"\" | 092 |
| \' | 代表一个单引号字符 | 039 |
| \" | 代表一个双引号字符 | 034 |
| \? | 代表一个问号字符 | 063 |
| \0 | 数字0 | 000 |
| \ddd | 8进制转义字符 | 3位8进制 |
| \xhh | 16进制转义字符 | 2位16进制 |
注:c++中的endl就代表着\n换行;由于在页面上不能生动形象的展示常用转义字符的用途,因此希望没有理解的同学通过该链接12 数据类型-转义字符_哔哩哔哩_bilibili
https://www.bilibili.com/video/BV1et411b73Z/?p=12&spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=fb971a39c85c78bac3fa589750a88aa9进行学习。
六.字符串型
含义: 字符串型变量表示的是一串字符。
在c++中字符串有两种风格
1、c风格字符串:char 变量名[] = "字符串值"
#include<iostream> using namespace std; int main() { char arr[] = "abc"; //如果想要输出一个字符串,只需要使用变量名输出就行,示例如下 cout << arr << endl; return 0; }
2 c++风格字符串:string 变量名 = "字符串值"
#include<iostream> #include<string> using namespace std; int main() { string arr = "abc"; //如果想要输出一个字符串,只需要使用变量名输出就行,示例如下 cout << arr << endl; return 0; }在使用这种风格的字符串时,必须包含头文件 string(即多写一行#include<string>)
我们通过c风格字符串的定义方式,可以发现字符串其实就是字符数组。(数组在后面会有介绍。)
注意事项:
- 在给字符串型变量赋值时,要用双引号将字符串括起来,而不能使用单引号将字符串括起来。一定记住双引号代表着字符串,单引号代表着字符。一定要注意区分!
- 双引号内可以有任意多个字符,这样就意味着可以有一个字符,也可以没有字符,或者可以有多个字符。没有字符的字符串被叫做空字符串,也是初始化字符串的一种方式。因此我们可以记住:只要是用双引号括起来的,无论括进去了几个字符都属于字符串。
七.布尔类型
含义: 布尔类型代表真或假的值。
bool类型只有两个值:
- true---真(本质上是1)
- false---假(本质上是0)
#include<iostream> using namespace std; int main() { bool flag1 = true; bool flag2 = false; //若你字节输出bool值便可以发现输出的值是1和0 cout << flag1 << " " << flag2 << endl; return 0; }布尔类型只占用1个字节。
如果我们平常热爱探险c++中的知识,那么我们便会发现,在c++中,所有非0值都属于真(true)值,只有0(就是数字0)是假(false)值。 这是一个编程小知识,希望大家能够记住,这个知识点在日常编程中,比较常用。
八.sizeof关键字
作用:sizeof关键字可以计算数据类型和变量所占字节大小
语法:sizeof( 数据类型 / 变量名 )
#include<iostream> using namespace std; int main() { //如果我们要计算 int 数据类型在计算机中所占字节大小,可以使用sizeof进行计算。 cout << sizeof(int) << endl; //如果我们要计算 int 定义的变量在计算机中所占字节大小,可以使用sizeof进行计算。 int num = 0; cout<< sizeof(num) << endl; //如果我们要计算 int 定义的数组在计算机中所占字节大小,可以使用sizeof进行计算。 int arr[4] = { 0 }; cout<< sizeof(arr) << endl; return 0; }
九.类型转换
如果表达式中存在不同的数据类型,那么便会发生类型转换。
类型转换主要为非两种:隐式类型转换和显式类型转换。隐式类型转换和显式类型转换唯一的区别就是前者不需要自己手动转换类型,后者需要自己手动转换类型。
隐式类型转换:在需要时,编译器自动帮助我们进行类型转换。即编译器会在需要时自动将表达式中小范围的数据类型向大范围的数据类型转换。
隐式类型转换是发生在程序运行过程中,目的是为了统一数据类型,以此来满足程序运行的需要。
#include<iostream> using namespace std; int main() { // 例如在这个表达式的右边,它是一个普通的数学计算。 // 数学计算我们都知道是从左往右依次计算的,因此我们从左往右依次分析这里面的数据类型的转换 // // 首先遇到的是 true + 2,true是布尔类型,2是 int 类型。 // 布尔类型的范围是小于int类型的,因此布尔类型会被转换为 int 类型。即 1 + 2 = 3。 // // 其次遇到的是 3 + 'a',3是 int 类型,'a'是字符型。 // int 类型的范围是大于字符类型的,因此字符类型会被转换为 int 类型。即 3 + 97 = 100。 // // 然后遇到的是 97 + 13.14,97是 int 类型,13.14是 double 类型。 // int 类型的范围是小于 double 类型的,因此 int 类型会被转换为 double 类型。即 100.0 + 13.14 = 113.14。 // // 最后我们可以发现在里面等号的左右两边的数据类型并不相同。左边的是 int 类型,右边的是 double 类型 // 我们最后是要给num赋值,而num是 int 类型,所以右边的数据类型要向左边的数据类型保持一致 // 即右边的 double 类型要变成左边的 int 类型,我们可以发现这里也进行了一次隐式类型转换。 int num1 = true + 2 + 'a' + 13.14; cout << num1 << endl; return 0; }运行之后,我们会发现输出的是 113,这是因为 int 这类的整型数据类型只能保存整数。不是只能保存整数,整型为什么会叫整型,是不是觉得我说的很有道理,哈哈哈。
这是因为当浮点型转换为整型时,只会保存浮点型的整数部分,而小数部分将会被直接舍弃。即113.14直接变成113,舍弃了0.14。
这里存在着一个非常重要的知识点:当数据范围大的数据类型向着数据范围小的数据类型转换时,可能会发生精度丢失或得到一个我们不想要的数据!就好比如这里的113.14变成了113,它原本是精确到小数点后两位,但是转换之后就变成了只有整数部分,精度变低了。因此在不必要的情况下,我们要尽可能的避免数据范围大的数据类型向着数据范围小的数据类型转换。
显式类型转换:在需要时,我们强制的将一种类型转换为另一种类型。显式类型转换也被叫做强制类型转换。
在c++中,强制类型转换有几种方式。在这里我们使用最方便的一种方式进行强制类型转换。
#include<iostream> using namespace std; int main() { //以下两种方式,我们企图将int类型强制转换成了字符型,但是最后输出的结果是不太一样的。 cout << (char)96 + true << endl;//这里(char)96 + true相当于(char)(96) + true,最后的结果是一个数字 97。 cout << (char)(96 + true) << endl;//这里(char)(96 + true),最后的结果是一个字母 'a'。 return 0; }大家可以使用我们刚刚学的隐式类型转换来推断为什么会得到那样的结果。
在使用时,大家一定要想清楚我们要将哪一部分的结果转换为我们需要的数据类型。有时候选取的范围不一样,最后得到的结果,也可能不一样。
十.数据的输入
作用:用于从键盘获取数据
关键字:cin
语法:cin >> 变量
例如我要输入一个整型数据:
#include<iostream> using namespace std; int main() { int arr = 0; cin >> arr; cout << arr << endl; return 0; }
在输入数据时,编译器会为你输入的数据分配一个与你所需数据类型最接近的数据类型。然后再通过类型转换,转换为你所需的数据类型。
例如你所需的数据类型是 int 整型,但是你输入的数据是 13.14 ,那么编译器便会将 13.14 设置为double 浮点型,再通过类型转换,将浮点型转换为整型,此时 int 整型中保存的数就会是 13,将后面的小数部分舍去;再如果你输入的数据是 a ,那么编译器便会将 a 设置为 char 字符型,此时 int 整型将不会接受到任何数据,也就意味着数据输入失败,但是编译器为了保证数据安全,便会将 int 整型中的数据设置为 0 ,double,float等都是如此,输入失败都会被设置为 0 。
因此再输入数据时,一定要选取合适的数据类型来接受数据,不然就会造成一些不必要的错误。
作者的题外话:学习编程一定是要多练,多编,如果不去训练,那么过不了几天就会忘记,到时候学了就等于没学。还有就是在日常编程时,思维一定要活跃、灵活。只有这样才能写出一个精妙的程序。希望大家都能学好编程!
大家如果需要看我后续的内容,一定要记得私信催更哦,只有催的人多了,作者才会更快的更新!还有就是如果发现作者写的有问题、有错误一定要私信我进行指出哦。
谢谢大家的支持。

2805




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



