C 使用過程中容易忽略的小細節

2021-08-07 01:14:43 字數 2797 閱讀 3758

說明:此篇文獻是讀者在閱讀《c++primer plus》中抓取的容易忽略的小知識點,如有不當之處,敬請指正。

1、運算子sizeof

可對型別名和變數名使用sizeof運算子。對型別名如(如int)使用sizeof運算子時,應將名稱放到括號中;但是對於變數名(int a;中的a)使用該運算子時,括號時可選的(可有,亦可無)。

2.如果知道變數的初始值應該是什麼,則應該對它進行初始化,將變數宣告和賦值分開,可能會帶來瞬間選額未決的問題。

3.使用cout<<(dec,hex,oct)可以更改更改顯示整數的方式,並且預設的格式為十進位制,在修改格式之前,原來的格式將一直有效。

4.與int不同的是,char在預設的情況下既不是沒有符號,也不是有符號。是否有符號由c++實現決定,這樣編譯器的開發人員可以最大限度的將這種型別與硬體屬性匹配起來。如果char有某種特定的行為對您來說十分重要,則可以顯示的將型別設定為signed char unsigned char.

6.wchar_t 寬字元型別

wchar_t資料型別一般為16位或32位,但不同的c或c++庫有不同的規定,如gnu libc規定wchar_t為32位,總之,wchar_t所能表示的字元數遠超char型。

寬字元型別可以表示擴充套件的字符集。iostream標頭檔案提供 wcin和wcout,可用於處理wchar_t流。另外可以通過加上字首l來指示寬字元常量和寬字串。

wchar_t bob=l』p』;

wcout<< l"tall"<< endl;

在支援兩位元組wchar_t的系統中,上述**將把每個字元儲存在乙個兩位元組的記憶體單元中。

7.c++ 新增資料型別 char16_t char32_t

前者是無符號的,長16位,後者也是無符號的,長32位,用字首u表示char16_t的字元常量和字串常量,用字首u表示char32_t的字元常量和字串常量。

char16_t ch1=u』q』;

char32_t ch2=u』m』;

8.bool

字面值true和false都可以通過提公升轉換為int型,true被轉換為1,false被轉換為0.

另外,任何數字值和指標值都可以被隱式轉換為bool值,任何非零值被轉換為true,而零值被轉換為false。

9.通常cout會刪除結尾的0。例如:將333333.250000顯示為333333.25.

呼叫cout.setf()將覆蓋這種行為,至少會在新的實現中這樣。float至少6位有效位,而double有效位是15位。在預設情況下,浮點常量都屬於double型別,若是希望使用float型別,請使用f或者f字尾。

10.除法運算子的行為取決於運算元的型別,如果兩個運算元都是整數,則c++將執行整數除法,這就意味著結果的小數部分被丟棄。如果其中有乙個或兩個運算元是浮點值,則小數部分被保留,結果為浮點數。

11.c++將使用大括號{}的初始化稱之為列表初始化,以為這種初始化常用於給複雜的資料型別提供值列表。但是它對型別轉換的要求更嚴格。列表初始化不允許縮窄,即變數的型別可能無法表示賦給他的值。

12.如果乙個運算元是有符號的,另乙個運算元是無符號的,且無符號運算元的級別比有符號運算元的級別高,則將有符號的運算元轉換為無符號的運算元所屬的型別。

13.cin是如何確定已完成字串的輸入的

由於不能通過鍵盤輸入空字元,因此cin需要用別的方法來確定字串的結尾位置。cin使用空白(空格、製表符和換行符)來確定字串的結尾位置,這意味著cin在獲取字元陣列的輸入時只讀取乙個單詞。讀取該單詞後cin將字串放到陣列中,並自動在結尾處新增空字元。並將剩下的單詞留在快取列表中,以備下次繼續讀取。

14.cin.getline()函式每次讀取一行,他通過換行符來確定結尾,但是不儲存換行符。相反,在儲存字串時,它用空字元來替換換行符。

cin.get()函式與cin.getline()函式幾乎相同,但是get()函式並不在讀取並丟棄換行符,而是將其留在輸入佇列中。

cin與cin.get()類似,只是cin輸入的是單詞,同樣會將換行符留在輸入佇列中。

getline(cin,str) 該語句是將一行輸入讀取到string物件中的**。特別注意,這裡的getline()不是類方法。它將cin作為引數,指出到**去查詢輸入。另外也沒有指出字串長度的引數,因為string類物件將根據字串的長度自動調和增自己的大小。

15.c++11中新增的另一種型別是原始字串 。在原始字串中,字元表示的就是自己。例如序列\n不表示換行符,而表示兩個常規字元–斜槓和n,因此在螢幕上顯示時,將顯示這兩個字元。另乙個例子是,可在字串中使用「,而無需使用繁瑣的"。當然既然可在字串字面量包含」,就不能在使用它來表示字串的開頭和結尾。因此原始字串將使用「(和)」用作定界符,並使用字首r來標識原始字串:

cout<< r"(jim"king"tutt uses 「\n」 instead of endl.)" << 『\n』;

上述**將顯示如下:

jim"king"tutt uses 「\n」 instead of endl.、

如果想在原始字串中包含「( ,那麼使用r"+* (標識原始字串的開頭時,必須使用)+「標識原始字串的結尾。

cout<< r」+ ("(who wouldn』t?)",she whisperad.)+*" << endl;

將顯示的內容如下:

「(who wouldn』t?)」,she whisperad.

16.對於列舉,只定義了賦值運算子,沒有定義算數運算

17.列舉的取值範圍

取值範圍定義如下:首先,要找出上限,需要知道列舉量的最大值,找到大於這個最大值的,最小的2的冪,將它減去1,得到的便是取值範圍的上限。要計算下限,需要知道列舉量的最小值。如果它不小於0,則取值範圍的下限為0;否則再去與尋找上限方式相同的方式,只不過加上負號。

ThreadLocal物件使用過程中容易陷入的坑

今天碰到的坑是這樣的 其中a請求會經過interceptor01 interceptor01內部會將a請求傳遞的module name引數存入本地執行緒變數,b請求不會經過 c請求會經過 但是不會傳遞module name,這時執行緒變數會存入乙個空的module name。因此懷疑是不是modul...

element ui dialog使用過程中的坑

場景一 我們將dialog寫成乙個可復用的公共元件用於顯示不同內容 如 操作中的修改或新增的彈窗 之後發現dialog的遮罩將彈出層 點選修改或新增後理應由乙個彈窗顯示出來 都蓋住了,而我想要的效果是遮罩只遮住舊的視窗,而當前視窗應該完全顯示 注 是使用easyui的panel和window來包裹的...

robotframework使用過程中的一些總結

robot framework是乙個基於python可擴充套件地關鍵字驅動的測試自動化框架,robot framework被廣泛地使用在端到端地驗收測試以及驗收測試驅動開發的過程中。1.在rf中輸入部分關鍵字的名稱時,使用shift control 空格可以延伸出所有相關的關鍵字 2.suit下打t...