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

C語言指標運算符優先級完全解析:(*p)++ vs *p++ vs ++*p

     編輯:關於C語言

核心結論先行

運算式結合方向實際意義影響對象
*p++右向左*(p++)指標 p 移動,解參考值不變
++*p右向左++(*p)指標指向的值遞增,p 不動
(*p)++左向右先解參考,後遞增值指標指向的值遞增(後置),p 不動
*++p右向左*(++p)指標 p 先遞增,再解參考新位址

關鍵規則:* (解參考) 與 ++/-- (前置/後置) 同優先級,**結合方向皆為右向左**。括號 () 可強制改變順序。

實驗驗證

實驗 1:基礎 i++ vs ++i

int i = 1;
printf("i++ = %d\n", i++);  // 輸出 1,i 變 2
printf("i = %d\n", i);      // 輸出 2

int j = 1;
printf("++j = %d\n", ++j);  // 輸出 2,j 變 2
printf("j = %d\n", j);      // 輸出 2

結論:後置 i++ 遇分號才生效;前置 ++j 立即生效。printf 參數求值順序依編譯器而定(通常右向左),切勿在單一語句中對同一變數多次副作用操作(未定義行為)。

實驗 2:*p++ 解析

int i = 10;
int *p = &i;
int v = *p++;  // 等價 v = *(p++)

printf("*p = %d\n", *p);  // 輸出 10 (p 已指向下一個位址,內容未知/垃圾值)
printf("v = %d\n", v);    // 輸出 10 (舊位址的值)
printf("i = %d\n", i);    // 輸出 10 (i 未變)

現象:++ 作用於 p,* 取舊位址值。p 移動,i 不變。

實驗 3:++*p 解析

int i = 10;
int *p = &i;
int v = ++*p;  // 等價 v = ++(*p)

printf("*p = %d\n", *p);  // 輸出 11
printf("v = %d\n", v);    // 輸出 11
printf("i = %d\n", i);    // 輸出 11 (i 被修改)

現象:++ 作用於 *p (即 i),p 不動。

實驗 4:*++p 解析

int arr[2] = {10, 20};
int *p = arr;
int v = *++p;  // 等價 v = *(++p)

printf("*p = %d\n", *p);  // 輸出 20 (p 指向 arr[1])
printf("v = %d\n", v);    // 輸出 20

現象:p 先遞增,再解參考新位址。

實驗 5:(*p)++ 解析

int i = 10;
int *p = &i;
int v = (*p)++;  // 後置遞增值

printf("*p = %d\n", *p);  // 輸出 11
printf("v = %d\n", v);    // 輸出 10 (舊值)
printf("i = %d\n", i);    // 輸出 11

現象:值遞增但回傳舊值,p 不動。

記憶口訣

  1. 看誰緊貼 ++:*p++ → p++ 緊貼 → p 動;++*p → *p 緊貼 →值動。
  2. 括號最高優先:(*p)++ 強制先解參考,再對值後置遞增。
  3. 前置在左,後置在右:++*p 前置在 * 左;*p++ 後置在 p 右。

實務建議

  • 避免複雜組合:拆分為多行,如 v = *p; p++; 或 ++(*p);,可讀性大增
  • 善用 const:const int *p (值不可改) vs int *const p (指標不可改),編譯器會攔截錯誤
  • 陣列遍歷慣用語:while (*p) { ...; p++; } 或 for (; *p; p++),語意清晰

總結

指標運算符優先級看似迷霧,實則遵循簡單規則:**同級右結合,括號改順序**。掌握 *p++ (移指標)、++*p (改值)、(*p)++ (改值後置)、*++p (移指標再取值) 四種核心模式,即可應對 99% 場景。實務中請寫給人看的代碼——適度使用括號、拆分語句、加上註解,比炫技巧更專業。

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