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