操作符和表达式
一.??操作符
1.??????算術操作符
+? -? *?/? %
除了%之外其余的幾個操作符既可以用于計算整型也可以用于計算浮點型數據,%只能計算整型數據,得到的結果是余數
2.??????移位操作符
<<??? 左移位操作符???? >>?右移位操作符
<<左移時,值最左邊的幾位被丟棄,右邊多出來的幾個空位由0補齊。
>>右移時,從左邊移入新位有兩種方式。一種方案是邏輯移位,左邊移入的數由0填齊;另一種是算術移位,左邊移入的數由原先該值得符號位決定,符號位為1則移入的為均為1,符號位為0則移入的位為0。
警告:
標準說明無符號執行的所有的移位操作都是邏輯移位,但是對于有符號值,移位操作取決于自己的編譯器。一個程序如果使用有符號是數的右移操作,那么它是不可移植的。
如果出現下面的移位操作:a<<-5
標準說明這類移位是未定義的,所以它由編譯器來決定,這種結果是不可預測的,使用這樣的程序也是不可移植的,我們應該避免這類的移位操作。
3.??????位操作符
&??? |????? ^
&與操作符:當兩個位進行與操作時,如果兩個位都是1,結果為1,否則為0;
|或操作符:兩個位中有至少有一個位為1,結果為1,否則為0;
^異或操作符:兩個位不同時結果為1,如果兩個位相同,結果為0.
上面的三個操作符要求兩個數位整型。
?
下面介紹幾種位的操縱:
(1)????將某一位置為1
value = value | (1<<number)
(2)????將某一位置為0
value = value &~ (1<<number)???????? ~是取反的意思
(3)????對某一位進行為1測試
value = value &(1<<number)
如果該位已經是1,則表達式的結果為非0值
4.??????賦值
=
賦值操作符的結合性是從右到左,所以下面的這個語句a = x = y + 3;他的意思和下面的語句是等價的a = (x = y + 3);
復合賦值符
+=??? -=???? *=?/=? %=?
<<=??>>=?? &=? ^=? |=
5.??????單目操作符
!? ++? -?&? sizeof
~? --? +?*? (類型)
!操作符,對它的操作數進行邏輯反操作,如果操作數為真,其結果為假,如果操作數為假,其結果為真。這個操作數的結果只有兩個值,0或1。
~操作符,對整類型的操作數進行求補操作,操作數中原先所有為1的位置為0,為0的位置為1。
-產生的操作值為負值
&操作數產生它的操作數的地址
*操作符是間接訪問操作符,它與指針一起使用,用于訪問指針所指向的值。sizeof操作符判斷它的操作數的類型長度,以字節為單位表示。
(類型)操作符是強制類型轉換,它用于顯式的將表達式的值轉換為另外的類型。
++和—操作符,注意前置和后置就好,前置是先計算后使用,后置是先使用后計算
6.??????關系操作符
>??? >=???<??? <=??? !=???==???
需要注意的是,這些操作符產生的結果不是布爾值,而是整型值,如果對返回1,如果不對返回的是0。這里我們在使用==操作符的時候,應該特別注意的是不要把==寫成了=。
7.??????邏輯操作符
&&??? ||
&& 邏輯與?? expressionl1? &&?expression2? 兩真才真,一假就假
一個有趣的點就是,&&的優先級比<,>等的優先級低,所以如果是下面的表達式, a>5 && a<10,則實際的求值順序是下面這個樣子的:(a>5)&& (a<10),但是有一點需要引起大家的注意,就是如果a>5這個表達式的結果為假,那么后面的a<10根本不進行判斷,并且整個表達式的結果為假。
|| 邏輯或??? expressionl1? ||??expression2? 一真就真,兩假才假
邏輯或操作符也有一個有趣的特點就是,如果第一個表達式的結果是真,那么第二個表達式也不進行求解,并且整個表達式的結果為真。
上面的這兩種行為被稱為“短路求值”
8.??????條件操作符
expressionl1 ? expression2 : expression3??? 操作的過程是,首先判斷expressionl1的值是不是真,如果為真則執行expression2,如果為假則執行expression3
9.??????逗號操作符
expressionl1 , expression2 , …… , expression? 操作的過程是從左到右依次對各個表達式進行求值,整個表達式的值就是最后一個表達式的值。
10.??下標引用、函數調用和結構成員
下標引用主要出現在數組中arry[下標]? 和? *( arry + (下標) )
函數調用操作符 就是在一個函數中調用另一個函數
結構成員 是在結構體中使用 . 和 –> 用于訪問結構體的一個成員,我們需要注意一點是,當我們訪問結構體的一個成員的時候,我們已經知道這個結構體了,我們可以使用例如s.a,但是如果我們此時擁有的是指向該結構體的一個指針而不是這個結構體,那么我們應該使用的是 -> 。
二.??布爾值
C語言不具備顯示的布爾值,但是可以用整數來代替,其規則是0是假,非0為真
三.??左值和右值
左值是放在賦值符左邊的東西,右值就是放在賦值符號的右邊的東西。
簡單的理解一下就是左值就是這個變量本身,右值則是變量的內容,以后還會詳細介紹關于左值和右值的理解
四.??表達式求值
1.??????隱式類型轉換
C語言一般為了獲得一個精度,表達式中的字符型和短整型首先被轉換成普通的整型,然后再進行計算,這種方式被稱為整型提升。如下面的求值例子:
char a,b,c;
a = b + c;
b和c的值被提升為普通整型,然后進行加法運算,加法運算的結果將被截短,然后再存儲在a中。
2.??????算術轉換
如果某個操作符的各個操作數的類型不一樣,那么除非其中一個轉換成另一個,否則無法計算,下面的層次被稱為尋常算術轉換。
? long double
? double
? float
? usinged long int
? long int
? usinged int
? int
如果某個操作數的類型在上面的列表排名較低,那么它首先將轉換成比它排名高的,然后再進行計算。
3.??????操作符的屬性
復雜表達式的求值順序是由3個因素決定的:操作符的優先級、操作符的結核性和操作符是否控制執行的順序。
下表顯示了各個操作符的優先級
4.??????優先級和求值的順序
兩個相鄰的操作符的執行順序由它們的優先級決定,如果它們的優先級相同,它們的執行順序由它們的結合性決定。除此之外,編譯器可以自由的決定使用任何順序對表達式進行求值,只要它不違背逗號、&&、||、和?:操作符所施加的操作。
看下面的語句:
a * b + c * d + e * f
這里并沒有任何規則要求所有的乘法首先進行,也沒有規定這幾個乘法之間誰先執行。優先級在這里沒有作用,優先級只對相鄰的操作符的執行順序起作用。
下面的這條語句是危險的:c + --c,因為在不同的編譯器下面結果是不一樣的,感興趣的同學可以上網搜索或者自己測試分析一下。
?
?
總結
- 上一篇: 游戏个性签名大全
- 下一篇: 摩尔庄园手游孔明灯在哪里?