C語言運算子

weixin_34337265發表於2017-09-13

一.操作符

  • 算數操作符
    C語言提供以下算數操作符
      +    -    * /    %

除了%操作符,其餘幾個操作符都是既適用於浮點型別又適用於整數型別,%操作運算子是取模運算,它接受兩個整型引數,把左側運算元除以右運算元,但它返回的是餘數而不是商。

  • 移位操作符
    C語言提供算數移位和邏輯移位,左運算元的值將移動由右運算元指定的位數。
      <<(左移)    >>(右移)

邏輯左移和算數左移是一樣的,右補所移位數個“0”;
邏輯右移左補所移位數個‘“0”,算數右移,如符號位為“1”,則補位所移位數個“1”,如果符號位為“0”,則補位“0”;

  • 位操作符
    與(&)   或(|)   異或(^)
    位操作運算子要求運算元為整數,它們對運算元對應的位進行相應的操作,每一次對左右運算元的各一位進行操作。
  • 賦值
    =

賦值是表示式的一種,而不是某種型別的語句,所以只要允許出現表示式的地方都允許進行賦值運算,

複合賦值運算子
+=   -=   *=   /=   %=
<<=   >>=   &=    ^=   |=

舉例說明,其餘都相同
a += (expression); 與a = a +(expression);相等,並且expression兩邊的括號是有必要的。

  • 單目操作符
    !   ++    -   &   sizeof()
    ~   --    +   *   (型別)

!  為邏輯反操作運算子,如果運算元為真,其結果為假,反之亦然;
~  該操作符是對整型型別的運算元進行求補操作,運算元中所有原先的1變為0,所有原先的0變成1;
&  為地址運算子,&操作符產生它運算元的地址;
  為間接訪問操作符,它與指標一起使用,用於訪問指標指向的值;
sizeof  sizeof操作符用於判斷它運算元的
型別長度
,以位元組為單位,運算元既可以是表示式也可以是基本資料型別名稱;
(型別)  運算元被稱為
強制型別轉化*,它用於顯式地把表示式的值轉化成另外的型別;
++ --  為自增自減操作符,這兩個操作符的任何一個運算元都需要是一個變數而不是一個表示式作為它的運算元;字首在使用變數的值前增加,字尾是使用變數的值乎增加;

  • 關係操作符
    !=     >=     < =
    ==      >     <

這些操作符產生的結果是一個整型值,而不是布林值,若果兩端的操作符符合給定的關係,表示式的結果是1,否則是0。
if(expression != 0)<<======>>if(expression)
if(expression == 0 )<<======>>if(!expression)

  • 邏輯運算子
    &&    II

這兩個操作符具有截斷效應
,如果表示式expression1的結果為假,那麼表示式     expression2將不再進行求值,其結果為假;
2.expression1 || expression2,如果表示式expression1的結果為真,那麼表示式     expression2將不再進行求值,其結果為真;

  • 條件操作符
    expression1 ?expression2 : expression3;
    條件運算子的級別比較低,所以它的表示式即使不加括號,一般也不會有問題,但是為了清楚表達還是最好加上括號。

首先對expression1進行求值,如果它的結果為真,那麼整個表示式的值就是expression2,expression3不會進行求值,否則整個條件語句的值就是expression3的值,expression2不會進行求值。

  • 逗號操作符
    expression1,expression2,expression3,...expressionn;

逗號操作符將兩個或兩個以上的表示式分隔開,整個表示式的值是最後一個表示式的值

二.布林值

在C語言中沒有布林型別的值,故有以下結論:

零是假,非零為真。

左值和右值

左值就是那些能夠出現在賦值符號左邊的值;
右值就是那些能夠出現在賦值符號右邊的值;

左值一般是標識了一個可以儲存結果值的地點,但不是所有的變數都是左值,字面值常量也不是左值。
   表示式也有可能是左值,如下標應用和間接操作,如:

1.a[b + 10] = 0;b+10是一個表示式,但它標識了一個具體的位置,a+b+10這個位置是可以確定的,因為a[b + 10] = (a + b + 10);
2.
pi = 20,它左邊顯然是個表示式,但他是一個左值,是因為指標pi是記憶體中某個特定的值,*pi操作是其指向那個位置,當它做左值使用時,這個表示式指定需要修改的位置,當它做右值時,它就是提取儲存於當前位置的這個值。
3.總結:有些操作符,如間接訪問和下標應用,它們的值是一個左值,其餘操作符的結果是個右值。

3.表示式求值

表示式的求值順序一部分是由它所包含的的操作符的優先順序和結合性決定,同樣,有些表示式的運算元在求值過程中可能需要轉換成其它型別。

隱式型別轉換

C的整型算術運算總是至少以預設整型型別的精度來進行的,為了獲得這個精度,表示式中的字元型和短整型運算元在使用之前被轉化為普通整型

算數轉換

如果某個操作符的各個運算元屬於不同的型別,那麼除非其中一個運算元轉換成另一個運算元的型別,否則無法進行該操作,下面的層次體系稱為尋常算數轉換

long double;
double;
unsigned long int;
long int;
unsigned int;
int;

如果某個運算元的型別在上面這個列表中的排名較低,那麼它首先轉換為另一個運算元的型別然後進行操作。

操作符的屬性

複雜操作符的求值順序是由三個因素決定的:

  • 操作符的優先順序:優先順序相同,那麼它們執行的順序由結合性決定。
  • 操作符的結合性:一串操作符是從左向右還是從右向左逐個執行
  • 操作符是否控制執行的順序:4個操作符控制求值順序:"&&","||","?",","。

操作符的優先順序如下圖:


注意:優先順序只對相鄰的操作符起作用。

相關文章