114.C語言_運算符

第四章 運算符node

  • 4.1 分類
    • C語言的運算符範圍很廣,可分爲如下幾類:
      • 一、算術運算符:用於各種數值運算。包括加(+)、減(-)、乘(*)、除(/)、求餘(%)、自增(++)、自減(--)共七種。
      • 二、賦值運算符:用於賦值運算,分爲簡單賦值(=)、複合算術賦值(+=,-=,*=,/=,%=)和複合位運算賦值(&=,|=,^=,>>=,<<=)三類共十一種。
      • 三、逗號運算符:用於把若干表達式組合成一個表達式(,)。
      • 四、關係運算符:用於比較運算。包括大於(>)、小於(<)、等於(==)、 大於等於(>=)、小於等於(<=)和不等於(!=)六種。
      • 五、邏輯運算符:用於邏輯運算。包括與(&&)、或(||)、非(!)三種。
      • 六、條件運算符:這是一個三目運算符,用於條件求值(?:)。
        • 真前假後
      • 七、位操做運算符:參與運算的量,按二進制位進行運算。包括位與(&)、位或(|)、位非(~)、位異或(^)、左移(<<)、右移(>>)六種。
      • 八、指針運算符:用於取內容(*)和取地址(&)二種運算。
      • 9.、求字節數運算符:用於計算數據類型所佔的字節數(sizeof)。
      • 十、特殊運算符:有括號(),下標[],成員(→,.)等幾種。
    • 另外,按參與運算的對象個數,C語言運算符可分爲:單目運算符 (如 !)、雙目運算符 (如+,- )和三目運算符 (如 ? : )。
    • 級別由大到小:(邏輯)非 >算(術運算符) >關(系運算符) >(邏輯)與 >(邏輯)或 >條(件運算符) >賦(值運算符)
  • 4.2算術運算符和算術表達式
    • 4.2.1 基本的算術運算符與表達式
      • 算術運算符
        • (1)+(加法運算符或正值運算符,如2+5)。
        • (2)-(減法運算符或負值運算符,如4-2)。
        • (3)*(乘法運算符,如3*8)。
        • (4)/(除法運算符,如11/5)。
          • /的運算分爲兩種狀況:
            • a、「除」的左右兩邊都爲整數時,所得結果必然是整數(注意:僅取整數部分,不是四捨五入)
              • 好比:5/2的值爲2,不是2.5,1/2的值爲0。
            • b、「除」的左右兩邊至少有一個是實型數據(即小數)時,所得結果爲實型數據。
              • 好比:5/2.0的值爲2.5,7.0/2.0的值爲3.5.
        • (5)%(模運算符或稱求餘運算符,%兩側均應爲整型數據,如9%7的值爲2)。
          • 須要說明的是:當運算對象爲負數時,所得結果隨編譯器不一樣而不一樣,在vc中,結果的符號與被除數相同,好比:13%-2值爲1,而-15%2值爲-1.
          • %符號兩邊要求是整數。不是整數就錯了
      • 表達式:
        • 是表達式就必定有數值。算術表達式是用算術運算符和括號將運算量(也稱操做數)鏈接起來的、符合C語言語法規則的表達式。運算對象包括函數、常量和變量等。
        • 賦值表達式:
          • 表達式數值是最左邊的數值,a=b=5;該表達式爲5,常量不能夠賦值。
        • 自加、自減表達式:
          • 假設a=5,++a(是爲6), a++(爲5);運行的機理:++a 是先把變量的數值加上1,而後把獲得的數值放到變量a中,而後再用這個++a表達式的數值爲6,而a++是先用該表達式的數值爲5,而後再把a的數值加上1爲6,再放到變量a中。 進行了++a和a++後 在下面的程序中再用到a的話都是變量a中的6了。
          • 考試口訣:++在前先加後用,++在後先用後加。
        • 逗號表達式:
          • 優先級別最低 ;表達式的數值逗號最右邊的那個表達式的數值。(2,3,4)的表達式的數值就是4。
      • 算術表達式和運算符的優先級與結合性
        • 在計算機語言中,算術表達式的求值規律與數學中的四則運算的規律相似,其運算規則和要求以下。
          • (1)在算術表達式中,可以使用多層圓括號,但括號必須配對。運算時從內層圓括號開始,由內向外依次計算各表達式的值。
          • (2)在算術表達式中,對於不一樣優先級的運算符,可按運算符的優先級由高到低進行運算,若表達式中運算符的優先級相同,則按運算符的結合方向進行運算。
          • (3)若是一個運算符兩側的操做數類型不一樣,則先利用自動轉換或強制類型轉換,使二者具備相同類型,而後進行運算。
      • 自增自減運算符
        • 做用:使變量的值增1或減1。
          • 如:
            • ++i,--i (在使用i以前,先使i的值加一、減1)。
            • i++,i-- (在使用i以後,使i的值加一、減1)。
        • (1)只有變量才能用自增運算符 (++)和自減運算符(--),而常量或表達式不能用,如10++或(x+y)++都是不合法的。
        • (2)++和--的結合方向是「自右向左「,如 -i++ ,i的左邊是負號運算符,右邊是自增運算符,負號運算和自增運算都是 「自右向左「結合的,至關於-(i++)。
        • (3)在循環語句中經常使用到自增(減)運算符,在指針中也經常使用到該運算符,區別「i++」和「++i」及「i--」和「--i」,表達式的值和變量的值。
          • 例:變量n的初始值爲2,則
            • 表達式類型    i++  ++i  i--   --i
            • n值爲2時各表達式的值     2     3     2     1
            • 通過各表達式運算後變量n的值變化爲    3     3     1     1
        • (4)l 當++或—與printf語句結合時,若++/--x的形式,則先自增/自減,而後輸出;若x++/--的形式,則先輸出x原值,在進行自增/自減操做。
          • 有如下程序
            • #include
            • main()
            • {     int x=011;
            • printf("%d\n",++x);  //10
            • }
            • 【解析】011是一個八進制的數,轉爲十進制則爲1*8+1=9;++x是x先自增1再參與其餘運算,因此先x自增1爲10再輸出即爲10,故選C。
  • 4.3 賦值運算符與賦值表達式
    • 4.3.1賦值運算符與賦值表達式
      • 賦值符號
        • =
      • 做用
        • 將一個數據賦給一個變量或將一個變量的值賦給另外一個變量,由賦值運算符組成的表達式稱爲賦值表達式。
      • 通常形式爲:
        • 變量名 = 表達式 
      • 注意
        • 賦值運算符左邊必須是變量,而不是表達式。
        • 在程序中能夠屢次給一個變量賦值,每賦一次值,與它相應的存儲單元中的數據就被更新一次,內存中當前的數據就是最後一次所賦值的那個數據。
          • 例:a=12;  此表達式讀做「將10的值賦值給變量a」。
        • 若是賦值號兩邊的運算對象類型不一致,系統會自動進行類型轉換,轉換的規則:將賦值號右邊表達式的值的類型轉換成賦值號左邊變量的類型,
          • 例:int  y=3.5; 在變量y中最終存儲的是整數3。
        • 能夠將賦值表達式的值再賦值給變量,造成連續賦值。
          • 例如:x=y=25是一個連續賦值表達式,x=y=25 等價於x=(y=25),因此表達式x=y=25 最終的值爲25 。
    • 4.3.2複合的賦值運算符
      • 在賦值運算符以前加上其餘運算符能夠構成複合賦值運算符。其中與算術運算有關的複合運算符是:+=,-=,*=,/=,%= 。
      • 兩個符號之間不能夠有空格,複合賦值運算符的優先級與賦值運算符的相同。表達式n+=1等價於n=n+1,做用是取變量n中的值增1再賦給變量n,其餘複合的賦值運算符的運算規則依次類推。
      • 如求表達a+=a-=a*a的值,其中a的初值爲12 。
        • 步驟:
        • (1)先進行「a-=a*a「運算,至關於a=a-a*a=12-144=-132 。
        • (2)再進行「a+=-132「運算,至關於 a=a+(-132)=-132-132=-264 。
  • 4.4 逗號運算符和逗號表達式
    • 概念
      • 在c語言中,逗號除了做爲分隔符,還能夠用做一種運算符----逗號運算符,用逗號運算符將幾個表達式鏈接起來,例如a=b+c,a=b*c等稱爲逗號表達式。
    • 通常形式爲:
      • 表達式1 ,表達式2 ,表達式3 , …,表達式n
        • 例:x=2,y=3,z=4
    • 注意
      • 逗號表達式具備從左至右的結合性,即先求解表達式1,而後依次求解表達式2,直到表達式n的值。表達式n的值就是整個逗號表達式的值。上述的逗號表達式的值就是表達式z=4的值4.須要注意的是,逗號運算符是全部運算符中級別最低的。
        • 例:有以下程序段:
          • main()
          • {
          • inta=2,b=4,c=6,x,y;
          • y=(x=a+b),(b+c);
          • printf("y=%d,x=%d",y,x);
          • }
          • 程序顯示結果爲:y=6,x=6
  • 4.5關係運算符和關係表達式
    • 4.5.1 C語言中的邏輯值
      • C語言中的邏輯值只有兩個:真(true)和假(flase)。用非零表明真,用零表明假。所以,對於任意一個表達式,若是它的值爲零,就表明一個假值,若是它的值爲非零,就表明一個真值。只要值不是零,不論是正數,負數,整數,實數,都表明一個真值。例如-5的邏輯值爲真。
    • 4.5.2 關係運算符
      • 由兩個字符組成的運算符之間不能夠加空格,關係運算符都是雙目運算符。
        • (1)結合性:自左向右。
        • (2)優先次序:前4種關係運算符( <,<=,>=,> )的優先級別相同,後兩種 (==,!=)優先級相同,且前4種優先級高於後兩種;關係運算符的優先級低於算術運算符,高於賦值運算符。
    • 4.5.3關係表達式
      • 由關係運算符鏈接而成的表達式稱爲關係表達式。
        • 例如:a>b,(a=7)>(b=10)等都是合法的關係表達式。
      • 關係表達式的結果有兩個:0和1,。其中0表示假,1表示真。若是關係表達式成立,則值爲真,若是關係表達式不成立,則值爲假。
        • 例:變量a的值爲5,b的值爲6,那麼關係表達式a>b的值爲假,即爲0.而關係表達式
        • (a=13)>(b=10)的值爲真,即爲1。
      • 當關系運算符兩邊值的類型不一致時,若一邊是整型,一邊是實型,系統將自動把整型數轉化爲實型數,而後再進行比較。
  • 4.6 邏輯運算符和邏輯表達式
    • 4.6.1邏輯運算符及其優先級
      • C語言提供了3種邏輯運算符
      • 優先級    由高到低
        • 邏輯運算符    !(邏輯非) 高於  &&(邏輯與)高於 ││(邏輯或)
      • 說明:
        • 「&&」和「||」是雙目運算符,要求要有兩個操做數,而「!」是單目運算符,只要求有一個操做數便可。
        • 以上邏輯運算符的優先級是:「!」(邏輯非)級別最高,其次是「&&」(邏輯與),「||」(邏輯或)級別最低,邏輯運算符中的「&&」和「||」低於關係運算符,「!」高於算術運算符。
        • 即:「!」(邏輯非)>算術運算符>關係運算符>「&&」>「||」>賦值運算符>逗號運算符。
    • 4.6.2邏輯表達式
      • 「&&」和「||」的運算對象有兩個,故它們都是雙目運算符,而!的運算對象只有一個,所以它是單目運算符。
      • 邏輯運算舉例以下:
        • (1)a&&b: 當&&兩邊都爲「真」時,表達式a&&b的值纔是真。
          • 值得注意的是:在數學中,關係式0<x<10是可使用的,表示x的值應在大於0且小於10的範圍內,但在C語言中卻不能用0<x<10這樣一個關係表達式來表示上述的邏輯關係,即關係運算符不能連用,但能夠藉助邏輯運算符來輔助運算,正確的表示方法是 0<x && x<10。
        • (2)a||b: 當||兩邊有一個爲「真」時,表達式a||b的值就是真。
        • (3)!a:   表示取反,若是a爲真,則!A爲假,反之亦然。例如!-5的值就爲0.
    • 4.6.3短路
      • 在C語言中,由&&或||組成的邏輯表達式,在某些特定狀況下會產生「短路「現象。
        • (1)x && y && z ,只有當x爲真(非0)時,才須要判別y的值;只有x和y都爲真時,才須要去判別z的值;只要x爲假就沒必要判別y和z,整個表達式的值爲0。口訣:「一假必假」。
          • 例:(!5==1)&&(++i==0)  (!5==1)表達式的值爲0,因此計算機運行中就跳過(++i==0)此表達式,(!5==1)&&(++i==0)表達式的值爲0.
        • (2)x||y||z ,只要x的值爲真(非零),就沒必要判別y和z的值 ,整個表達式的值爲1,只有x的值爲假,才須要判別y的值,只有x和y的值同時爲假才須要判別z的值,口訣:「一真必真」。
  • 4.7 位運算
    • 4.7.1位運算符與位運算
      • 在計算機中,數據都是以二進制數形式存放的,位運算就是指對存儲單元中二進制位的運算。C語言提供6種位運算符。
        • 操做符    含義        規則
        • &     按位與    若兩個相應的二進制位都爲1,則該位的結果爲1,不然爲0
        • |       按位或    兩個相應的二進制位中只要有一個爲1,則該位的結果爲1,不然爲0
        • ^      按位異或        若兩個二進制位同號,則結果爲0,異號爲1
          • 異或的位運算
            • 0 異或 1獲得一、
            • 0 異或 0獲得0、
            • 1 異或 1獲得0,
            • 相同爲0,不一樣爲1
              • 例 3 ∧
                • 設二進制數a是00101101 ,若經過異或運算a∧b使a的高4位取反,低4位不變,則二進制數b是11110000。
                  • 解析:異或運算經常使用來使特定位翻轉,只要使需翻轉的位與1進行異或操做就能夠了,由於原數中值爲1的位與1進行異或運算得0 ,原數中值爲0的位與1進行異或運算結果得1。而與0進行異或的位將保持原值。異或運算還可用來交換兩個值,不用臨時變量。
                    • 如 inta=3 , b=4;,想將a與b的值互換,可用以下語句實現:
                      • a=a∧b;
                      • b=b∧a;
                      • a=a∧b;
        • ~      按位求反        按位取反,即0變1,1變0
        • << 左移        將一個數的二進制所有左移若干位
          • 例1<<
            • 左移運算符「<<」是雙目運算符。其功能把「<< 」左邊的運算數的各二進位所有左移若干位,由「<<」右邊的數指定移動的位數,高位丟棄,低位補0。
              • 例如:
                • a<<4
                • 指把a的各二進位向左移動4位。如a=00000011(十進制3),左移4位後爲00110000(十進制48)。
        • >> 右移        將一個數的二進制位所有右移若干位
          • 例 2>>
            • 右移運算符「>>」是雙目運算符。其功能是把「>>」左邊的運算數的各二進位所有右移若干位,「>>」右邊的數指定移動的位數。
              • 例如:
                • 設  a=15,
                • a>>2
                • 表示把000001111右移爲00000011(十進制3)。
          • 應該說明的是,對於有符號數,在右移時,符號位將隨同移動。當爲正數時,最高位補0,而爲負數時,符號位爲1,最高位是補0或是補1 取決於編譯系統的規定。
      • 說明:
        • (1)位運算中除「~「之外,均爲雙目運算符,要求兩側各有一個運算量。
        • (2)運算量只能是整型或字符型數據,不能爲實型數據。
        • (3)在沒有捨去數據的時候,<<左移一位表示乘以2;>>右移一位表示除以2。
        • (4)特別要注意:c語言中是用非0表示邏輯真的,用0表示邏輯假的
        • (5)位運算符&  |~<<  >> ∧ 按優先級從高到低排列的順序是:
          • 位運算符中求反運算「~「優先級最高,
          • 而左移和右移相同,居於第二,
          • 接下來的順序是按位與 「&「、按位異或 「∧「和按位或 「|「。
          • 順序爲~  << >>  &  ∧  |  。

 

 

相關文章
相關標籤/搜索