
C 速查手冊
1.6 運算子
C 語言提供多樣、功能完整的運算子 (operator) ,依運算子結合後運算的優先次序,如下列表
| 運算子 | 結合規則 |
|---|---|
| () [] -> . | 左到右 |
| ! ~ ++ -- + - * & (type) sizeof | 右到左 |
| * / % | 左到右 |
| + - | 左到右 |
| << >> | 左到右 |
| < <= > >= | 左到右 |
| == != | 左到右 |
| & | 左到右 |
| ^ | 左到右 |
| | | 左到右 |
| && | 左到右 |
| || | 左到右 |
| ?: | 右到左 |
| = += -= /= %= &= | 右到左 |
| ^= |= <<= >>= | 右到左 |
| , | 左到右 |
依功能區分,可分為
- 算術運算子
- 遞增及遞減運算子
- 關係運算子
- 邏輯運算子
- 位元運算子
- cast 運算子
- sizeof 運算子
- 指派運算子
- 條件運算子
- 跟指標有關的運算子
- 跟結構有關的運算子
- 跟陣列有關的運算子
- 小括號跟逗點
算術運算子
C 語言的算術運算子包含加、減、乘、除、取餘數,皆需兩個運算元 (operand) 構成運算式 (expression) ,如下列表
| 運算子 | 功能 | 範例 |
|---|---|---|
| + | 加 | a + b |
| - | 減 | a - b |
| * | 乘 | a * b |
| / | 除 | a / b |
| % | 取餘數 | a % b |
遞增及遞減運算子
遞增及遞減則為單元運算子,也就是說只需要一個運算元即構成運算式,但在運算元有前後的差別
| 運算子 | 功能 | 範例 |
|---|---|---|
| ++ | 前遞增 | ++a |
| ++ | 後遞增 | a++ |
| -- | 前遞減 | --a |
| -- | 後遞減 | a-- |
關係運算子
C 語言的關係運算子都需要兩個運算元,包含小於、小於等於、大於、大於等於,另外有兩個測試相等性的運算子,運算結果會以 0 表示假, 1 表示真
| 運算子 | 功能 | 範例 |
|---|---|---|
| < | 小於 | a < b |
| <= | 小於等於 | a <= b |
| > | 大於 | a > b |
| >= | 大於等於 | a >= b |
| == | 相等 | a == b |
| != | 不等 | a != b |
邏輯運算子
C 語言的邏輯運算子包含邏輯非,施用於單一運算元,其他邏輯且、或都需要兩個運算元
| 運算子 | 功能 | 範例 |
|---|---|---|
| ! | 非 | !a |
| && | 且 | a && b |
| || | 或 | A || b |
位元運算子
C 亦提供給整數型態進行逐位元運算的運算子,例如某 16 位元整數如下
取其補數該整數會變成
這樣的位元補數運算子在 C 是用 ~ 運算子,全部的位元運算子如下表
| 運算子 | 結合規則 |
|---|---|
| () [] -> . | 左到右 |
| ! ~ ++ -- + - * & (type) sizeof | 右到左 |
| * / % | 左到右 |
| + - | 左到右 |
| << >> | 左到右 |
| < <= > >= | 左到右 |
| == != | 左到右 |
| & | 左到右 |
| ^ | 左到右 |
| | | 左到右 |
| && | 左到右 |
| || | 左到右 |
| ?: | 右到左 |
| = += -= /= %= &= | 右到左 |
| ^= |= <<= >>= | 右到左 |
| , | 左到右 |
cast 運算子
C 語言的 cast 運算子的用途作為強迫轉型,基本格式下
這樣子 operand 會被強迫轉換型態為小括弧中的 type 。
sizeof 運算子
C 語言的 sizeof 運算子的用途作為計算資料型態 (data type) 所佔的位元組數,其中的資料型態所括基本資料型態及衍生資料型態,基本格式如下
指派運算子
C 語言最基本的指派運算子為單一個等號 = ,這是用來將等號右邊的值拷貝給給左邊的變數 (variable) 資料。等號也可以跟其他運算子合用,會直接將結果儲存到原變數之中,如
| 運算子 | 功能 | 範例 |
|---|---|---|
| = | 指派 | a = b |
| += | 相加同時指派 | a += b |
| -= | 相減同時指派 | a -= b |
| /= | 相除同時指派 | a /= b |
| %= | 取餘數同時指派 | a %= b |
| &= | 位元且同時指派 | a &= b |
| ^= | 位元互斥或同時指派 | a ^= b |
| |= | 位元或同時指派 | a |= b |
| <<= | 位元向左位移同時指派 | a <<= b |
| >>= | 位元向右位移同時指派 | a >>= b |
條件運算子
條件運算子是 C 語言裡唯一的三元運算子 ?: ,需要三個運算元,三者均可為運算式,形式如下
若運算式 expr1 為真,運算結果會是運算式 expr2 計算出的值,若為假,運算結果則是運算式 expr3 計算出的值。
跟指標有關的運算子
C 語言中宣告指標變數的單元運算子為星號 * ,這與乘法運算子相同,編譯器 (compiler) 會依前後文判斷星號作為乘法運算子還是宣告指標變數。另外,星號也作為單元的取值或反參考運算子。
當宣告指標變數後,要賦予指標變數某資料的位址,就要用單元的取址運算子 & ,這與位元運算子中的且是相同的,編譯器也會依前後文來判斷用途。
跟結構有關的運算子
C 語言中跟結構 (structure) 有關的運算子有兩個,結構成員運算子 . ,這跟小數點一樣,由結構名稱存取結構成員之用。另外一個是結構指標運算子 -> ,這是一個減號緊接著一個大於符號,可以讓指向結構的指標直接存取結構成員。
跟陣列有關的運算子
C 語言中跟陣列 (array) 有關的運算子就是中括弧 [] ,利用索引來存取陣列中的元素。
小括號、逗點與分號
C 語言中小括號 () 運算的優先次序最高,小括號可以用為夾住任何運算式,使該運算式可以優先被計算,另外,小括號也用在函數之中,定義或呼叫函數的參數列也是用小括號圍起來的。
逗號 , 運算的優先次序最低,因為逗號只是在同一陳述 (statement) 中做分隔用。
分號 ; 沒有計算優先次序的高低,因為分號用為陳述結束的標記。
