六種表達式等價性分析
| 編號 | 表達式 | 語義 | 等價組 |
| (1) | b = *p++; | 取*p值賦b,p指向下一個 | 獨立 |
| (2) | b = (*p)++; | 取*p值賦b,*p加1 |
| (3) | b = ++*p; | *p加1,取新值賦b | 等價 |
| (4) | b = ++(*p); | 同上,括號僅為閱讀性 |
| (5) | b = *++p; | p指向下一個,取新*p值賦b | 等價 |
| (6) | b = *(++p); | 同上,括號僅為閱讀性 |
MSVC反彙編鐵證
; (3) b=++*p ; (4) b=++(*p) 完全相同
mov eax, dword ptr [p]
mov ecx, dword ptr [eax]
add ecx, 1
mov edx, dword ptr [p]
mov dword ptr [edx], ecx
mov eax, dword ptr [p]
mov ecx, dword ptr [eax]
mov dword ptr [b], ecx
; (5) b=*++p ; (6) b=*(++p) 完全相同
mov eax, dword ptr [p]
add eax, 4
mov dword ptr [p], eax
mov ecx, dword ptr [p]
mov edx, dword ptr [ecx]
mov dword ptr [b], edx
優先級與結合性規則總結
- 後綴++ 優先級最高,右結合:
*p++ ≡ *(p++)
- 前綴++ 與一元* 同級,右結合:
++*p ≡ ++(*p) ≡ *(++p) ❌(最後一個錯,見下)
- 實際解析:
++*p → ++(*p);*++p → *(++p)
- 括號 可強制分組但不改變本質語義
工程防錯建議
- 拒絕混用:同一表達式中避免同時出現
*和++/--
- 拆分語句:
b = *p; p++; 代替 b = *p++;
- 編譯器警告:啟用
-Wsequence-point(GCC)檢測未定義行為
- 代碼審查:重點檢查指針算術與副作用混用場景