首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言運算符完全手冊:算術、關係、邏輯、位運算與優先級詳解

     編輯:關於C語言

運算符分類總覽

類別運算符說明
算術+加 / 一元正
-減 / 一元負
*乘
/除
%取模 (僅整數)
++自增 (前綴/後綴)
--自減 (前綴/後綴)
關係> >= < <=大於/大於等於/小於/小於等於
== !=等於/不等於
邏輯&&邏輯與 (短路)
||邏輯或 (短路)
!邏輯非
位運算&按位與
|按位或
^按位異或
~按位取反
<< >>左移 / 右移
特殊? :條件運算符 (三目)
,逗號運算符
sizeof類型/變量佔用字節數
& *取址 / 解引用
= += -= *= /= %= ...賦值 / 複合賦值

重點難點深度講解

1. 整數除法與取模陷阱

15 / 2   // = 7 (截斷向零)
15 % 2   // = 1
-15 / 2  // = -7 (C99 標準:向零截斷)
-15 % 2  // = -1 (符號跟隨被除數)

浮點數不能用 %,需用 fmod()。

2. 自增自減:前綴 vs 後綴

int a = 5, b;
b = ++a;  // a=6, b=6 (先增後用)
b = a++;  // a=6, b=5 (先用後增)

// 經典面試題
int x = 5;
x = ++x + x++ + --x; // 未定義行為 (UB)!同一序列點多次修改同一變量
// 切記:不要在一條語句中對同一變量多次 ++/--

3. 賦值中的隱式類型轉換

  • 右值轉換為左值類型:int i = 3.14; // i=3,float f = 5; // f=5.0。
  • 整數除法陷阱: float f = 5 / 2; // f=2.0 → 必須 5.0 / 2 或 (float)5 / 2。
  • 字符參與運算自動轉 ASCII 碼:'c' - 'a' + 'A' = 'C'。

4. 關係與邏輯運算的真值規則

  • C 語言:0 為假,非 0 為真。關係/邏輯運算結果:真為 1,假為 0。
  • 短路求值:&& 左側假則不算右側;|| 左側真則不算右側。利用此特性:if (p != NULL && p->len > 0)。

5. 位運算實戰模式

操作代碼場景
置位x |= (1 << n);開啟標誌、配置寄存器位
清位x &= ~(1 << n);關閉標誌、清除中斷標誌
翻轉x ^= (1 << n);LED 閃爍、協議位翻轉
取位(x >> n) & 1;讀取按鍵、解析協議字段
掩碼x & mask;保留特定位域
乘除 2^nx << n; x >> n;優化編譯器無法優化的定點運算

6. 條件運算符 ? :

max = (a > b) ? a : b;          // 求最大值
grade = (score >= 60) ? 'P' : 'F'; // 分級
// 嵌套慎用,超過兩層改用 if-else

7. 逗號運算符 ,

// 只取最右表達式值
int x = (1, 2, 3);  // x = 3
// 常用於 for 循環多變量初始化/更新
for (i = 0, j = 10; i < j; i++, j--) ...

8. sizeof 運算符

  • 編譯期計算,返回類型/變量佔用字節數 (size_t)。
  • sizeof(int) 需括號;sizeof x 變量可不加括號。
  • 數組參數退化為指針:void f(int a[10]) { sizeof(a); } // = 4/8 (指釖大小)。

Turbo C / 標準 C 運算符優先級與結合性 (從高到低)

優先級運算符說明結合性
1() [] . ->括號、下標、結構成員、指針成員左→右
2! ~ ++ -- + - & * sizeof (type)一元運算符 (邏輯非、取反、自增減、正負、取址、解引用、sizeof、強制轉型)右→左
3* / %乘除模左→右
4+ -加減左→右
5<< >>移位左→右
6< <= > >=關係比較左→右
7== !=相等比較左→右
8&按位與左→右
9^按位異或左→右
10|按位或左→右
11&&邏輯與左→右
12||邏輯或左→右
13? :條件運算符右→左
14= += -= *= /= %= &= ^= |= <<= >>=賦值/複合賦值右→左
15,逗號左→右

避坑金句

  1. 不確定優先級就加括號 — 可讀性第一,編譯器優化不受影響。
  2. 浮點數不直接用 == 比較 — 用 fabs(a-b) < EPS。
  3. 移位位數 ≥ 位寬是 UB — 防禦性編程檢查。
  4. 有符號數右移是算術移位 (補符號位),跨平台可移植代碼用無符號數移位。
  5. 同一序列點多次修改同一變量 = UB — i = i++ + ++i; 絕對禁止。

熟練掌握運算符優先級、類型轉換規則、位運算技巧,是寫出高效、無 Bug、可移植 C 代碼的核心基本功。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved