<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    PS,1880后程序員

    看不完的牙,寫不完的程序,跑不完的步。
    隨筆 - 97, 文章 - 34, 評論 - 10, 引用 - 0
    數據加載中……

    C++ Primer 之 讀書筆記 第五章

     

    5.3 位操作符(The Bitwise Operators)

    盡量不要使用符號數進行位運算,因為符號位的處理和機器有關。

    XOR的描述真是簡單明了,For each bit position, the result is 1 if either but not both operands contain 1; Otherwise, the result is 0.

    輸入輸出標準庫重載了移位操作符>><<用于輸入和輸出。

    復合表達式的求值(Evaluating Compound Expressions

    這里面有兩個關鍵詞:

    l         Precedence

    Precedence specifies how the operands are grouped.優先級規定的是操作數的結合方式

    l         associativity

    Associativity specifies how to group operators at the same precedence level.結合性規定了具有相同優先級的操作符如何分組。

    例如:

    賦值操作符是右關聯

     ival = jval = kval = lval       // right associative

     (ival = (jval = (kval = lval))) // equivalent, parenthesized version

    算數操作符是左關聯

    ival * jval / kval * lval       // left associative

    (((ival * jval) / kval) * lval) // equivalent, parenthesized version

    5.4 賦值操作符(Assignment Operators

    讓你不得不佩服,Lippman這樣的大師僅僅賦值操作符(Assignment Operators)就可以講出這么多的內容。

    l         賦值運算是右關聯,它的返回值是左操作數;類型為左操作數的類型(The result of an assignment is the left-hand operand, the type of the result is the type of the left-hand operand.)。

    這樣就好理解這樣的賦值語句了:

    先執行jval = 0;返回值是jval ,再執行ival = jval。

    int ival, jval;

    ival = jval = 0; // ok: each assigned 0

    l         賦值操作的優先級低。

    下面的條件語句返回值是true,因為先執行賦值語句,返回值是i,i大于0,因此條件語句判斷為true。

    if (i = 42)

    下面的條件語句返回值是false,因為先執行賦值語句,返回值是i,i等于0,因此條件語句判斷為false

    if (i = 0)

    5.5 Increment and Decrement Operators自增和自減操作符

    l         重點

    前置和后置操作符

    l         建議

    只在必要的時候才使用后置操作符。

    l         區別

    前置和后置操作符的返回值是不同的,這是最重要的區別,也是理解的基礎。

    前置操作符:值加1,再返回。(It increments the value and returns the incremented version.

    后置操作符:必須保留原始值,(原始值加1)返回的結果是未增加的值。(The postfix operator must store the original value so that it can return the unincremented value as its result.

    l         代碼

    cnt—的返回值是cnt

    vector<int> ivec;           // empty vector

    int cnt = 10;

    // add elements 10...1 to ivec

    while (cnt > 0)

        ivec.push_back(cnt--); // int postfix decrement

    *iter++就是*(iter++),++操作的優先級高于*,所以先執行iter++,這個操作的返回值是iter,然后iter+1.再執行解引用操作*,這個解引用操作的操作數是返回的iter。

    vector<int>::iterator iter = ivec.begin();

    // prints 10 9 8 ... 1

    while (iter != ivec.end())

        cout << *iter++ << endl; // iterator postfix increment

    Sizeof

    ?如果是返回對象的size,那么sizeof的返回值是不是和數據有關?

    賦值順序

    l         && || 操作符計算其操作數的次序:當且僅當其右操作數確實影響了整個表達式的值時,才計算這兩個操作符的右操作數。

    && and || operators specify the order in which their operands are evaluated: In both cases the right-hand operand is evaluated if and only if doing so might affect the truth value of the overall expression.

    (這句話說的真是嚴謹。)

    l         一個表達式里,不要在兩個或更多的子表達式中對同一對象做自增或自減操作。

    Do not use an increment or decrement operator on the same object in more than two subexpressions of the same expression.

    5.11 new delete 表達式(The new and delete Expressions

    new表達式返回的是一個指針,這個指針指向新分配的一個對象。

    int *pi = new int; // pi points to dynamically allocated,

    delete pi;

    但是這樣寫就不是動態分配的指針

    int i;

    int *pi = &i;

    delete pi; //因為pi指向的是一個local變量

    后面的寫法是不能執行delete表達式的。

    new動態創建的對象一定要執行delete來刪除。否則內存就會被耗盡。

    大師給了以下的建議:

    l         Setting the pointer to 0 after the object it refers to has been deleted makes it clear that the pointer points to no object.(一旦刪除了指針所指向的對象,立即將指針置為 0,這樣就非常清楚地表明指針不再指向任何對象。)

    l         Reading or writing to the object after it has been deleted. This error can sometimes be detected by setting the pointer to 0 after deleting the object to which the pointer had pointed.(讀寫已刪除的對象。如果刪除指針所指向的對象之后,將指針置為 0 值,則比較容易檢測出這類錯誤。)

    l         Applying a delete expression to the same memory location twice. This error can happen when two pointers address the same dynamically allocated object. If delete is applied to one of the pointers, then the object's memory is returned to the free store. If we subsequently delete the second pointer, then the free store may be corrupted.(對同一個內存空間使用兩次 delete 表達式。當兩個指針指向同一個動態創建的對象,刪除時就會發生錯誤。如果在其中一個指針上做 delete 運算,將該對象的內存空間返還給自由存儲區,然后接著 delete 第二個指針,此時則自由存儲區可能會被破壞。)

    posted on 2009-05-20 14:19 amenglai 閱讀(302) 評論(0)  編輯  收藏 所屬分類: C++ Primer 之 讀書筆記

    主站蜘蛛池模板: 亚洲小说区图片区另类春色| 成在线人永久免费视频播放| 国产l精品国产亚洲区在线观看| 免费国产草莓视频在线观看黄| 国产成人免费手机在线观看视频| 精品成在人线AV无码免费看 | 国产精品高清免费网站| 亚洲高清偷拍一区二区三区| 一道本不卡免费视频| 亚洲精品国偷自产在线| 日韩精品极品视频在线观看免费 | 婷婷亚洲综合一区二区| 免费一级特黄特色大片在线| 污污免费在线观看| 国产l精品国产亚洲区在线观看| 一级毛片成人免费看免费不卡 | 亚洲国产婷婷香蕉久久久久久| 成人免费ā片在线观看| 亚洲AV无码久久| 免费做爰猛烈吃奶摸视频在线观看| 一区二区亚洲精品精华液| 国产精品免费小视频| 一级毛片免费一级直接观看| 亚洲av之男人的天堂网站| 日本片免费观看一区二区| 亚洲av永久中文无码精品综合| 亚洲免费无码在线| 无码国产精品一区二区免费16| 亚洲avav天堂av在线网爱情| 凹凸精品视频分类国产品免费| 亚洲免费观看视频| 亚洲av无码一区二区三区观看| 男人的天堂亚洲一区二区三区 | 深夜福利在线免费观看| 国产AV无码专区亚洲AVJULIA | 少妇中文字幕乱码亚洲影视| 日韩一品在线播放视频一品免费| 国产美女视频免费观看的网站| 亚洲理论精品午夜电影| 亚洲国产成人精品女人久久久| 131美女爱做免费毛片|