《C++PrimerPlus 6th Edition》第3章 處理數據 要點記錄
1. 簡單數據類型
類型 | 具體類型 | 說明 |
整型 | bool char、signed char、unsigned char (至少16位) short、unsigned short (至少與short一樣長)int、unsigned int (至少32位,且至少與int一樣長) long 、unsigned long (C++11特性) long long、unsigned long long wchar_t、char16_t(無符號16位)、char32_t(無符號32位) |
①C++沒有提供自動防止超出整型限制的功能,可以使用頭文件climits來確定限制情況,例如INT_MAX(int最大值),CHAR_BIT(字符) ② 使用sizeof時要加括號(對於變量名可無括號) ③wchar_t、char16_t、char32_t有底層類型,其選擇取決於實現。 |
實型 | float、double、long double | ①float至少32位 ②double至少48位且不少於float ③long double至少和double一樣多 ④float至少確保6個有效數位,double13個 ⑤關於浮點數的限制可在頭文件cfloat中找到 |
2. C++命名規則
- 名稱中只能使用字母字符、數字和下劃線(_)
- 名稱的第一個不能爲數字
- 區分大小寫
- 不能選擇C++關鍵字作名稱
- C++名稱長度無限制,但有些平臺有長度限制
- 以兩個下劃線或下劃線和大寫字母打頭的名稱被保留給實現(編譯器及其使用的資源)使用,以一個下劃線開頭的名稱被保留給實現,用作全局標識符 (使用如__fools或_time_stop或_Donut這樣的名稱,編譯不會出問題,但是會導致行爲的不穩定)
3. 初始化方式
- C-Style:
int x = 4396;
- C++ Style:
int x(7777);
- C++11:
int x = {2333}; or int x{2333}; or int x={};//0 or int x{}; //0
4. 類型轉換
自動轉換
- 整型提升:計算表達式時,C++將bool、char、unsigned char、signed char、short值轉換爲int
- C++11算術表達式中用到的校驗表:
- 如果有一個操作數的類型爲long double,則將另一個操作數轉換爲long double
- 否則,如果有一個爲double,另一個轉爲double
- 否則,有一個爲float,則另一個轉爲float
- 否則,操作數都爲整型,因此執行整型提升
- 在這種情況下,如果兩操作數都是有符號的或都是無符號的,且其中一個操作數的級別比另一個低,則轉換爲高級別類型(高級別範圍更大)
- 如果一個操作數有符號,另一個無符號,且無符號操作數的級別比有符號的高,則將有符號操作數轉爲無符號操作數所屬類型
- 否則,如果有符號類型可表示無符號類型的所有可能取值,則將無符號操作數轉換爲有符號操作數所屬類型
- 否則,將兩個操作數都轉換爲有符號操作數其類型對應的無符號版本
強制轉換
C-Style:(typename) value;
C++ Style:typename(value); or static_cast<typename>(value);
etc.
5. 其餘一些注意點
- 如果知道變量可能表示的整數值大於16位整數的最大可能值,則使用long。即使系統上int爲32位也應這樣做。這樣,將程序移植到16位系統時,就不會突然無法正常工作(因爲此時的int變量存儲的值如果超過32767=2^16-1,那麼就會上溢)
- 如果要存儲的值超過20億(),可使用long long
- 通常僅當有大型整型數組時,纔有必要使用short
- 如果節省內存很重要,則應使用short而非int,即使它們的長度是一樣的。例如,如果將程序從int爲16位的系統移到32位的系統時,則用於存儲int數組的內存量將加倍,但short數組不受影響
- 控制符
cout<<std::hex; cout<<std::oct; cout<<std::dec;
它們不會在屏幕上有顯示,只是改變顯示整數的方式。另外,要慎用它們作爲變量名!!!(取決於是否用了編譯指令using來使用名稱空間std) - 成員函數
cout.put();
可打印字符 - 通用字符名的編碼與轉義序列類似,可以以\u(8個十六進制位)或\U(16個十六進制位)開頭
- char在默認情況下既不是沒有符號,也不是有符號。是否有符號取決於C++實現,必要時顯式將類型設置爲signed char或unsigned char
- cin與cout將輸入和輸出看作是char流
- C++中const比#define要好,原因:①能明確指定類型;②可以使用C++的作用域規則將定義限制在函數或文件中;③可以將const用於更復雜的類型
- 浮點常量在默認情況下爲double類型
- C++auto聲明(自動推斷類型)在處理複雜類型時會帶來便利,與此類似的有C#中的var
char grade = 65;
與char grade = 'A';
並不完全等價,對於不同編碼的系統,第二句始終是代表A,但第一句僅僅在編碼爲ASCII碼時是表示字符A。