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

C語言核心筆記:運算符與表達式深度解析(上)

     編輯:關於C語言

前言

運算符與表達式是 C 語言程式設計的基石。熟練掌握它們的分類、優先順序與類型轉換規則,能讓你寫出更高效、更安全的程式碼。本文系統整理了 C 語言的運算符體系,並透過實例深入剖析隱含與強制類型轉換、算術運算細節以及賦值運算的陷阱。

一、運算符分類全景

C 語言提供了豐富的運算符,按功能可分為以下九大類:

  • 算術運算符:+、-、*、/、%,支援基本數學運算。
  • 關係運算符:>、<、==、!=、>=、<=,用於條件判斷,結果為 0 或 1。
  • 邏輯運算符:&&(邏輯與)、||(邏輯或)、!(邏輯非),具備短路求值特性。
  • 位運算符:&、|、^、~、<<、>>,直接操作二進制位,常用於底層優化。
  • 賦值運算符:=、+=、-=、*= 等,結合運算與賦值,右結合性。
  • 條件運算符:? :,唯一的三目運算符,形成 expr1 ? expr2 : expr3。
  • 逗號運算符:,,將多個表達式串聯,整體值為最後一個表達式的值。
  • 指標運算符:*(間接引用)、&(取址),是指標操作的核心。
  • 其他特殊運算符:sizeof(計算類型/變數佔用位元組)、()(函式呼叫/強制轉型/優先級提升)、[](陣列索引)、->、.(結構體成員存取)。

二、運算優先級與結合性要點

記住核心順序口訣:「單目 > 算術 > 移位 > 關係 > 相等 > 位與 > 位異或 > 位或 > 邏輯與 > 邏輯或 > 條件 > 賦值 > 逗號」。

  1. 函式呼叫、陣列下標、結構成員(() [] -> .)優先級最高,左結合。
  2. 單目運算符(++ -- + - ! ~ * & sizeof、強制轉型)優先級次之,右結合。
  3. 算術運算遵循「先乘除取模,後加減」。
  4. 括號 () 可強制改變順序,建議複雜表達式多加括號提升可讀性。
避坑指南:連續單目運算符易產生歧義,如 a+++b 應寫作 a++ + b 或 a + ++b,利用空格明確意圖。

三、資料類型轉換機制

3.1 強制類型轉換

語法形式:(型別名) 表達式 或 (型別名)(表達式)。注意:轉換只影響當次運算的結果,不改變原變數的型別與數值。

#include <stdio.h>

int main(void) {
    float x = 2.5f, y = 4.8f;
    int m, n;

    m = (int)(x + y);  // 7.3 → 7
    n = (int)x + m / 3; // 2 + 7/3 → 2 + 2 = 4
    m = n % 4;         // 4 % 4 = 0
    x = x + y;         // x 變為 7.3

    printf("m=%d, n=%d, x=%.2f, y=%.2f\n", m, n, x, y);
    return 0;
}

3.2 隱含類型轉換(整數提升與常用算術轉換)

不同型別混合運算時,編譯器自動按「低向高」轉換:

  1. char、short → int(整數提升)。
  2. 若仍型別不同,按 long double > double > float > unsigned long long > long long > unsigned long > long > unsigned int > int 方向提升。

例:int + float → float;unsigned int + int → unsigned int(可能導致負數變大數,需謹慎)。

四、算術運算符與表達式細節

4.1 基本算術運算符

+ - * / % 五大運算符。整數除法截斷向零,% 僅適用於整數,滿足 (a/b)*b + a%b == a。

4.2 自增/自減運算符的前後綴差異

形式操作順序表達式值
++i / --i先增/減,後取值新值
i++ / i--先取值,後增/減舊值

單獨語句中無差異,但嵌入表達式時影響巨大:

int i = 6, j = 6, k = 6, h = 6;
int m = i++;  // m=6, i=7
int n = ++j;  // n=7, j=7
int x = k--;  // x=6, k=5
int y = --h;  // y=5, h=5

五、賦值運算符與賦值表達式

5.1 簡單賦值

  • 左值必須是可修改的左值(變數、解引用指標等)。
  • 優僅高於逗號運算符,右結合:a = b = c = 1 等價 a = (b = (c = 1))。

5.2 複合賦值

op= 形式(+= -= *= /= %= &= |= ^= <<= >>=),x op= y 等價 x = x op (y),但 x 只求值一次(對有副作用的表達式如 a[i++] += 1 有差異)。

5.3 進階賦值陷阱實例

int x = 2, y, z;
x *= 3 + 2;      // x = 2 * (3+2) = 10
x *= y = z = 4;  // y=4, z=4, x = 10 * 4 = 40
x = y = 1;       // x=1, y=1
z = x++ - 1;     // z = 1 - 1 = 0, x 變 2
z = x++ * ++y;   // y=2, z = 2 * 2 = 4, x 變 3

5.4 賦值轉換

賦值號兩側型別不同時,右值隱含轉換為左值型別:

  • 浮點 → 整數:截斷小數部(非四捨五入)。
  • 整數 → 浮點:補 .0,可能丟失精度(int 32 位超過 float 尾數 23 位)。
  • 字元視為小整數(ASCII 碼)參與運算。
int a, b = 322;
float x, y = 8.88f;
char c1 = 'k', c2;  // 'k' = 107

a = y;   // a = 8
x = b;   // x = 322.0
a = c1;  // a = 107
c2 = b;  // c2 = 322 % 256 = 66 ('B')

小結

運算符優先級、類型轉換規則、自增自減副作用、賦值右結合特性是 C 語言新手最易踩坑的地方。建議:

  1. 複雜表達式多用括號,犧牲簡潔換取清晰。
  2. 混合有號/無號、整數/浮點運算時務必明確轉換意圖。
  3. 避免在同一表達式中多次修改同一變數(未定義行為風險)。

下一篇將深入關係、邏輯、位運算與條件運算符的實戰技巧。

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