运算符与表达式

翻译整理自 cppreference - 运算符优先级。

1. 算术

3 + 2;  3 - 2;  3 * 2;
7 / 2;        // 3,整数除法
7.0 / 2;      // 3.5
7 % 2;        // 1,仅整数

2. 关系与逻辑

a == b; a != b; a < b; a > b; a <= b; a >= b;
a && b;   // 与(短路)
a || b;   // 或(短路)
!a;       // 非

C++ 中 &&、||、! 返回 bool,可用于重载(但应保持短路语义,否则需谨慎)。

3. 位运算

0xff & 0x0f;
0xff | 0x100;
0xff ^ 0x0f;
~0xff;
0x01 << 4;
0x80 >> 4;

4. 自增自减

int i = 0;
i++;    ++i;
i--;    --i;

5. 三目

int max = (a > b) ? a : b;

6. 逗号

for (int i = 0, j = n - 1; i < j; ++i, --j) { ... }

7. sizeof / alignof

sizeof(int);            // 4
sizeof arr;             // 整数组
sizeof...(pack);        // 参数包大小
alignof(double);        // 对齐要求

8. 作用域解析 ::

std::cout;
::globalVar;            // 全局命名空间

9. 成员访问

obj.member;
ptr->member;
ptr->*pmember;          // 成员指针
obj.*pmember;

10. 类型转换运算符

static_cast<T>(x);
dynamic_cast<T>(x);
const_cast<T>(x);
reinterpret_cast<T>(x);

11. 内存运算符

new int;
new int[10];
delete p;
delete[] arr;

12. 重载运算符

class Vec {
public:
    int operator[](size_t i) const { return data[i]; }
    Vec operator+(const Vec& rhs) const { ... }
    bool operator==(const Vec& rhs) const { ... }
};

可重载:+ - * / % ^ & | ~ ! = < > += ... [] () -> new delete 不可重载:. .* :: ?: sizeof typeid 等。

13. 优先级(节选)

从高到低:

::  (后缀 ++ -- 后置 [] () . -> typeid ...)
++ -- (前缀) + - ! ~ (type) sizeof new delete
.* ->*
* / %
+ -
<< >>
< <= > >=
== !=
&
^
|
&&
||
?:
= *= /= %= += -= <<= >>= &= ^= |=
throw
,

14. 注意事项

  • 顺序点:C++17 起对运算符求值顺序做了细化,但表达式如 i = i++ + ++i 仍是 UB
  • 有符号溢出是 UB
  • 不要依赖运算符结合性判断副作用顺序
  • 使用 <=> 飞船运算符(C++20)一次定义所有比较

小结

C++ 运算符可重载,但建议谨慎重载,保持语义直觉一致。