運算符及表達式

表達式和賦值

首先,我們來看一下運算符的優先級

運算符優先級
運算符的優先級:這個表中囊括了單目運算符,雙目運算符及三目運算符的優先級(1級最高,14級最低)。
運算符的結合性:C語言中各運算符的結合性分爲兩種,即左結合性(自左至右)和右結合性(自右至左)。

接下來我爲大家講述運算符以及表達式


1.算術運算符以及算術表達式

(1)算術運算符:+、-、*、/、%、++、–;

注意:求餘運算符(模運算符)“%”參與運算的變量均爲整型,除法運算符“/”當運算量均爲整數時輸出也爲整數,當運算量中有一個是實型,則結果是雙精度實型。

(2)算術表達式:是由算術運算符和操作數組合成的式子,算術表達式用於各類數值運算。除求餘運算符%之外,運算對象可以是整型,也可以是實型。

(3)算術運算符在算術表達式之中的優先級

括號運算符的優先級最高(),所以當表達式之中存在括號運算符的時候先進行運算。
我們先來看一些問題幫助我們理解之中的優先級。

int a = 4, b = 5, c = 6, d;
d = a - b + c;//d = 5
d = a - (b + c);//d = -7 因爲括號運算符的緣故導致b與c先進行了相加,再進行減法運算

取模運算符%也可以通過乘除來實現

5 % 3 等價於 5 - (5 / 3) * 3(先取出整數,再乘,然後再相減)

接下來我們來看一看自增和自減運算符

int i = 1, j = 1, a, b
a = i++ + i++;//a = 2 , i = 3 因爲這裏使用的是後自增運算符這時先用i進行相加再進行自增
b = ++j + ++j;//b = 6, j = 3 因爲這裏使用的是前自增運算符這時先用j進行自增再進行相加運算

在這裏有些同學一定認爲自己已經理解了,那麼我們再嘗試一道題

int i = 1, j = 1, a, b;
a = i++ + i++ + i++;//i = 4
b = ++j + ++j + ++j;//j = 4

大家猜一猜這個的結果是什麼
是 a = 3, b = 12?
對了一半,b回答錯了
b = 10
對於i++我們已經沒有問題了那麼現在就讓我告訴你j++在這裏是如何處理的吧
表達式中除了運算符優先級還存在結合性,在 ++j + ++j + ++j中存在兩個同級的+運算,根據+運算符的左結合性,在編譯時則是這樣處理(++j + ++j)+ ++j,也就是(3 + 3)+ 4,所以得出結果纔是10

2.賦值運算符及賦值表達式

(1)賦值運算符:賦值運算符用“=”表示,作用是將一個數據賦給一個變量

(2)賦值表達式:由賦值運算符“=”將一個變量和一個表達式連接起來的式子稱爲賦值表達式,其一般形式爲 變量=表達式。

(3) 通過賦值表達式達到類型轉換:在對賦值表達式求解過程中,如果賦值運算符兩邊的數據類型不一致,賦值時要進行類型轉換。轉換原則以“=”左邊變量爲準

(4)複合的賦值運算符

複合的賦值運算符有:+=、-=、*=、/=、%=、<<=、>>=、&=、^=、|=;
a += 3 等價 a = a+3;
a -= 3 等價 a = a-3;
a *= 3 等價 a = a*3;
a /= 3 等價 a = a/3;
a %= 3 等價 a = a%3;
a <<= 1 將左邊數的二進制各位向左移1個
a >>= 1 將左邊的二進制數各位向右移1個,移到右端的低位被捨棄
a &= 1 將兩個數按二進制位進行“與”運算。如果兩個相應的二進制位都爲1,則該位的結果值爲1;否則爲0。
a ^= 1 參與運算的兩個量按照對應的位進行異或運算,且0^0→0, 0^1→1, 1^0→1, 1^1→0此外,一個數與0異或仍保持不變,即a^0=a一個數與自己異或結果爲0,即a^a=0;
a |= 1 參與運算的兩個量按照對應位進行或運算,且0|0→0, 0|1→1, 1|0→1, 1|1→1

賦值運算符的應用:
a = b = c = 5 等價於 a = (b = (c = 5));

當a = 12 時請計算 a += a -= a *= a
其實這個式子由於結合性的原因是從右至左計算 則順序是 a *= a ,a -= a,a += a所以無論a是何值結果都是零。  
int a = 3,b = 5 ;
    a ^= b;
    b ^= a;
    a ^= b;//a = 5, b = 3
這樣就實現了a與b的互換

3.邏輯運算符及邏輯表達式

(1)邏輯運算符:&&、||、!

a b a&&B a||b !a
true true true true false
true false false true false
false true false true true
false false false false true

(2)邏輯表達式:用邏輯運算符連接關係表達式或其他任意數值型表達式就構成邏輯表達式。

應用:
     int a = 1,b = 2;
     int c = a++ > 0 || b++ > 0;
     大家可以猜測一下a和b的值,有的同學一定認爲是a = 2, b = 3,但是這是錯誤的當a++>0成立的時候或運算符就不再繼續往下運行,所以最後的答案是a = 2,b = 2。
     int a = 1,b = 2;
     int c = a++ < 0 && b++ < 0;
     當然與運算符也是相同的,當與運算符判斷第一個式子不成立的時候他便不再繼續往下運行,所以最後的答案是a = 2,b = 2。
     !a || a == b 等價於 (!x)||(a == b)

4.條件運算符與條件表達式

(1)條件運算符:由“?”和“:”構成, 並且 是一個三目運算符。

(2)條件表達式:格式一般是 表達式1?表達式2:表達式3。

應用: int i = 1;
      (i>1)? i++:i--;//i = 0

      int a =2,b = 5 , c = 2,d = 3,max;
      max = a>b ? a : c>d ? c : d;//max = 3
      那麼也就是先判斷a>b爲假,執行冒號之後的表達式c>d?c:d,判斷c>d爲假,將冒號後的表達式賦給max。

5.逗號運算符與逗號表達式

(1)逗號運算符:用“,”將兩個表達式連接起來

(2)逗號表達式:一般形式爲 表達式1,表達式2 求解過程爲先求解表達式1再求解表達式2,整個逗號表達式的值爲表達式2的值。

應用:
        a = 3*5,a*4;
        假設a的初值爲3,有同學可能認爲 a = a * 4,則a = 12:另一種則是 a = 3*5 是一個 a*4 是一個。然而這兩種都是錯的。正確的是先求解 a = 3*5 ,再求解 a * 4 ,得60,60作爲整個表達式的值。
        x = (a = 3, 6 * 3);
        先將3賦給a,在將3*6賦給x,最終得到x=18。
        x = a = 3, 6 * a;
        先將3賦給a然後將a賦給x,最後將6*a作爲整個表達式的值。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章