运算符与表达式
翻译整理自 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++ 运算符可重载,但建议谨慎重载,保持语义直觉一致。