1. 程式人生 > >C語言(四)

C語言(四)

第四章 運算子

  • 4.1 分類
    • C語言的運算子範圍很廣,可分為以下幾類:
      • 1、算術運算子:用於各類數值運算。包括加(+)、減(-)、乘(*)、除(/)、求餘(%)、自增(++)、自減(--)共七種。
      • 2、賦值運算子:用於賦值運算,分為簡單賦值(=)、複合算術賦值(+=,-=,*=,/=,%=)和複合位運算賦值(&=,|=,^=,>>=,<<=)三類共十一種。
      • 3、逗號運算子:用於把若干表示式組合成一個表示式(,)。
      • 4、關係運算符:用於比較運算。包括大於(>)、小於(<)、等於(==)、 大於等於(>=)、小於等於(<=)和不等於(!=)六種。
      • 5、邏輯運算子:用於邏輯運算。包括與(&&)、或(||)、非(!)三種。
      • 6、條件運算子:這是一個三目運算子,用於條件求值(?:)。
        • 真前假後
      • 7、位操作運算子:參與運算的量,按二進位制位進行運算。包括位與(&)、位或(|)、位非(~)、位異或(^)、左移(<<)、右移(>>)六種。
      • 8、指標運算子:用於取內容(*)和取地址(&)二種運算。
      • 9.、求位元組數運算子:用於計算資料型別所佔的位元組數(sizeof)。
      • 10、特殊運算子:有括號(),下標[],成員(→,.)等幾種。
    • 另外,按參與運算的物件個數,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、減1)。
            • i++,i-- (在使用i之後,使i的值加1、減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得到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)位運算子&  |~<<  >> ∧ 按優先順序從高到低排列的順序是:
          • 位運算子中求反運算“~“優先順序最高,
          • 而左移和右移相同,居於第二,
          • 接下來的順序是按位與 “&“、按位異或 “∧“和按位或 “|“。
          • 順序為~  << >>  &  ∧  |  。