操作符和表示式

2021-07-26 21:34:47 字數 3810 閱讀 2694

一.  操作符

1.      算術操作符

+  -  * /  %

除了%之外其餘的幾個操作符既可以用於計算整型也可以用於計算浮點型資料,%只能計算整型資料,得到的結果是餘數

2.      移位操作符

<> 右移位操作符

《左移時,值最左邊的幾位被丟棄,右邊多出來的幾個空位由0補齊。

>>右移時,從左邊移入新位有兩種方式。一種方案是邏輯移位,左邊移入的數由0填齊;另一種是算術移位,左邊移入的數由原先該值得符號位決定,符號位為1則移入的為均為1,符號位為0則移入的位為0。

警告:標準說明無符號執行的所有的移位操作都是邏輯移位,但是對於有符號值,移位操作取決於自己的編譯器。乙個程式如果使用有符號是數的右移操作,那麼它是不可移植的。

如果出現下面的移位操作:a<

標準說明這類移位是未定義的,所以它由編譯器來決定,這種結果是不可**的,使用這樣的程式也是不可移植的,我們應該避免這類的移位操作。

3.      位操作符

&    |      ^

&與操作符:當兩個位進行與操作時,如果兩個位都是1,結果為1,否則為0;

|或操作符:兩個位中有至少有乙個位為1,結果為1,否則為0;

^異或操作符:兩個位不同時結果為1,如果兩個位相同,結果為0.

上面的三個操作符要求兩個數字整型。

下面介紹幾種位的操縱:

(1)    將某一位置為1

value = value | (1<

(2)    將某一位置為0

value = value &~ (1<

(3)    對某一位進行為1測試

value = value &(1<

如果該位已經是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,因為在不同的編譯器下面結果是不一樣的,感興趣的同學可以上網搜尋或者自己測試分析一下。

操作符和表示式

太簡單了,不解釋。或 左移或右移位操作符,也不想解釋,就是任性。and or xor 與 或 異或 也不講。sizeof 非,自增,減,與,判斷運算元型別長度,求補,自減,加,乘。看一眼就知道了。和位操作符不同的是它是對表示式的判斷,對值不做改變。expression1 expression2 ex...

操作符表示式

一 操作符 1 算數操作符 這都是比較常見的操作符,需要注意的是 的運算元必須是整形。對於 如果兩個運算元是整數執行整除,而只要有浮點數就執行浮點數除法。2.移位操作符 左移,相當於乘法 11 00001011 1 00010110 22 112 1 直接補零 11左移兩位相當於2 2 左移n位相當...

5 表示式和操作符

下面的準則要牢記 有的時候覺得這個規則蠻麻煩的 1 如果左右兩邊是同乙個物件的reference,那麼返回true。這種情況都是false var now new date var arr1 now var arr2 now arr1 arr2 false 2 如果左右兩邊是數字,那麼它們的值相等就...