寫在前面:編程
太忙了,很久沒有寫博客。這篇文章是在下讀C++ Primer中文第五版(與以往版本相比,第五版的一大特點就是「爲新的C++11標準從新撰寫」——引自封皮)時的筆記,沒有什麼技術含量,只是做爲往後查閱的筆記資料,同時分享給須要的讀者。spa
(1)類型選擇code
①當明確知道數值不可能爲負時,用unsigned類型。blog
②對於整型,要麼用int,要麼用long long。short通常太小,固然,若是明確數據不會超過兩字節,天然能夠用,而long在許多編譯器下和int等長。long long是C++11的新類型,是8字節的int。編譯器
③儘可能使用signed char或unsigned char,而避免使用char。由於char在有些編譯器下是無符號的,而在有些編譯器下是有符號的。博客
④浮點運算用double。float與double的計算代價相差無幾(甚至Primer上說有些機器上double比float還要快),但顯然double精度高,而longdouble通常狀況下又沒必要要。for循環
注意:以上只是基於通常狀況的建議,並非一種規範,即只是建議這麼作,而不是強制要求。編譯
(2)使用注意:class
①不要將bool值用於計算。以下面的代碼變量
bool b = -10; int a = 10; cout << a + b << endl;
將獲得結果11.
bool值只有0和1(true和false)兩個值,若是將非0值賦給bool,編譯器將該bool值視爲1,若是將0賦給bool,編譯器將該bool值視爲0。
注:其實在下以爲這種狀況在現實編程中幾乎是不會出現的,這裏只是拿來講一說將非bool值賦給bool值時編譯器的處理方式。
②避免在同一個表達式中同時使用無符號數和有符號數。以下面的代碼
unsigned int a = 10; int b = -42; cout << a + b << endl;
將獲得結果4294967264.
緣由是當有符號數與無符號數在一塊兒運算時,有符號數將被視爲無符號數。上面int b=-42在機器中用補碼錶示,而將其二進制補碼視爲無符號數,就是232-42=4294967276-42=4294967254,再加上a的值10,就是4294967264.
③不要將無符號數做爲循環控制變量。以下面的代碼
for (unsigned i = 5; i >= 0; --i) //這裏unsigned i被編譯器默認解釋爲unsigned int i { cout << i << " "; if (4294967291 == i) { cout << endl; break; } }
將獲得以下結果
緣由同上,當i減爲-1時,編譯器認爲是232 -1=4294967295,因而循環繼續。顯然,若是不是咱們刻意加上break語句使i=-5(即編譯器認爲的4294967291)時退出循環,程序將陷入死循環。而若是咱們不知道這是unsigned在做怪時,將會感到莫名其妙,難以想象,百思不得其解,直到抓狂。
可能有人會說把for循環改爲for (unsigned i = 6; i > 0; --i)不就能夠了嗎?或者還有人會說:誰沒事閒的會用unsigned類型做爲循環控制變量呀?是的,的確是這樣,但這並不表明咱們總能清醒地避免上面的錯誤,尤爲是當咱們無心中「隱式地」使用unsigned類型做爲循環控制變量的時候。(好比咱們可能在程序的其它地方經過無符號整型計算獲得一個值,然後來將這個值做爲循環控制變量用在for或者while中)
因此,在下的建議就是:時刻牢記——除非出於特別須要,不然永遠不要用無符號類型作循環控制變量。
後記:
儘管在下已作過校對,但錯別字之類的錯誤紕漏仍在所不免,在懇請廣大讀者諒解的同時也歡迎你們批評指正。同時,若是您認爲在下的文章中存在知識性錯誤,請您務必不吝賜教,在下先行謝過。您的批評指正就是在下不斷進步的力量源泉。