算術操作符
+ - * / %
- 除了%操作符之外,其他的幾個操作符可以作用於整數和浮點數。
- 對於/操作符如果兩個操作數都爲整數,執行整數除法。而只要有浮點數執行的就是浮點數除法。
- % 操作符的兩個操作數必須爲整數。返回的是整除之後的餘數
移位操作符
<< //左移操作符
/*左移操作符移位規則:
左邊拋棄、右邊補0*/
>> //右移操作符
/*右移操作符移位規則:
首先右移運算分兩種:
1. 邏輯移位 左邊用0填充,右邊丟棄
2. 算術移位 左邊用原該值的符號位填充,右邊丟棄
警告⚠: 對於移位運算符,不要移動負數位,這個是標準未定義的。*/
位操作符
& //按位與
| //按位或
^ //按位異或 注:他們的操作數必須是整數。
賦值操作符
賦值操作符可以連續使用
=
+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^=
單目操作符
! //邏輯反操作
- //負值
+ //正值
& //取地址
sizeof //操作數的類型長度(以字節爲單位)
~ //對一個數的二進制按位取反
-- //前置、後置
++ //前置、後置
* //間接訪問操作符 (解引用操作符)
(類型) //強制類型轉換
關係操作符
>
>=
<
<=
!= //用於測試“不相等”
== //用於測試“相等”
邏輯操作符
&& //邏輯與
|| //邏輯或
條件操作符
exp1 ? exp2 : exp3
逗號表達式
exp1, exp2, exp3, …expN
//逗號表達式,就是用逗號隔開的多個表達式。 逗號表達式,從左向右依次執行。整個表達式的結果是最 後一個表達式的結果。
下標引用、函數調用和結構成員
1.[ ] 下標引用操作符 操作數:一個數組名 + 一個索引值
2.( ) 函數調用操作符 接受一個或者多個操作數:第一個操作數是函數名,剩餘的操作數就是傳遞給函數 的參數。
3.訪問一個結構的成員 結構體.成員名 -> 結構體指針->成員名
表達式求值
表達式求值的順序一部分是由操作符的優先級和結合性決定。 同樣,有些表達式的操作數在求值的過程中可能需要轉換爲其他類型。
隱式類型轉換
C的整型算術運算總是至少以缺省整型類型的精度來進行的。爲了獲得這個精度,表達式中的字符和短整型操作數在使用之前被轉換爲普通整型,這種轉換稱爲整型提升
整型提升的意義:
表達式的整型運算要在CPU的相應運算器件內執行,CPU內整型運算器(ALU)的操作數的字節長度 一般就是int的字節長度,同時也是CPU的通用寄存器的長度。
因此,即使兩個char類型的相加,在CPU執行時實際上也要先轉換爲CPU內整型操作數的標準長 度。
通用CPU(general-purpose CPU)是難以直接實現兩個8比特字節直接相加運算(雖然機器指令 中可能有這種字節相加指令)。所以,表達式中各種長度可能小於int長度的整型值,都必須先轉 換爲int或unsigned int,然後才能送入CPU去執行運算。
如何進行整體提升呢?
整形提升是按照變量的數據類型的符號位來提升的
算術轉換
如果某個操作符的各個操作數屬於不同的類型,那麼除非其中一個操作數的轉換爲另一個操作數的類 型,否則操作就無法進行。
操作符的屬性
複雜表達式的求值有三個影響的因素。
- 操作符的優先級
- 操作符的結合性
- 是否控制求值順序。
兩個相鄰的操作符先執行哪個?取決於他們的優先級。如果兩者的優先級相同,取決於他們的結合性。