c++ 學習 隨筆三

1、對於操作符大家應該都比較熟悉,算數操作符+,-,*,/,%;邏輯操作符&&,||,~;對於我而言,這些運算符都是經常用,但是也有一點小問題,就是對於/和%,一個除法,一個取模;這兩個操作符均爲二元操作符,所以需要兩個操作數。這樣而言,對於這兩個數均爲正或者均爲負的情況倒好說,但是如果爲一正一負的話,這種情況就要看機器了,具體的情況可以查閱相關資料,我就不詳述了。

2、對於二元運算符或者三元運算符而言,總是有不只一個操作數,那麼非常明顯,這個操作數自然也可以由算數表達式而言;那麼問題來了,這些算數表達式的運算有先後順序嗎?!對於邏輯與&&和邏輯||而言,總是先計算左操作數,如果左操作數不能確定整個表達式的符號的話,再計算右操作數。這也被稱爲短路求值!那麼對於+而言,先計算左操作數還是先計算右操作數則是沒有定論的,隨機而定;所以,在這種情況下,如果左右兩個操作數均對同一個對象進行操作,但是又不知兩個操作數的執行先後順序,很顯然這種 表達就是錯誤的,所以切記不能犯這樣的錯誤!

3、對於位操作符而言,由於系統不能確切的處理符號位的方式,所以最好使用unsigned整型操作數。

4、unsigned和signed型數據,我們稱爲無符號和有符號兩種數據類型,對於無符號類型,計算機默認所有的位均表示數值,對於8位unsigned整型可表示數值範圍是0-255;

對於signed有符號類型數據,則依據編譯器的不同來看待不同的符號位方式,常見的爲首位爲符號位,1爲負,0爲正,因此8位signed整型可表示的範圍爲-127到127;有的爲-128到127.

5、賦值操作幾乎在每一個程序當中都會用到,而且還會用到很多次。而所賦的值要根據對象的類型來設定,那麼問題來了?如果所賦的值超過了類型的表達範圍怎麼辦?這個就要根據類型是unsigned還是signed來分情況處理了。對於unsigned類型而言,如果所賦的值超過了最大的表示範圍,例如,8位最大值爲255,結果我們卻賦值257,那麼計算機會自動用所賦的值對取值範圍進行取模,餘數即爲真正的值,在這裏也就是257%256,因爲0-255的取值範圍是256;那麼unsigned本身並不表示負值,在c++中將負值賦值給unsigned類型卻合法,因爲它會進行取模操作,這樣一定會取到合理的範圍操作。對於signed而言,這就要看編譯器的處理,有些是對取值範圍進行取模處理,有些則不一定。

6、sizeof(),這個運算符依據()內的變量類型不同而有不同的含義,一個表示類型的長度,一個表示對象的長度,sizeof(char),那麼答案一定是1;如果對數組進行sizeof()操作,那麼得到的是數組中所有元素所佔的位置大小,如果想求得數組中的元素個數,這要再除以sizeof(數組中元素的類型)。

7、下面再寫一個有趣的表達式

int *p = new int;
int *p = new int();
這兩個式子,其實區別就在於第二個進行了初始化,第一個沒有進行初始化。值的初始化()要放在類型後面,而不是變量後面。在我們要養成初始化的好習慣,對於沒有初始化的式子的使用是非常可怕的,可能引起災難性的後果。

8、由於之前就提到過new 和delete的關係,所以這裏就大致講一些要點。首先delete只能刪除動態創建的內存,如果delete刪除動態內存失敗就是典型的“內存泄露問題”;除此之外不能連續刪除同一指針兩次;不能對已刪除的指針進行讀寫操作;這些操作都會引起災難性的後果。還有一個概念叫懸掛指針,也就是當delete掉指針後,指針沒有指向了,這時稱爲懸掛指針,懸掛指針的存在對程序是非常可怕的,它所引起的錯誤是非常難查找的,所以在刪除一個指針後我們應立即將其至爲0;

9、對於強制類型轉換,c++提供了四種方法,static_cast,dynamic_cast,const_cast,reinterpret_cast;其中的reinterpret_cast就像舊風格的強制類型轉換,const_cast是去掉const性質的;dynamic_cast會單開一個專題,這個比較重要,還有static_cast提供簡單的類型轉換。其實非常不建議用強制類型轉換,如果出錯了很難查找。

發佈了33 篇原創文章 · 獲贊 5 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章