操作符

操作符

算術操作符

+

-

*

/

%

%爲取模操作符,它接受兩個整型操作數,把左操作數除以右操作數,返回的值是餘數。

移位操作符

移位操作只是簡單地把一個值的位向左或向右移動。

這裏寫圖片描述

左操作數的值將移動由右操作數指定的位數。

<<

在左移操作符中,值最左邊的幾位被丟棄,右邊多出來的幾個空位則由0補齊。

>>

在右移操作符中,從左邊移入新位時,可以選擇兩種方案。

  • 邏輯移位
    • 左邊移入的位用0填充。
  • 算術移位
    • 左邊移入的位由原先該值的符號位決定,從而保證原數的正負形式不變。
    • 符號位爲1則移入的位均爲1。
    • 符號位爲0則移入的位均爲0。
#include <stdio.h>

int count_one_bits(unsigned value)   /*返回參數值中值爲1的個數*/
{
    int ones;
    for (ones = 0; value != 0; value = value >> 1) {
        if (value % 2 != 0) /*最低位值爲1*/
            ones = ones + 1;
        else  /*最低位值不爲1*/
            continue;
    }
    return ones;
}
int main() {
    int value = 10;
    printf("%d" , count_one_bits(value));
}

位操作符

賦值

賦值操作符

賦值操作符用一個等號表示。

賦值操作符把右操作數的值存儲於左操作數指定的位置。

x = y + 3;

同時,由於賦值是一個表達式,凡表達式皆有一個值。

所以,賦值表達式的值就是左操作數的新值,它可以作爲其他賦值操作符的右操作數。

a = x;

賦值操作符的結合性(求值順序)是從右到左的。

a = x = y + 3;
等價於
a = (x = (y + 3) );

複合賦值符

a += expression;
等價於
a = a + expression;

唯一的區別在於:

複合賦值操作符的左操作數只求值一次。

單目操作符

單目操作符,也就是隻接受一個操作數的操作符。

!操作符對它的操作數執行邏輯反操作:

  • 如果操作數爲真,其結果爲假。
  • 如果操作數爲假,其結果爲真。

~

~操作符對整型類型的操作數進行求補操作:

  • 操作數中所有原先爲1的位變爲0。
  • 操作數中所有原先爲0的位變爲1。

++

前綴形式

操作數的值被增加,表達式的值就是操作數增加後的值。

後綴形式

操作數的值被增加,表達式的值是操作數增加前的值。

前綴形式

操作數的值被減少,表達式的值就是操作數減少後的值。

後綴形式

操作數的值被減少,表達式的值是操作數減少前的值。

+

+操作符產生操作數。

-

-操作符產生操作數的負值。

&

&操作符產生操作數的地址。

*

間接訪問操作符*與指針一起使用,用於訪問指針所指向的值。

sizeof

sizeof操作符判斷操作數的類型長度,以字節爲單位表示。

(類型)

(類型)操作符被稱爲強制類型轉換,它用於顯示地把表達式的值轉換爲另外的類型。

關係操作符

這些操作符產生的結果都是一個整型值,而不是布爾值。

  • 如果兩端的操作數符合操作符指定的關係,表達式的結果爲1。
  • 如果不復符合,表達式的結果是0。

>

>=

<

<=

!=

==

邏輯操作符

&&

expression1 && expression2
  • 如果expression1和expression2的值都是真的,那麼整個表達式的值也是真的。
  • 如果兩個表達式中的任何一個表達式的值爲假,那麼整個表達式的值變爲假。

短路求值

&&操作符的左操作數總是首先進行求值,如果它的值爲真,然後就緊接着對右操作數進行求值。如果左操作數的值爲假,那麼右操作數便不再進行求值,因爲整個表達式的值肯定是假的。右操作數的值已經無關緊要了。

||

expression1 || expression2
  • 如果expression1和expression2的值都是假的,那麼整個表達式的值也是假的。
  • 如果兩個表達式中的任何一個表達式的值爲真,那麼整個表達式的值變爲真。

短路求值

||操作符首先對左操作數求值。如果它的值是真,右操作數便不再求值,因爲整個表達式的值已經確定。

條件操作符

expression1 ? ecpression2 : expression3

首先計算expression1,如果它的值爲真,那麼整個表達式的值就是expression2的值,expression3不會進行求值。

但是,如果expression1的值爲假,那麼整個表達式的值就是expression3的值,expression2不會進行求值。

逗號操作符

expression1, expression2, expression3, expression4,..., expressionN

逗號表達式用於將兩個或多個表達式分隔開來。

這些表達式自左向右逐個進行求值,整個逗號表達式的值就是最後的那個表達式的值。

布爾值

C並不具備顯示的布爾類型,所以使用整數來代替。

規則是:

0是假,任何非0值都是真。

表達式求值

類型轉換

隱式類型轉換

C的整型算術運算總是至少以默認整型類型的精度來進行的。

爲了獲得這個精度,表達式中的字符型和短整型操作數在使用之前被轉換爲普通整型。這種轉換稱爲整型提升。

算術轉換

如果某個操作符的各個操作數屬於不同的類型,那麼除非其中一個操作數轉換爲另一個操作數的類型,否則操作無法進行。

下面的層次體系稱爲尋常算術轉換:

  1. long double
  2. double
  3. float
  4. unsigned long int
  5. long int
  6. unsigned int
  7. int

如果某個操作數的類型在上面這個列表中排名較低,那麼它首先將轉換爲另外一個操作數的類型,然後執行操作。

操作符屬性

  • 優先級
  • 結合性
  • 是否控制執行順序

兩個相鄰的操作符哪個先執行取決於它們的優先級,如果兩個的優先級相同,那麼它們的執行順序由它們的結合性決定。

結合性就是一串操作符是從左向右依次執行還是從右向左逐個執行。

最後,%%、||、?:、,這四個操作符可以對整個表達式的求值順序施加控制,它們或者保證某個子表達式能夠在另一個子表達式的所有求值過程完成之前進行求值,或者可能使某個表達式被完全跳過不再求值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章