- C 程式設計教程
- C - 首頁
- C 語言基礎
- C - 概述
- C - 特性
- C - 歷史
- C - 環境設定
- C - 程式結構
- C - Hello World
- C - 編譯過程
- C - 註釋
- C - 詞法單元
- C - 關鍵字
- C - 識別符號
- C - 使用者輸入
- C - 基本語法
- C - 資料型別
- C - 變數
- C - 整數提升
- C - 型別轉換
- C - 型別強制轉換
- C - 布林型別
- C 語言中的常量和字面量
- C - 常量
- C - 字面量
- C - 轉義序列
- C - 格式說明符
- C 語言中的運算子
- C - 運算子
- C - 算術運算子
- C - 關係運算符
- C - 邏輯運算子
- C - 位運算子
- C - 賦值運算子
- C - 一元運算子
- C - 自增和自減運算子
- C - 三元運算子
- C - sizeof 運算子
- C - 運算子優先順序
- C - 其他運算子
- C 語言中的決策
- C - 決策
- C - if 語句
- C - if...else 語句
- C - 巢狀 if 語句
- C - switch 語句
- C - 巢狀 switch 語句
- C 語言中的迴圈
- C - 迴圈
- C - while 迴圈
- C - for 迴圈
- C - do...while 迴圈
- C - 巢狀迴圈
- C - 無限迴圈
- C - break 語句
- C - continue 語句
- C - goto 語句
- C 語言中的函式
- C - 函式
- C - 主函式
- C - 按值呼叫函式
- C - 按引用呼叫函式
- C - 巢狀函式
- C - 可變引數函式
- C - 使用者自定義函式
- C - 回撥函式
- C - 返回語句
- C - 遞迴
- C 語言中的作用域規則
- C - 作用域規則
- C - 靜態變數
- C - 全域性變數
- C 語言中的陣列
- C - 陣列
- C - 陣列的特性
- C - 多維陣列
- C - 將陣列傳遞給函式
- C - 從函式返回陣列
- C - 變長陣列
- C 語言中的指標
- C - 指標
- C - 指標和陣列
- C - 指標的應用
- C - 指標運算
- C - 指標陣列
- C - 指向指標的指標
- C - 將指標傳遞給函式
- C - 從函式返回指標
- C - 函式指標
- C - 指向陣列的指標
- C - 指向結構體的指標
- C - 指標鏈
- C - 指標與陣列
- C - 字元指標和函式
- C - 空指標
- C - void 指標
- C - 野指標
- C - 解引用指標
- C - 近指標、遠指標和巨指標
- C - 指標陣列的初始化
- C - 指標與多維陣列
- C 語言中的字串
- C - 字串
- C - 字串陣列
- C - 特殊字元
- C 語言中的結構體和聯合體
- C - 結構體
- C - 結構體和函式
- C - 結構體陣列
- C - 自引用結構體
- C - 查詢表
- C - 點 (.) 運算子
- C - 列舉 (或 enum)
- C - 結構體填充和打包
- C - 巢狀結構體
- C - 匿名結構體和聯合體
- C - 聯合體
- C - 位域
- C - Typedef
- C 語言中的檔案處理
- C - 輸入和輸出
- C - 檔案 I/O (檔案處理)
- C 預處理器
- C - 預處理器
- C - 編譯指示
- C - 預處理器運算子
- C - 宏
- C - 標頭檔案
- C 語言中的記憶體管理
- C - 記憶體管理
- C - 記憶體地址
- C - 儲存類別
- 其他主題
- C - 錯誤處理
- C - 可變引數
- C - 命令執行
- C - 數學函式
- C - static 關鍵字
- C - 隨機數生成
- C - 命令列引數
- C 程式設計資源
- C - 問題與解答
- C - 快速指南
- C - 速查表
- C - 有用資源
- C - 討論
C - 運算子
運算子是一個符號,它告訴編譯器執行特定的數學或邏輯函式。根據定義,運算子對運算元執行某些操作。運算子需要一個或多個運算元才能執行操作。
根據執行操作所需的運算元數量,運算元稱為一元運算子、二元運算子或三元運算子。它們分別需要一個、兩個或三個運算元。
一元運算子 - ++(增量)、--(減量)、!(非)、~(補碼)、&(地址)、*(解引用)
二元運算子 - 除了 ! 之外的算術運算子、邏輯運算子和關係運算符
三元運算子 - ? 運算子
C 語言富含內建運算子,並提供以下型別的運算子:
- 算術運算子
- 關係運算符
- 邏輯運算子
- 位運算子
- 賦值運算子
- 其他運算子
在本章中,我們將深入瞭解每個運算子的工作方式。在這裡,您將獲得所有這些章節的概述。此後,我們為每個運算子提供了獨立的章節,其中包含大量示例,以展示這些運算子在C 程式設計中的工作方式。
算術運算子
我們最熟悉算術運算子。這些運算子用於對運算元執行算術運算。最常見的算術運算子是加法 (+) 、減法 (-) 、乘法 (*) 和除法 (/) 。
此外,模數 (%) 是一個重要的算術運算子,它計算除法運算的餘數。算術運算子用於構成算術表示式。這些運算子本質上是二元的,因為它們需要兩個運算元,並且它們對數字運算元進行操作,這些運算元可以是數字字面量、變數或表示式。
例如,請檢視以下簡單表示式:
a + b
這裡“+”是一個算術運算子。我們將在後續章節中詳細學習 C 語言中的算術運算子。
下表顯示了 C 語言支援的所有算術運算子。假設變數A為 10,變數B為 20,則:
| 運算子 | 描述 | 示例 |
|---|---|---|
| + | 將兩個運算元相加。 | A + B = 30 |
| - | 從第一個運算元中減去第二個運算元。 | A − B = -10 |
| * | 將兩個運算元相乘。 | A * B = 200 |
| / | 將分子除以分母。 | B / A = 2 |
| % | 模數運算子和整數除法後的餘數。 | B % A = 0 |
| ++ | 自增運算子將整數值增加 1。 | A++ = 11 |
| -- | 自減運算子將整數值減少 1。 | A-- = 9 |
關係運算符
我們在學習中學數學時也熟悉關係運算符。這些運算子用於比較兩個運算元並返回布林值(真或假)。它們用於布林表示式。
最常見的關係運算符是小於 (<)、大於 (>)、小於等於 (<=)、大於等於 (>=)、等於 (==) 和不等於 (!=) 。關係運算符也是二元運算子,需要兩個數字運算元。
例如,在布林表示式中:
a > b
這裡“>”是一個關係運算符。
我們將在後續章節中詳細學習關係運算符及其用法。
| 運算子 | 描述 | 示例 |
|---|---|---|
| == | 檢查兩個運算元的值是否相等。如果相等,則條件為真。 | (A == B) 為假。 |
| != | 檢查兩個運算元的值是否相等。如果值不相等,則條件為真。 | (A != B) 為真。 |
| > | 檢查左側運算元的值是否大於右側運算元的值。如果大於,則條件為真。 | (A > B) 為假。 |
| < | 檢查左側運算元的值是否小於右側運算元的值。如果小於,則條件為真。 | (A < B) 為真。 |
| >= | 檢查左側運算元的值是否大於或等於右側運算元的值。如果大於或等於,則條件為真。 | (A >= B) 為假。 |
| <= | 檢查左側運算元的值是否小於或等於右側運算元的值。如果小於或等於,則條件為真。 | (A <= B) 為真。 |
邏輯運算子
這些運算子用於組合兩個或多個布林表示式。我們可以透過使用這些運算子將布林表示式組合起來形成複合布林表示式。邏輯運算子的一個示例如下:
a >= 50 && b >= 50
最常見的邏輯運算子是 AND (&&) 、OR (||) 和 NOT (!) 。邏輯運算子也是二元運算子。
| 運算子 | 描述 | 示例 |
|---|---|---|
| && | 稱為邏輯 AND 運算子。如果兩個運算元均非零,則條件為真。 | (A && B) 為假。 |
| || | 稱為邏輯 OR 運算子。如果兩個運算元中的任何一個非零,則條件為真。 | (A || B) 為真。 |
| ! | 稱為邏輯 NOT 運算子。它用於反轉其運算元的邏輯狀態。如果條件為真,則邏輯 NOT 運算子將使其變為假。 | !(A && B) 為真。 |
我們將在後續章節中詳細討論 C 語言中的邏輯運算子。
位運算子
位運算子允許您操作儲存在計算機記憶體中的資料。這些運算子用於對運算元執行位級操作。
最常見的位運算子是 AND (&) 、OR (|) 、XOR (^) 、NOT (~) 、左移 (<<) 和右移 (>>) 。這裡“~”運算子是一元運算子,而大多數其他位運算子本質上是二元的。
位運算子對位進行操作並執行逐位操作。&、| 和 ^ 的真值表如下:
| p | q | p & q | p | q | p ^ q |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
| 1 | 0 | 0 | 1 | 1 |
假設 A = 60 且 B = 13,以二進位制格式表示,它們將如下所示:
A = 0011 1100
B = 0000 1101
------------------------
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
~A = 1100 0011
下表列出了 C 語言支援的位運算子。假設變數 'A' 的值為 60,變數 'B' 的值為 13,則 −
| 運算子 | 描述 | 示例 |
|---|---|---|
| & | 按位與運算子:如果兩個運算元中都存在某個位,則將其複製到結果中。 | (A & B) = 12,即 0000 1100 |
| | | 按位或運算子:如果兩個運算元中任意一個存在某個位,則將其複製到結果中。 | (A | B) = 61,即 0011 1101 |
| ^ | 按位異或運算子:如果某個位在一個運算元中存在,但在另一個運算元中不存在,則將其複製到結果中。 | (A ^ B) = 49,即 0011 0001 |
| ~ | 按位取反運算子:是一元運算子,作用是“翻轉”位。 | (~A ) = ~(60),即 -0111101 |
| << | 左移運算子:左運算元的值向左移動由右運算元指定的位數。 | A << 2 = 240,即 1111 0000 |
| >> | 右移運算子:左運算元的值向右移動由右運算元指定的位數。 | A >> 2 = 15,即 0000 1111 |
賦值運算子
顧名思義,賦值運算子在 C 語言中“賦值”或設定一個命名變數的值。這些運算子用於為變數賦值。“=”符號在 C 語言中定義為賦值運算子,但不要將其與數學中的用法混淆。
下表列出了 C 語言支援的賦值運算子 −
| 運算子 | 描述 | 示例 |
|---|---|---|
| = | 簡單賦值運算子:將右側運算元的值賦給左側運算元。 | C = A + B 將 A + B 的值賦給 C |
| += | 加法賦值運算子:將右側運算元加到左側運算元上,並將結果賦給左側運算元。 | C += A 等價於 C = C + A |
| -= | 減法賦值運算子:從左側運算元中減去右側運算元,並將結果賦給左側運算元。 | C -= A 等價於 C = C - A |
| *= | 乘法賦值運算子:將右側運算元乘以左側運算元,並將結果賦給左側運算元。 | C *= A 等價於 C = C * A |
| /= | 除法賦值運算子:將左側運算元除以右側運算元,並將結果賦給左側運算元。 | C /= A 等價於 C = C / A |
| %= | 取模賦值運算子:使用兩個運算元進行取模運算,並將結果賦給左側運算元。 | C %= A 等價於 C = C % A |
| <<= | 左移賦值運算子。 | C <<= 2 等價於 C = C << 2 |
| >>= | 右移賦值運算子。 | C >>= 2 等價於 C = C >> 2 |
| &= | 按位與賦值運算子。 | C &= 2 等價於 C = C & 2 |
| ^= | 按位異或賦值運算子。 | C ^= 2 等價於 C = C ^ 2 |
| |= | 按位或賦值運算子。 | C |= 2 等價於 C = C | 2 |
因此,表示式“a = 5”將 5 賦給變數“a”,但“5 = a”在 C 語言中是無效的表示式。
“=”運算子與其他算術、關係和位運算子結合,形成了增強賦值運算子。例如,+= 運算子用作加法賦值運算子。最常見的賦值運算子是 =、+=、-=、*=、/=、%=、&=、|= 和 ^=。
其他運算子 ↦ sizeof & 三元運算子
除了上面討論的運算子之外,C 語言還支援其他一些重要的運算子,包括 **sizeof** 和 **? :**。
| 運算子 | 描述 | 示例 |
|---|---|---|
| sizeof() | 返回變數的大小。 | sizeof(a),其中 a 為整數,將返回 4。 |
| & | 返回變數的地址。 | &a; 返回變數的實際地址。 |
| * | 指向變數的指標。 | *a; |
| ? : | 條件表示式。 | 如果條件為真 ? 則值為 X : 否則值為 Y |
C 語言中運算子的優先順序
運算子優先順序決定了表示式中項的組合方式,並決定了表示式的求值方式。某些運算子比其他運算子具有更高的優先順序;例如,乘法運算子的優先順序高於加法運算子。
例如,x = 7 + 3 * 2; 這裡,x 被賦值為 13,而不是 20,因為運算子 * 的優先順序高於 +,所以它首先與 3*2 相乘,然後加到 7 中。
這裡,優先順序最高的運算子出現在表的最上面,優先順序最低的出現在最下面。在一個表示式中,優先順序較高的運算子將首先被求值。
| 類別 | 運算子 | 結合性 |
|---|---|---|
| 字尾 | () [] -> . ++ - - | 從左到右 |
| 一元 | + - ! ~ ++ -- (type)* & sizeof | 從右到左 |
| 乘法 | * / % | 從左到右 |
| 加法 | + - | 從左到右 |
| 移位 | << >> | 從左到右 |
| 關係 | < <= > >= | 從左到右 |
| 相等 | == != | 從左到右 |
| 按位與 | & | 從左到右 |
| 按位異或 | ^ | 從左到右 |
| 按位或 | | | 從左到右 |
| 邏輯與 | && | 從左到右 |
| 邏輯或 | || | 從左到右 |
| 條件 | ?: | 從右到左 |
| 賦值 | = += -= *= /= %=>>= <<= &= ^= |= | 從右到左 |
| 逗號 | , | 從左到右 |
C 語言中的其他運算子
除了上述運算子之外,C 語言中還有一些其他運算子,它們不屬於上述任何類別。例如,自增和自減運算子 (++ 和 --) 本質上是一元運算子,可以作為運算元的字首或字尾出現。
與記憶體位置地址一起工作的運算子,例如地址運算子 (&) 和解引用運算子 (*)。sizeof 運算子 (sizeof) 似乎是一個關鍵字,但實際上是一個運算子。
C 語言還具有型別轉換運算子 (()),它強制更改運算元的型別。在處理派生 資料型別(如 結構體 和 聯合體)時,C 語言還使用點 (.) 和箭頭 (->) 符號作為運算子。
C99 版本的 C 語言引入了一些額外的運算子,例如 auto、decltype。
C 語言中的單個表示式可能包含多種型別的多個運算子。 C 編譯器 根據運算子的優先順序和結合性來計算其值。例如,在以下表達式中 −
a + b * c
乘法運算子優先於加法運算子。
我們將在後續章節中透過示例瞭解這些特性。
許多其他程式語言(稱為 C 家族語言,例如 C++、C#、Java、Perl 和 PHP)的運算子命名法與 C 語言相似。