- 算術類型在不同的機器上有尺寸有所差別
類型 | 含義 | 最小尺寸 |
---|---|---|
bool | 布爾類型 | 未定義 |
char | 字符 | 8位 |
wchar_t | 寬字符 | 16位 |
char16_t | Unicode字符 | 16位 |
char32_t | Unicode字符 | 36位 |
short | 短整型 | 16位 |
int | 整形 | 16位 |
long | 長整型 | 32位 |
long long | 長整型 | 64位 |
float | 單精度浮點數 | 6位有效數字 |
double | 雙精度浮點數 | 10位有效數字 |
long double | 擴展精度浮點數 | 10位有效數字 |
除了char的一些擴展其他都在C里面學習過
char 的空間可確保存放機器基本字符集中任意字符晴股。
其他字符用于擴展字符集椿胯。
- 類型轉換
#include <iostream>
int main(void)
{
bool b = 42; //為真。初始值負0才為假
int i = b; //i = 1; 當把布爾值給非布爾值是胶滋。初始為0替蔬,結果為false肴甸。為true則1
i = 3.14; //i = 3; 直接截斷了
double pi = i; //pi = 3.0 進行類型轉換
unsigned char c = -1; //c = 255; 無符號類型沒有負數蹄溉。8比特的char賦給他負數就是咨油。1 % 256的余數
signed char c2 = 256;//超出都是未定義的
return 0;
}
- 當無符號對象和有符號對象相加時,有符號對象會轉換成無符號對象柒爵。這時有負數就十分危險
前綴 | 含義 | 類型 |
---|---|---|
u | unicode 16字符 | char16_t |
U | Unicode 32字符 | char32_t |
L | 寬字符 | wchar_t |
u8 | UTF(僅用于字符串字面常量) | char |
默認初始化:定義在所有函數外部的的變量被初始化為0.而在函數內部的內置類型變量將不被初始化役电。就是未定義的。
-
引用
- 引用就是為對象起了另外一個名字棉胀,當引用改變時法瑟,對象也改變
- 引用必須被初始化
- 引用類型的初始值囱晴,必須是一個對象且引用必須引用相同類型
int i = 1024;
int &r = i; //&是引用符
-
指針
- 指針本身便是一個對象,允許對指針賦值和拷貝
- 指針和其他內置類型一樣瓢谢,在快作用域內定義的指針如果沒被初始化,也是一個不確定的值驮瞧。所有在使用指針是氓扛,當不確定要指向何處是先將他變成空指針
- C++空指針方法
int *p1 = nullptr;
int *p2 = 0;
int *p2 = NULL; //需要包含#include cstdlib
指針和引用的主要區(qū)別
- 引用必須初始化,指針不需要
- 引用一旦初始化完畢便不能更改论笔,指針不需要
- 指針是一個對象采郎,而引用不是
- 使用sizeof看指針的大小是4,而引用是被引用對象的大小
- auto類型說明符:由編譯器根據值推斷類型狂魔。同一行auto必須是相同類型蒜埋。
- decltype:從表達式推斷定義的變量類型
練習2.1:類型int、long最楷、long long和short的區(qū)別是什么整份?無符號類型和帶符號類型的區(qū)別是什么?float和double的區(qū)別是聲明籽孙。
int和long的區(qū)別是存儲數字的范圍烈评。
無符號和帶符號區(qū)別是能不能存儲負數。
float和double能存小數點后多少位犯建。double更長
練習2.3:讀寫結果
#include <iostream>
int main(void)
{
unsigned u = 10, u2 = 42;
std::cout << u2 - u << std::endl; //10
std::cout << u - u2 << std::endl; //一個取模后的結果
int i = 10, i2 = 42;
std::cout << i2 - i << std::endl; //32
std::cout << i - i2 << std::endl;//-32
std::cout << i - u << std::endl; //0
std::cout << u - i << std::endl;//0
}
練習2.15:下面哪個定義是不合法的讲冠?為什么?
int ival = 1.01; //合法适瓦,小數點后面會被截斷竿开,但是不要這么定義
int &rval1 = 1.01; //不合法,引用必須是一個對象
int &r = ival; //合法
int &rval3; //不合法引用必須初始化