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

C語言運算符優先級與結合性深度解析:++、*、指針解引用的九種組合實測

     編輯:關於C語言

C語言運算符優先級與結合性深度解析:++、*、指針解引用的九種組合實測

優先級與結合性速查

運算符優先級結合性
後綴 ++ --16 (最高)左→右
前綴 ++ --、一元 * & sizeof15右→左

同優先級(如前綴 ++ 和 *)按結合性右→左結合。

九種組合實測(代碼與結果)

初始:int a[5]={10,11,12,13,14}; int *p=a, *q, b; 每組測試前重置。

#表達式等價解析p 變化b/q 結果說明
1q = p++;q = p; p = p+1;指向 11q 指向 10後綴:先取值再自增
2q = ++p;p = p+1; q = p;指向 11q 指向 11前綴:先自增再取值
3b = *p++;b = *p; p = p+1;指向 11b = 10後綴優先級高,* 取舊地址值
4b = *(p++);同 3指向 11b = 10括號不改變結合性
5b = (*p)++;b = *p; (*p) = (*p)+1;指向 11 (a[0]變11)b = 10解引用後對值後綴自增
6b = *++p;p = p+1; b = *p;指向 11b = 11前綴優先,* 取新地址值
7b = *(++p);同 6指向 11b = 11括號無影響
8b = ++(*p);(*p) = (*p)+1; b = *p;指向 11 (a[0]變11)b = 11前綴自增值,再取值
9b = ++*p;同 8指向 11 (a[0]變11)b = 11右→左結合:先 * 再前綴++

兩大核心口訣

  1. 前綴取新值,後綴取舊值。
  2. 同級 * ++ -- 從右向左結合:*++p ≡ *(++p),++*p ≡ ++(*p)。

完整測試程式


#include 
void init(int a[5]) { a[0]=10; a[1]=11; a[2]=12; a[3]=13; a[4]=14; }
void pr(int n, int *p, int q) { printf("no.%d: p->%d, q->%d\n", n, *p, q); }
void prb(int n, int *p, int b) { printf("no.%d: p->%d, b->%d\n", n, *p, b); }

int main() {
    int a[5], *p, *q, b;
    init(a); p=a; q=p++; pr(1, p, *q);
    init(a); p=a; q=++p; pr(2, p, *q);
    init(a); p=a; b=*p++; prb(3, p, b);
    init(a); p=a; b=*(p++); prb(4, p, b);
    init(a); p=a; b=(*p)++; prb(5, p, b);
    init(a); p=a; b=*++p; prb(6, p, b);
    init(a); p=a; b=*(++p); prb(7, p, b);
    init(a); p=a; b=++(*p); prb(8, p, b);
    init(a); p=a; b=++*p; prb(9, p, b);
    return 0;
}

實戰建議

  • 複雜表達式拆分成多句,可讀性遠高於炫技單行。
  • 代碼審查時遇到 *p++ 等,建議加括號 *(p++) 明確意圖。
  • 嵌入式/系統級代碼常見 *ptr++ = val 寫法,屬慣用模式,熟記即可。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved