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

C語言運算符優先級與結合性實戰:六種指針解引用遞增組合的反彙編驗證

     編輯:關於C

六種表達式等價性分析

編號表達式語義等價組
(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

優先級與結合性規則總結

  1. 後綴++ 優先級最高,右結合:*p++ ≡ *(p++)
  2. 前綴++ 與一元* 同級,右結合:++*p ≡ ++(*p) ≡ *(++p) ❌(最後一個錯,見下)
  3. 實際解析:++*p → ++(*p);*++p → *(++p)
  4. 括號 可強制分組但不改變本質語義

工程防錯建議

  • 拒絕混用:同一表達式中避免同時出現*和++/--
  • 拆分語句:b = *p; p++; 代替 b = *p++;
  • 編譯器警告:啟用-Wsequence-point(GCC)檢測未定義行為
  • 代碼審查:重點檢查指針算術與副作用混用場景
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved