小古銀的官方網站(完整教程):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
,而後分別按順序以八進制,十進制,十六進制的表示方法,輸出這三個整數的和。