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

C語言運算子結合性深度解析:為何 *p++ 等價於 *(p++)?

     編輯:C 語言問答

從「結合性」到「優先級」的關鍵釐清

初學者常混淆優先級與結合性:

  • 優先級:決定「誰先跟誰綁」,如 * 和 ++ 誰優先結合運算元。
  • 結合性:當同優先級運算子相鄰時,決定「從左還是從右」組合,如 a - b - c 是 (a-b)-c 還是 a-(b-c)。

後綴 ++ 優先級 > 一元 *

在 C 標準中,後綴運算子(++, --, (), [], ., ->)擁有最高優先級且左結合。一元運算子(*, &, +, -, ~, !)優先級較低且右結合。

推導 *p++

  1. 掃描到 p(運算元)。
  2. 遇到 ++(後綴),優先級最高,結合 p → (p++)。
  3. 剩下 * 作用於 (p++) 的結果 → *(p++)。

結論:*p++ 絕對等價於 *(p++)。

語義差異對照表

表達式操作順序回傳值副作用
*p++ / *(p++)1. 取 p 指向的值
2. p 遞增
遞增前 p 指向的值p 指向下一個位置
(*p)++1. 取 p 指向的值
2. 該值遞增
遞增前 *p 的值*p 數值加 1
*++p1. p 遞增
2. 取新位置的值
遞增後 p 指向的值p 指向下一個位置
++*p1. 取 p 指向的值
2. 該值遞增
遞增後 *p 的值*p 數值加 1

實務建議

  • 避免在同一表達式混用指標移動與解參考遞增,拆成兩行更清晰。
  • 需移動指標並取值:val = *p; p++; 或 val = *p++;(慣用語)。
  • 需修改指向的值:(*p)++; 或 ++*p;。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved