| 運算符 | 優先級 | 結合性 |
|---|---|---|
| 後綴 ++ -- | 16 (最高) | 左→右 |
| 前綴 ++ --、一元 * & sizeof | 15 | 右→左 |
同優先級(如前綴 ++ 和 *)按結合性右→左結合。
初始:int a[5]={10,11,12,13,14}; int *p=a, *q, b; 每組測試前重置。
| # | 表達式 | 等價解析 | p 變化 | b/q 結果 | 說明 |
|---|---|---|---|---|---|
| 1 | q = p++; | q = p; p = p+1; | 指向 11 | q 指向 10 | 後綴:先取值再自增 |
| 2 | q = ++p; | p = p+1; q = p; | 指向 11 | q 指向 11 | 前綴:先自增再取值 |
| 3 | b = *p++; | b = *p; p = p+1; | 指向 11 | b = 10 | 後綴優先級高,* 取舊地址值 |
| 4 | b = *(p++); | 同 3 | 指向 11 | b = 10 | 括號不改變結合性 |
| 5 | b = (*p)++; | b = *p; (*p) = (*p)+1; | 指向 11 (a[0]變11) | b = 10 | 解引用後對值後綴自增 |
| 6 | b = *++p; | p = p+1; b = *p; | 指向 11 | b = 11 | 前綴優先,* 取新地址值 |
| 7 | b = *(++p); | 同 6 | 指向 11 | b = 11 | 括號無影響 |
| 8 | b = ++(*p); | (*p) = (*p)+1; b = *p; | 指向 11 (a[0]變11) | b = 11 | 前綴自增值,再取值 |
| 9 | b = ++*p; | 同 8 | 指向 11 (a[0]變11) | b = 11 | 右→左結合:先 * 再前綴++ |
*++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 寫法,屬慣用模式,熟記即可。