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

C 語言指標與自增運算子結合的運算順序完整解析

     編輯:C 語言入門

核心問題

在 C 語言中,指標運算子 * 與自增 ++/自減 -- 結合時,運算順序極易混淆。本文系統分析六種經典組合,透過實測程式碼與輸出結果,徹底釐清運算邏輯。

六種組合分類表

編號表達式運算順序返回值副作用
1*p++先取值 *p,再 p++原 *p 值指標後移
2(*p)++先取值 *p,再 *p++原 *p 值所指資料遞增
3*(p++)先取值 *p,再 p++原 *p 值指標後移(同 #1)
4++*p先 *p++,再取值新 *p 值所指資料遞增
5++(*p)先 *p++,再取值新 *p 值所指資料遞增(同 #4)
6*(++p)先 p++,再取值 *p新位置 *p 值指標前移

實測程式碼與輸出分析

#include 

int main() {
    int a[3] = {1, 3, 5};
    int *p = a;
    int i;

    // --- Case 1: *p++ ---
    printf("----------------1----------------\n");
    printf("%d ", *p++);  // 輸出 1
    printf("%d ", *p);    // 輸出 3 (p 已後移)
    for(i=0;i<3;i++) printf("%d ", a[i]); // 陣列未變: 1 3 5
    printf("\n");

    // --- Case 2: (*p)++ ---
    p = a; // 重置
    printf("----------------2----------------\n");
    printf("%d ", (*p)++); // 輸出 1
    printf("%d ", *p);     // 輸出 2 (a[0] 已變 2)
    for(i=0;i<3;i++) printf("%d ", a[i]); // 陣列變: 2 3 5
    printf("\n");

    // --- Case 3: *(p++) ---
    a[0] = 1; p = a; // 重置
    printf("----------------3----------------\n");
    printf("%d ", *(p++)); // 輸出 1
    printf("%d ", *p);     // 輸出 3 (p 已後移)
    for(i=0;i<3;i++) printf("%d ", a[i]); // 陣列未變: 1 3 5
    printf("\n");

    // --- Case 4: ++*p ---
    p = a; // 重置
    printf("----------------4----------------\n");
    printf("%d ", ++*p);   // 輸出 2 (a[0] 先變 2)
    printf("%d ", *p);     // 輸出 2
    for(i=0;i<3;i++) printf("%d ", a[i]); // 陣列變: 2 3 5
    printf("\n");

    // --- Case 5: ++(*p) ---
    p = a; a[0] = 1; // 重置
    printf("----------------5----------------\n");
    printf("%d ", ++(*p)); // 輸出 2
    printf("%d ", *p);     // 輸出 2
    for(i=0;i<3;i++) printf("%d ", a[i]); // 陣列變: 2 3 5
    printf("\n");

    // --- Case 6: *(++p) ---
    p = a; a[0] = 1; // 重置
    printf("----------------6----------------\n");
    printf("%d ", *(++p)); // 輸出 3 (p 先移到 a[1])
    printf("%d ", *p);     // 輸出 3
    for(i=0;i<3;i++) printf("%d ", a[i]); // 陣列未變: 1 3 5
    printf("\n");

    return 0;
}

運算順序核心規則

  1. 後綴運算子優先級最高:p++、(*p)++ 先取值再副作用
  2. 前綴運算子次之:++*p、++(*p) 先副作用再取值
  3. 指標運算子 * 與前綴 ++ 同級,右結合:++*p ≡ ++(*p),*(++p) 先遞增指標
  4. 括號改變結合方向:(*p)++ 強制先解參考再遞增資料

記憶體視覺化示意

運算順序圖解

避坑指南

  • 原則:單一陳述式中避免同一變數多次副作用(C 標準未定義行為)
  • 風格:複雜指標運算拆分為多行,加註釋說明意圖
  • 替代:優先使用索引 a[i++] 而非指標運算,可讀性更高

結語

指標與自增運算子的結合是 C 語言最經典的「陷阱題」之一。透過理解運算子優先級、結合方向與副作用時機三大核心,配合實測驗證,即可徹底掌握這六種組合的行為差異,寫出無歧義、可維護的程式碼。

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