一、算術操作符
一元操作符優先級別最高,其次是乘、除操作,接着是二元的加、減法操作。當操作符的優先級一樣時,一般是從左到右依次與操作數結合。
如果兩個操作數爲正,除數(/)和求模(%)操作的結果也是正數(或零),如果兩個操作數都是負數,除法操作的結果爲正數(或零),求模操作的結果則爲負數(或零)。如果只有一個操作數爲負數,這兩種操作的結果(求模結果)取決於機器,除法操作的值則是負數或者零。
二、關係操作符和邏輯操作符
邏輯與和邏輯或操作符總是先計算其左操作數,然後再計算其右操作數。只有在僅靠左操作數的值無法確定該邏輯表達式的結果時,纔會求解其右操作數。稱爲:短路求值。
三、位操作符
位操作符將其整形操作數視爲二進制位的集合,爲每一位提供檢驗和設置的功能。
1、對於位操作符,由於系統不能確保如何處理其操作數的符號位,所以強烈建議使用unsigned整型操作數。
2、常犯的錯誤是把位與操作(&)和邏輯與操作(&&)混淆。同樣的爲或操作(|)和邏輯或操作(||)也容易混淆。
四、賦值操作符
賦值操作符的左操作數必須是非const的左值。
int i,j.ival;
const int ci = i;
1024 = ival; //error
i+j = val; //error
ci = ival; //error
數組名是不可修改的左值:因此數組不可用作賦值操作的目標,而下標和解引用操作符都返回左值。當將這兩種操作用於非const數組時,其結果可作爲賦值操作的左操作數。
int ia[10];
ia[0] = 1; //ok
*ia = 1; //ok
1、賦值操作符具有低優先級 int i=get_value();
while((i=get_value()) != 42)
{
i = get_value();
}
在賦值操作上加括號是必須的,因爲賦值操作符的優先級低於不等操作符。
五、自增和自減操作符
1、在必要時才使用後置操作符
因爲前置操作需要做的工作更少,只需要加1返回加1的結果顯示,而後置操作符必須西安保存操作數原來的值,以便返回未加1之前的值作爲操作的結果。
2、在單個表達式中組合使用解引用和自增操作 vector<int>::iterator iter = ivec.begin();
while(iter != ivec.end())
cout<<*iter++<<endl;
*iter++怎麼算???? 由於後自增操作優先於解引用操作,所以是*(iter++),自表達式iter++使iter
加1,然後返回iter原值的副本。
六、sizeof操作符
sizeof操作符的作用是返回一個對象或者類型名的長度。返回值的類型是size_t,sizeof表達式的結果是編譯時常量、
七、優先級
一個表達式中,不要在兩個或者更多的子表達式中對同一個對象做自增貨自減操作
if(ia[index++] < ia[index]) //次表達式的行爲就沒有明確意義,在<操作符的左右都有index變量,但是這個先算左邊還是右邊這個是不定的,假的初始值index 爲0就會出現兩種狀況:
if(ia[0] < ia[0]) // 右邊的先
if(ia[0] < ia[1]) //左邊先
該表達式最好這樣寫:
if(ia[index] < ia[index+1]){}
index++;
八、new和delete表達式
1、動態創建對象的初始化
int i(1024);
int *pi = new int (1024);
int s(10,'s');
int *ps = new string(10,'s');
如果提供了初值,new表達式分配到所需要的內存後,用給定的初值初始化該內存空間,如果不提供顯示初始值,動態創建的對象與在函數內定義的變量初始化方式相同,對於類類型的對象,用該類的默認構造函數,內置類型的對象則無初始化。
2、撤銷動態創建的對象
動態創建對象用完後,必須顯示地將該對象佔用的內存返回給自由存儲區,delete表達式釋放指針指向的地址空間。
如果指針指向不是new分配的內存地址,則在該指針上使用delete是不合法的。
3、懸垂指針
懸垂指針指向曾經存放對象的內存,但該對象已經不再存在了!一旦刪除了指針所指向的對象,立即將指針置爲0,這樣就非常清楚的表明指針不再指向任何對象。
4、const對象的動態分配和回收
動態創建const對象必須在創建時初始化,並且已經初始化就不能再修改。
const int *pci = new const int(1023) ;
5、動態內存的管理容易出錯
- delete指向動態分配內存的指針失敗,因而無法將該塊內存返還給自由存儲區,刪除動態分配內存失敗稱爲“內存泄漏”
- 讀寫已刪除的對象,如果刪除指針所指向的對象後,將指針置爲0值,比如容易檢測
- 對同一內存空間使用兩次delete表達式。當兩個指針指向同一個動態創建的對象,刪除就會發生錯誤。