小古银的官方网站(完整教程):http://www.xiaoguyin.com/
C++入门教程视频:https://www.bilibili.com/vide...ios
当你完成上一部分教程的所有练习后,相信你应该能够灵活地使用C++去解决大部分问题,尤为是数学问题。程序员
本部分教程将讲解C++中必须知道的计算机基础知识,知道这些知识能够避免很多的错误,还能够对程序代码进一步优化。因为这部分教程只讲解C++须要知道的计算机基础知识,因此并不会太多和太复杂。ide
计算机处理数据是由电路控制的,电路只有两种状态:开和关,所以计算机上的全部数据都是二进制的数据,而后用必定的规则将这些数据表示成十进制数字、文字、图片和其余各类各样的形式,因此接下来的内容都是围绕二进制而讲解的。学习
学习这部分教程才能更好地理解后续的教程,只要用心地去学就不会有问题。这部分知识了解便可没必要深刻,若是有兴趣,深刻也无妨。优化
在讲解二进制相关知识前,先讲解C++中数值的各类表示方式和各类操做。网站
写代码的时候,不免会遇到一些比较大的数。用一个很小的数作例子,例如先赚它一个亿(●'◡'●)。那么咱们写代码的时候,一亿在代码中的写法是100000000
。code
为了方便阅读数字,能够用单引号'
分隔一下,这个单引号叫作数字分位符。一亿就能够写成这样子:1'0000'0000
,一看就知道一亿。视频
先看如下代码:教程
#include <iostream> int main(void) { std::cout << "一亿:" << 1'0000'0000 << std::endl; std::cout << "一百万:" << 1'000'000 << std::endl; std::cout << "这种写法就很差了:" << 1'000'0'0'00'0 << std::endl; return 0; }
输出结果:图片
一亿:100000000 一百万:1000000 这种写法就很差了:100000000
输出仍是正常的数值输出,不会在输出的数值里显示数字分位符,由于数字分位符是为了方便阅读代码而出现的。可是第三种写法并不能方便阅读代码,因此不是一个好的写法。
对于一个十进制的15
,能够表示成二进制的1111
,也能够表示成八进制的17
,也能够表示成十六进制的F
。尽管15
、1111
、17
、F
看上去不同,可是它们都是同一个整数,只是表示方法不同。
先看如下例子:
#include <iostream> int main(void) { // 如下是十进制的15的各类表示方式 std::cout << 0b1111 << std::endl; // 输出二进制 std::cout << 017 << std::endl; // 输出八进制 std::cout << 15 << std::endl; // 输出十进制 std::cout << 0xF << std::endl; // 输出十六进制 return 0; }
输出结果:
15 15 15 15
能够看到它们都是输出15
,由于它们都是同一个数字的不一样表示方法,而std::cout
默认以十进制显示,因此都显示15
。
在代码中,默认以十进制来表示数字,若是要用其余进制表示一个数字,须要一些特殊的说明:
0b
或者0B
,例如要用二进制的110:0b110
。0
,例如要用八进制的6:06
。0x
或者0X
,例如要用十六进制的6:0x6
。至于为何不仅是用十进制,还要添加这么多表示方式,其实很简单,由于有一些数学运算,有时候,不用十进制而用其余进制运算更加容易理解,方便程序员作数学运算。初学者只要理解并背下来,之后将会用得上。
有时候,当用十六进制运算完后,极有可能想看看十六进制的结果,然而,std::cout
默认显示的是十进制。这时候,咱们就要告诉std::cout
我要用十六进制显示。
先看下面例子:
#include <iostream> int main(void) { std::cout << "十六进制 11 + 22 的结果是:" << std::endl; // 输出文字 std::cout << "默认:" << (0x11 + 0x22) << std::endl; // 默认十进制显示 std::cout << "八进制:" << std::oct << (0x11 + 0x22) << std::endl; // 八进制显示 std::cout << "十六进制:" << std::hex << (0x11 + 0x22) << std::endl; // 十六进制显示 std::cout << "十进制:" << std::dec << (0x11 + 0x22) << std::endl; // 改回十进制显示 return 0; }
输出结果:
十六进制 11 + 22 的结果是: 默认:51 八进制:63 十六进制:33 十进制:51
当咱们须要输出八进制时,须要先输出std::oct
;当咱们须要输出十六进制时,须要先输出std::hex
。若是想再次输出十进制,就必需要先输出std::dec
;不然,将会继续之前一次使用的进制(上面代码就是十六进制)来输出。其中std::oct
、std::dec
、std::hex
在iostream
库中。
仔细的你应该发现了,我没有写二进制输出。二进制的输出方法跟上面的有些不一样,由于std::cout
没有直接的二进制输出。若是想输出二进制数字,则可使用std::bitset
,它在bitset
标准库中。使用std::bitset<二进制的位数>(数字)
就能够输出二进制了,具体用法以下:
#include <iostream> // std::cout std::endl #include <bitset> // std::bitset int main(void) { std::cout << "十六进制 11 + 22 的结果是:" << std::endl; // 输出文字 std::cout << "二进制:" << std::bitset<8>(0x11 + 0x22) << std::endl; // 二进制显示 std::cout << "默认:" << 0x11 + 0x22 << std::endl; // 默认十进制显示 return 0; }
输出结果:
十六进制 11 + 22 的结果是: 二进制:00110011 默认:51
因为此次输出不改变std::cout
的行为,因此默认仍是输出十进制:
std::cout << "默认:" << 0x11 + 0x22 << std::endl;
代码中,std::bitset<8>(0x11 + 0x22)
指定了8位二进制(不足8位则在左边用0
补够8位):
浮点型即小数。
3.14
、.2
(即0.2
)、10.
(即10.0
)。2e2
(即 2.0 * 10^2 = 200.0),0x1.p10
(即 1.0 * 2^10 = 1024.0)0xf.p-1
(0xf.
即十进制的15.0
,0xf.p-1
即 15.0 2^(-1) = 7.5)、0xa.bp10
(0xa.b
即十进制的10.6875
,0xa.bp10
即 10.6875 2^10 = 10944.0)一样,输出显示十六进制浮点型须要先输出std::hexfloat
,它在iostream
标准库中:
#include <iostream> int main(void) { std::cout << std::dec << 0xf.p1 << std::endl; // 十进制的30.0 std::cout << std::hexfloat << 0xf.p1 << std::endl; // 十进制的30.0 return 0; }
输出结果:
30 0x1.e00000p+4
0b
)从C++11开始加入。std::hexfloat
从C++17开始加入。输入三个整数a
,b
,c
,而后分别按顺序以八进制,十进制,十六进制的表示方法,输出这三个整数的和。