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

C語言運算符與表達式深度解析:優先級、結合性與各類運算符詳解

     編輯:關於C語言

運算符分類概覽

C 語言擁有極其豐富的運算符體系,這是其功能強大、表達靈活的核心特徵之一。運算符不僅有優先級之分,更具備結合性(左結合/右結合)特性,決定同優先級運算符的運算順序,這在高級語言中較為少見,也增加了理解複雜度。

十大運算符類別

  1. 算術運算符:+ - * / % ++ --(7種)
  2. 關係運算符:> < == >= <= !=(6種)
  3. 邏輯運算符:&& || !(3種)
  4. 位操作運算符:& | ~ ^ << >>(6種)
  5. 賦值運算符:簡單 =、復合算術 += -= *= /= %=、復合位運算 &= |= ^= >>= <<=(共11種)
  6. 條件運算符:?:(三目運算符)
  7. 逗號運算符:,
  8. 指標運算符:* &
  9. 求位元組數運算符:sizeof
  10. 特殊運算符:() [] -> .

優先級與結合性規則

C 語言運算符優先級共 15 級,第1級最高,第15級最低。表達式求值遵循:

  1. 優先級高者先運算。
  2. 同優先級時,按結合性決定順序:
    • 左結合性(自左至右):如算術運算符 + - * / %,例:x - y + z 先算 x - y 再加 z。
    • 右結合性(自右至左):典型如賦值運算符 =,例:x = y = z 先算 y = z 再算 x = (y = z)。單目運算符(++ -- ! ~ * & sizeof)、條件運算符 ?: 亦為右結合。

大量運算符為右結合,閱讀代碼時務必區分,避免誤解。

算術運算符與算術表達式

基本算術運算符特性

運算符目數結合性備註
+雙目右結合加法
-雙目/單目左結合減法/負值
*雙目左結合乘法
/雙目左結合整數相除捨去小數;含實數則結果為雙精度實數
%雙目左結合求餘(模運算),雙方必為整數

整數除法與求餘範例

void main() {
    printf("\n\n%d,%d\n", 20/7, -20/7);      // 輸出 2, -2(捨去小數)
    printf("%f,%f\n", 20.0/7, -20.0/7);  // 輸出 2.857..., -2.857...
}
void main() {
    printf("%d\n", 100 % 3);  // 輸出 1
}

自增/自減運算符(++、--)

單目運算,右結合性。四種形式語義差異極大,易出錯:

形式操作順序參與運算的值
++i先自增1增後的值
--i先自減1減後的值
i++先參與運算,後自增1原值
i--先參與運算,後自減1原值

複雜表達式陷阱範例

void main() {
    int i = 8;
    printf("%d\n", ++i);  // 9
    printf("%d\n", --i);  // 8
    printf("%d\n", i++);  // 8 (輸出後 i=9)
    printf("%d\n", i--);  // 9 (輸出後 i=8)
    printf("%d\n", -i++); // -8 (輸出 -8,i=9)
    printf("%d\n", -i--); // -9 (輸出 -9,i=8)
}
void main() {
    int i = 5, j = 5, p, q;
    p = (i++) + (i++) + (i++);  // p = 5+6+7 = 18? 實際為 15 (三個舊值相加),最後 i=8
    q = (++j) + (++j) + (++j);  // q = 6+7+8 = 21? 實際為 24 (三個新值相加),最後 j=8
    printf("%d,%d,%d,%d", p, q, i, j);
}

關鍵:i++ 在同一表達式多次出現時,行為屬於未定義序列點(C標準未規定求值順序),不同編譯器結果可能不同,實務中應避免此類寫法。

賦值運算符與賦值表達式

簡單賦值 =

  • 形式:變數 = 表達式
  • 功能:計算右側值,賦予左側變數。
  • 右結合性:a = b = c = 5 等價 a = (b = (c = 5))。
  • C 語言將 = 定義為運算符,構成賦值表達式,可出現於表達式合法的任何位置,如 x = (a = 5) + (b = 8) 合法,x 得 13。
  • 加分號即成賦值語句:x = 8; a = b = c = 5;

類型轉換規則(賦值號兩側類型不同時)

  1. 實型 → 整型:捨去小數部份。
  2. 整型 → 實型:數值不變,以浮點形式存儲(小數部份為 0)。
  3. 字符型 → 整型:ASCII 碼值放入整型低 8 位,高 8 位為 0。
  4. 整型 → 字符型:只取低 8 位賦予字符變數。
void main() {
    int a, b = 322;
    float x, y = 8.88;
    char c1 = 'k', c2;
    a = y;   // a = 8
    x = b;   // x = 322.0
    a = c1;  // a = 'k' 的 ASCII 碼 107
    c2 = b;  // c2 = 322 低8位 = 66 ('B')
    printf("%d,%f,%d,%c", a, x, a, c2);
}

復合賦值運算符

形式:變數 雙目運算符= 表達式,等價 變數 = 變數 運算符 表達式。
例:a += 5 ≡ a = a + 5;x *= y + 7 ≡ x = x * (y + 7)。
優點:有利於編譯器優化,生成更高效目標代碼。

逗號運算符與逗號表達式

  • 形式:表達式1, 表達式2
  • 求值:先算表達式1,再算表達式2,整體值為表達式2的值。
  • 可嵌套擴展:exp1, exp2, ..., expn,整體值為 expn。
  • 常用於需順序執行多運算且取最後值的場合,如 for 循環的初始化/遞增部分。
  • 非所有逗號構成逗號表達式:變數宣告、函數參數表中的逗號僅為分隔符。
void main() {
    int a = 2, b = 4, c = 6, x, y;
    y = (x = a + b), (b + c);  // x=6, y=10 (整體值為 b+c)
    printf("y=%d, x=%d", y, x);
}

總結

精通 C 語言運算符需掌握:分類用途、優先級層級、結合性方向、類型轉換規則、副作用運算符(++/--/賦值)的求值順序陷阱。複雜表達式建議拆分為多語句,提升可讀性與可靠性。

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