• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 311, comments - 0, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            (搬運工)VC++優先級與運算符

            Posted on 2011-03-08 16:14 點點滴滴 閱讀(801) 評論(0)  編輯 收藏 引用 所屬分類: 02 編程語言

            C++的優先級 
            優先級 操作符 結合性 
            1 :: 左 
            2 . -> [] () 左 
            3 ++ -- ~ ! - + & * () sizeof new delete castname_cast<type> 單目操作符 右 
            4 .* ->* 左 
            5 * / % 左 
            6 + - 左 
            7 << >> 左 
            8 < <= > >= 左 
            9 == != 左 
            10 & 左 
            11 ^ 左 
            12 | 左 
            13 && 左 
            14 || 左 
            15 ?: 右 
            16 = *= /= %= += -= <<= >>= &= |= ^= 右 
            17 throw 左 
            18 , 左


            C的優先級 
            一、賦值運算符 
            賦值語句的作用是把某個常量或變量或表達式的值賦值給另一個變量。符號為‘=’。這里并不是等于的意思,只是賦值,等于用‘==’表示。 
            注意:賦值語句左邊的變量在程序的其他地方必須要聲明。 
            得已賦值的變量我們稱為左值,因為它們出現在賦值語句的左邊;產生值的表達式我們稱為右值,因為她它們出現在賦值語句的右邊。常數只能作為右值。 
            例如: 
            count=5; 
            total1=total2=0; 
            第一個賦值語句大家都能理解。 
            第二個賦值語句的意思是把0同時賦值給兩個變量。這是因為賦值語句是從右向左運算的,也就是說從右端開始計算。這樣它先total2=0;然后total1=total2;那么我們這樣行不行呢? 
            (total1=total2)=0; 
            這樣是不可以的,因為先要算括號里面的,這時total1=total2是一個表達式,而賦值語句的左邊是不允許表達式存在的。

            二、算術運算符 
            在C語言中有兩個單目和五個雙目運算符。 
            符號 功能 
            + 單目正 
            - 單目負 
            * 乘法 
            / 除法 
            % 取模 
            + 加法 
            - 減法 
            下面是一些賦值語句的例子, 在賦值運算符右側的表達式中就使用了上面的算術運算符: 
            Area=Height*Width; 
            num=num1+num2/num3-num4; 
            運算符也有個運算順序問題,先算乘除再算加減。單目正和單目負最先運算。 
            取模運算符(%)用于計算兩個整數相除所得的余數。例如: 
            a=7%4; 
            最終a的結果是3,因為7%4的余數是3。 
            那么有人要問了,我要想求它們的商怎么辦呢? 
            b=7/4; 
            這樣b就是它們的商了,應該是1。 
            也許有人就不明白了,7/4應該是1.75,怎么會是1呢?這里需要說明的是,當兩個整數相除時,所得到的結果仍然是整數,沒有小數部分。要想也得到小數部分,可以這樣寫7.0/4或者7/4.0,也即把其中一個數變為非整數。 
            那么怎樣由一個實數得到它的整數部分呢?這就需要用強制類型轉換了。例如: 
            a=(int) (7.0/4); 
            因為7.0/4的值為1.75,如果在前面加上(int)就表示把結果強制轉換成整型,這就得到了1。那么思考一下a=(float) (7/4);最終a的結果是多少? 
            單目減運算符相當于取相反值,若是正值就變為負值,若是負數就變為正值。 
            單目加運算符沒有意義,純粹是和單目減構成一對用的。

            三、邏輯運算符 
            邏輯運算符是根據表達式的值來返回真值或是假值。其實在C語言中沒有所謂的真值和假值,只是認為非0為真值,0為假值。 
            符號 功能 
            && 邏輯與 
            || 邏輯或 
            ! 邏輯非

            當表達式進行&&運算時,只要有一個為假,總的表達式就為假,只有當所有都為真時,總的式子才為真。當表達式進行||運算時,只要有一個為真,總的值就為真,只有當所有的都為假時,總的式子才為假。邏輯非(!)運算是把相應的變量數據轉換為相應的真/假值。若原先為假,則邏輯非以后為真,若原先為真,則邏輯非以后為假。 
            還有一點很重要,當一個邏輯表達式的后一部分的取值不會影響整個表達式的值時,后一部分就不會進行運算了。例如: 
            a=2,b=1; 
            a||b-1; 
            因為a=2,為真值,所以不管b-1是不是真值,總的表達式一定為真值,這時后面的表達式就不會再計算了。

            四、關系運算符 
            關系運算符是對兩個表達式進行比較,返回一個真/假值。 
            符號 功能 
            > 大于 
            < 小于 
            >= 大于等于 
            <= 小于等于 
            == 等于 
            != 不等于 
            這些運算符大家都能明白,主要問題就是等于==和賦值=的區別了。 
            一些剛開始學習C語言的人總是對這兩個運算符弄不明白,經常在一些簡單問題上出錯,自己檢查時還找不出來。看下面的代碼: 
            if(Amount=123) …… 
            很多新人都理解為如果Amount等于123,就怎么樣。其實這行代碼的意思是先賦值Amount=123,然后判斷這個表達式是不是真值,因為結果為 123,是真值,那么就做后面的。如果想讓當Amount等于123才運行時,應該if(Amount==123) ……

            五、自增自減運算符 
            這是一類特殊的運算符,自增運算符++和自減運算符--對變量的操作結果是增加1和減少1。例如: 
            --Couter; 
            Couter--; 
            ++Amount; 
            Amount++;

            看這些例子里,運算符在前面還是在后面對本身的影響都是一樣的,都是加1或者減1,但是當把他們作為其他表達式的一部分,兩者就有區別了。運算符放在變量前面,那么在運算之前,變量先完成自增或自減運算;如果運算符放在后面,那么自增自減運算是在變量參加表達式的運算后再運算。這樣講可能不太清楚,看下面的例子: 
            num1=4; 
            num2=8; 
            a=++num1; 
            b=num2++;

            a =++num1;這總的來看是一個賦值,把++num1的值賦給a,因為自增運算符在變量的前面,所以num1先自增加1變為5,然后賦值給a,最終a也為5。b=num2++;這是把num2++的值賦給b,因為自增運算符在變量的后面,所以先把num2賦值給b,b應該為8,然后num2自增加1變為 9。 
            那么如果出現這樣的情況我們怎么處理呢? 
            c=num1+++num2; 
            到底是c=(num1++)+num2;還是c=num1+(++num2);這要根據編譯器來決定,不同的編譯器可能有不同的結果。所以我們在以后的編程當中,應該盡量避免出現上面復雜的情況。

            六、復合賦值運算符 
            在賦值運算符當中,還有一類C/C++獨有的復合賦值運算符。它們實際上是一種縮寫形式,使得對變量的改變更為簡潔。 
            Total=Total+3; 
            乍一看這行代碼,似乎有問題,這是不可能成立的。其實還是老樣子,'='是賦值不是等于。它的意思是本身的值加3,然后在賦值給本身。為了簡化,上面的代碼也可以寫成: 
            Total+=3; 
            復合賦值運算符有下列這些: 
            符號 功能 
            += 加法賦值 
            -= 減法賦值 
            *= 乘法賦值 
            /= 除法賦值 
            %= 模運算賦值 
            <<= 左移賦值 
            >>= 右移賦值 
            &= 位邏輯與賦值 
            |= 位邏輯或賦值 
            ^= 位邏輯異或賦值 
            上面的十個復合賦值運算符中,后面五個我們到以后位運算時再說明。 
            那么看了上面的復合賦值運算符,有人就會問,到底Total=Total+3;與Total+=3;有沒有區別?答案是有的,對于A=A+1,表達式A被計算了兩次,對于復合運算符A+=1,表達式A僅計算了一次。一般的來說,這種區別對于程序的運行沒有多大影響,但是當表達式作為函數的返回值時,函數就被調用了兩次(以后再說明),而且如果使用普通的賦值運算符,也會加大程序的開銷,使效率降低。

            七、條件運算符 
            條件運算符(?:)是C語言中唯一的一個三目運算符,它是對第一個表達式作真/假檢測,然后根據結果返回兩外兩個表達式中的一個。 
            <表達式1>?<表達式2>:<表達式3> 
            在運算中,首先對第一個表達式進行檢驗,如果為真,則返回表達式2的值;如果為假,則返回表達式3的值。 
            例如: 
            a=(b>0)?b:-b; 
            當b>0時,a=b;當b不大于0時,a=-b;這就是條件表達式。其實上面的意思就是把b的絕對值賦值給a。

            八、逗號運算符 
            在C語言中,多個表達式可以用逗號分開,其中用逗號分開的表達式的值分別結算,但整個表達式的值是最后一個表達式的值。 
            假設b=2,c=7,d=5, 
            a1=(++b,c--,d+3); 
            a2=++b,c--,d+3; 
            對于第一行代碼,有三個表達式,用逗號分開,所以最終的值應該是最后一個表達式的值,也就是d+3,為8,所以a=8。對于第二行代碼,那么也是有三個表達式,這時的三個表達式為a2=++b、c--、d+3,(這是因為賦值運算符比逗號運算符優先級高)所以最終表達式的值雖然也為8,但a2=3。

            還有其他的如位邏輯運算符,位移運算符等等,我們等到講位運算時再說明。

            九、優先級和結合性 
            從上面的逗號運算符那個例子可以看出,這些運算符計算時都有一定的順序,就好象先要算乘除后算加減一樣。優先級和結合性是運算符兩個重要的特性,結合性又稱為計算順序,它決定組成表達式的各個部分是否參與計算以及什么時候計算。 
            下面是C語言中所使用的運算符的優先級和結合性: 
            優先級 運算符 結合性 
            (最高) () [] -> . 自左向右 
            ! ~ ++ -- + - * & sizeof 自右向左 
            * / % 自左向右 
            + - 自左向右 
            << >> 自左向右 
            < <= > >= 自左向右 
            == != 自左向右 
            & 自左向右 
            ^ 自左向右 
            | 自左向右 
            && 自左向右 
            || 自左向右 
            ?: 自右向左 
            = += -= *= /= %= &= ^= |= <<= >>= 自右向左 
            (最低) , 自左向右

            亚洲成色www久久网站夜月| 亚洲欧洲日产国码无码久久99| 人妻无码αv中文字幕久久琪琪布| 久久精品黄AA片一区二区三区| 久久国产精品国语对白| 日韩久久久久久中文人妻 | 东方aⅴ免费观看久久av| 久久国产色AV免费看| 久久精品视频免费| 日韩av无码久久精品免费| 久久综合九色综合97_久久久 | 久久久精品国产亚洲成人满18免费网站| 欧美日韩精品久久久久| 人妻无码中文久久久久专区| 美女写真久久影院| 一本一本久久A久久综合精品| 国产精品无码久久四虎| 热re99久久精品国产99热| 亚洲AⅤ优女AV综合久久久| 波多野结衣久久一区二区| 伊人丁香狠狠色综合久久| 91久久精品视频| 国产亚洲欧美精品久久久| 国产精品久久亚洲不卡动漫| 久久精品免费一区二区三区| 日本久久中文字幕| 精品99久久aaa一级毛片| 国产精品99久久久久久www| 久久久久久夜精品精品免费啦| 国产精品99久久久精品无码| 嫩草影院久久国产精品| 国内精品九九久久久精品| 久久99久国产麻精品66| 51久久夜色精品国产| 国产亚洲美女精品久久久久狼| 日韩人妻无码精品久久久不卡| 精品国产乱码久久久久软件| 亚洲欧美国产精品专区久久| 亚洲午夜无码久久久久| 无码AV中文字幕久久专区| 久久久精品国产免大香伊|