C++Primer再讀讀書筆記:第五章

一、算術操作符


       一元操作符優先級別最高,其次是乘、除操作,接着是二元的加、減法操作。當操作符的優先級一樣時,一般是從左到右依次與操作數結合。
如果兩個操作數爲正,除數(/)和求模(%)操作的結果也是正數(或零),如果兩個操作數都是負數,除法操作的結果爲正數(或零),求模操作的結果則爲負數(或零)。如果只有一個操作數爲負數,這兩種操作的結果(求模結果)取決於機器,除法操作的值則是負數或者零。

二、關係操作符和邏輯操作符


       

邏輯與和邏輯或操作符總是先計算其左操作數,然後再計算其右操作數。只有在僅靠左操作數的值無法確定該邏輯表達式的結果時,纔會求解其右操作數。稱爲:短路求值。

三、位操作符


       位操作符將其整形操作數視爲二進制位的集合,爲每一位提供檢驗和設置的功能。
      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表達式。當兩個指針指向同一個動態創建的對象,刪除就會發生錯誤。
發佈了154 篇原創文章 · 獲贊 870 · 訪問量 85萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章