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

C 語言基礎教程(二):特殊運算子詳解——條件/取址/間接/逗號/sizeof/複合賦值與完整優先序表

     編輯:C 語言基礎

五大特殊運算子

1. 條件運算子 ?: (唯一三元運算子)


expr1 ? expr2 : expr3
/* expr1 真 → expr2 值為整體值;假 → expr3 值為整體值 */
  • 右結合:a ? b : c ? d : e 解析為 a ? b : (c ? d : e)。
  • 可替代簡單 if-else 賦值:max = (a > b) ? a : b;。
  • 型別兼容:expr2、expr3 需可隱性轉換為共同型別 (通常為算術轉換結果)。

範例


int x = 50;
int y = (x > 70) ? 100 : 0;  /* y = 0 */

2. 取址 & 與間接 * (一元運算子,互為逆操作)


int i = 10, j, *p;
p = &i;   /* p 存放 i 的位址 */
j = *p;   /* 透過 p 讀取 i 的值 → j = 10 */
  • & 需左值 (有位址的物件),&10、&(a+b) 非法。
  • * 作用於指標型別,結果為指向型別的左值。

3. 逗號運算子 , (最低優先序,左結合)


expr1, expr2, expr3
/* 依序求值 expr1、expr2、expr3,整體值為 expr3 的值 */

範例


int x = 50;
int y = (x = x - 5, x / 5);  /* x=45, y=9 */
/* 等價於:
   x = x - 5;
   y = x / 5;
*/
  • 常用於 for 迴圈多變數初始化/遞增:for (i=0, j=10; i。
  • 函數引數逗號不是逗號運算子,單純分隔符。

4. sizeof 運算子 (一元,編譯期常數)


sizeof(type)        /* 型別運算元需括號 */
sizeof expression   /* 運算式運算元可無括號 */
  • 回傳 size_t (無號整數),單位為位元組 (byte, 定義為 CHAR_BIT bits,通常 8)。
  • 不評估運算式 (副作用不發生):sizeof(i++) 不會改變 i。
  • 陣列不退化:int a[10]; sizeof(a) == 10*sizeof(int)。

常見大小 (視平台而定)


sizeof(char)     == 1
sizeof(short)    == 2
sizeof(int)      == 2 (16-bit) / 4 (32/64-bit)
sizeof(long)     == 4 (32-bit) / 8 (64-bit Linux)
sizeof(long long)== 8
sizeof(float)    == 4
sizeof(double)   == 8
sizeof(void*)    == 4 (32-bit) / 8 (64-bit)

5. 複合賦值運算子 op=


a += b   ≡   a = a + b   (但 a 僅評估一次)
a &= b   ≡   a = a & b
a /= b-c ≡   a = a / (b - c)  /* 優先序:賦值最低,右側先算 */
  • 適用於所有二元算術、位元、移位運算子。
  • 單次評估 左運算元:a[i++] += 1 中 i++ 只執行一次。

完整優先序表 (15 層,高 → 低)


1  () [] . ->              /* 後綴:函數呼叫、下標、結構成員 */
2  ++ -- + - ~ ! * & sizeof (type)  /* 一元:前綴遞增減、正負、邏輯非、位元非、間接、取址、sizeof、型別轉換 */
3  * / %                   /* 乘法性 */
4  + -                     /* 加法性 */
5  << >>                   /* 移位 */
6  < <= > >=               /* 關係 */
7  == !=                   /* 等值 */
8  &                       /* 位元 AND */
9  ^                       /* 位元 XOR */
10 |                       /* 位元 OR */
11 &&                      /* 邏輯與 (短路) */
12 ||                      /* 邏輯或 (短路) */
13 ?:                      /* 條件 (右結合) */
14 = += -= *= /= %= &= ^= |= <<= >>=  /* 賦值 (右結合) */
15 ,                       /* 逗號 (最低,左結合) */

優先序實戰驗證


/* 原教材範例修正 */
10 > 4 && !(100 < 99) || 3 <= 5
/* 100<99=0 → !0=1 → 10>4=1 → 1&&1=1 → 3<=5=1 → 1||1=1 → 結果 1 */

10 > 4 && !(100 < 99) && 3 <= 5
/* 1 && 1 && 1 = 1 → 結果 1 (原教材誤植為 0) */

避坑指南

  1. 括號消除歧義:寫 (a + b) * c 而非依賴優先序。
  2. 條件運算子嵌套加括號:a ? (b ? c : d) : e。
  3. 逗號運算子僅用於 for/巨集,一般陳述句用分號分隔更清晰。
  4. sizeof 不評估運算式:sizeof(func()) 不會呼叫 func。
  5. 複合賦值左運算元單次評估:p[i++] += 1 安全。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved