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

C語言運算符優先級陷阱:& 與 == 的經典 Bug 案例

     編輯:關於C語言

Bug 現場

[cpp]
if (indicator & 0x8000 == 0x8000) { ... }

意圖:判斷 indicator 的第 16 位(0x8000)是否為 1。

實際:== 優先級高於 &,等價於 indicator & (0x8000 == 0x8000) → indicator & 1,判斷變成了最低位!

優先級規則

  • 關系運算符(== != > < >= <=)優先級 高於 位運算符(& ^ |)。
  • 完整優先級表(節選,高→低):() [] -> . → ! ~ ++ -- → * / % → + - → << >> → < <= > >= → == != → & → ^ → | → && → || → ?: → = += ...

修正方法

永遠加括號,消除歧義:

[cpp]
if ((indicator & 0x8000) == 0x8000) { ... }

補充:0x7fff 類型提升

task.cur = indicator & 0x7fff; 中,0x7fff 為 int,indicator 為 int,無類型提升問題,按位與後高 16 位自動清零,邏輯正確。

心得

「對於不確定性問題,要想辦法去確認,否則等待你的將會是 Bug。」

  • 不記優先級表,遇到混合運算一律加括號。
  • 代碼評審時重點檢查位運算與關系/邏輯運算混用處。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved