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

C++ 運算子優先級陷阱:<< 比減法還低?

     編輯:關於C++

一個令人驚訝的範例

觀察以下程式碼:

#include <stdio.h>
#define GET_BIT(a, b, c) a << b - c

int main() {
    int a = 1, b = 5, c = 4;
    printf("%d\n", GET_BIT(a, b, c) + 1); // 輸出 4
}

乍看之下,1 << 5 - 4 應為 1 << 1 = 2,加 1 應為 3,但實際輸出卻是 4。原因在於 << 的優先級**低於**減法 -,實際解析為 (a << b) - c,即 (1 << 5) - 4 = 32 - 4 = 28,再加 1 得 29?等等,實際輸出是 4,說明巨集展開後優先級導致結合方式不同。實際上 GET_BIT(a,b,c) + 1 展開為 a << b - c + 1,依優先級為 a << (b - c + 1) = 1 << (5 - 4 + 1) = 1 << 2 = 4。

C/C++ 運算子優先級口訣(由高到低)

  1. 括號、成員:() [] . ->
  2. 單目運算子:++ -- + - * & sizeof
  3. 乘除餘:* / %
  4. 加減:+ -
  5. 移位:<< >>
  6. 關係:< <= > >=
  7. 相等/不等:== !=
  8. 位元 AND:&
  9. 位元 XOR:^
  10. 位元 OR:|
  11. 邏輯 AND:&&
  12. 邏輯 OR:||
  13. 條件運算子:?:
  14. 賦值:= += -= ...
  15. 逗號:,

避坑指南

  • **善用括號**:在巨集或複雜表達式中,明確加上括號指定結合順序。
  • **查閱標準**:不確定時查閱 C++ 參考手冊,切勿憑記憶。
  • **編譯器警告**:開啟 -Wall -Wextra,部分編譯器會針對優先級易混淆處發出警告。

結語

移位運算子優先級較低是 C/C++ 歷史遺留設計,現代程式碼應盡量避免依賴隱含優先級,改以括號明確表達意圖,減少認知負擔與潛在 Bug。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved