C++运算符手册
C++ 运算符详解表
说明: 表格按优先级从高到低排序(优先级 1 为最高)。同一行内的运算符具有相同优先级,结合性决定了求值顺序。
| 优先级 | 运算符 | 名称/描述 | 用法示例 | 结 合 性 |
|---|---|---|---|---|
| 1 | :: | 全局作用域 / 类作用域解析 | std::cout, ClassName::member | 从左到右 |
| 2 | a++ a-- | 后置自增 / 自减 | a++, b-- | 从左到右 |
() | 函数调用 | func(x, y) | ||
[] | 数组下标 | arr[5] | ||
. -> | 成员访问 (对象) / (指针) | obj.member, ptr->member | ||
typeid const_cast dynamic_cast reinterpret_cast static_cast | 类型转换与查询 | static_cast<float>(x), typeid(obj).name() | ||
| 3 | ++a --a | 前置自增 / 自减 | ++a, --b | 从右到左 |
+a -a | 一元正号 / 负号 | -x, +y | ||
! ~ | 逻辑非 / 按位取反 | !flag, ~bits | ||
(type) | C风格强制类型转换 | (int)value | ||
*ptr &var | 解 引用 / 取地址 | *p, &var | ||
sizeof | 取大小(编译时求值) | sizeof(int), sizeof arr | ||
new new[] delete delete[] | 动态内存分配 / 释放 | new int, delete p, new int[10] | ||
co_await | await 表达式 (协程) | co_await task | ||
| 4 | .* ->* | 成员指针访问 (对象 / 指针) | obj.*ptr, pmf->*ptr | 从左到右 |
| 5 | a*b a/b a%b | 乘 / 除 / 取模 | 5 * 3, 10 / 2, 11 % 3 | 从左到右 |
| 6 | a+b a-b | 加 / 减 | 5 + 3, 10 - 2 | 从左到右 |
| 7 | << >> | 按位左移 / 按位右移 | flags << 2, bits >> 3 | 从左到右 |
| 8 | <=> (C++20) | 三路比较 (飞船运算符) | a <=> b | 从左到右 |
| 9 | < <= > >= | 关系运算符:小于 / 小于等于 / 大于 / 大于等于 | a < b, x >= 10 | 从左到右 |
| 10 | == != | 关系运算符:等于 / 不等于 | a == b, x != nullptr | 从左到右 |
| 11 | & | 按位与 | flags & mask | 从左到右 |
| 12 | ^ | 按位异或 | bits ^ key | 从左到右 |
| 13 | | | 按位或 | flags | new_bits | 从左到右 |
| 14 | && | 逻辑与 (短路求值) | cond1 && cond2 | 从左到右 |
| 15 | || | 逻辑或 (短路求值) | cond1 || cond2 | 从左到右 |
| 16 | ? : | 三元条件运算符 | condition ? expr1 : expr2 | 从右到左 |
= | 赋值 | a = 5 | ||
+= -= *= /= %= <<= >>= &= ^= |= | 复合赋值运算符 | a += 5 (等价于 a = a + 5) | ||
throw | throw 运算符 | throw std::runtime_error("Oops") | ||
| 17 | , | 逗号运算符 (顺序求值) | i=0, j=0, ++i (返回最后一个表达式的值) | 从左到右 |
补充说明表:特殊运算符用法
| 运算符 | 名称/描述 | 详细说明与注意事项 |
|---|---|---|
a % b | 取模 (Modulus) | 返回除法后的余数。操作数必须是整数类型。结果的符号与 C++ 实现相关,通常与被除数 (a) 相同。 |
a << b a >> b | 位移 (Bit Shift) | 将 a 的二进制位向左或向右移动 b 位。对 b 为负值或大于位数的情况,行为未定义。常用于乘除2的幂次或位操作。 |
&& || | 逻辑与/或 (Logical AND/OR) | 短路求值 (Short-circuit evaluation):&& 左边为假则不计算右边;|| 左边为真则不计算右边。 |
& | ^ ~ | 位运算符 (Bitwise) | 按位操作:与(&)、或(|)、异或(^)、取反(~)。操作数通常是整数类型或枚举类型。 |
typeid | 类型标识 (Type Identification) | 返回 std::type_info 常量对象的引用,包含类型信息。操作数可以是类型名或表达式。需包含 <typeinfo>。 |
dynamic_cast<Type>(expr) | 动态转换 (Dynamic Cast) | 主要用于在继承层次结构中进行安全的向下转换 (downcast)。需要运行时类型信息 (RTTI),基类必须有虚函数。 |
static_cast<Type>(expr) | 静态转换 (Static Cast) | 用于明确定义的转换,如非浮点算术转换、派生类到基类、void* 到其他指针等。编译时检查。 |
reinterpret_cast<Type>(expr) | 重解释转换 (Reinterpret Cast) | 低级别的重新解释位模式。极其不安全,例如将指针转换为整数,或将一种指针转换为另一种不相关的指针。 |
const_cast<Type>(expr) | 常量转换 (Const Cast) | 唯一能移除或添加 const 和 volatile 属性的运算符。常用于函数重载或与旧式 C 代码交互。 |
new / delete | 动态内存管理 | new 分配内存并调用构造函数,delete 调用析构函数并释放内存。必须配对使用,否则会导致内存泄漏。 |
new[] / delete[] | 动态数组管理 | new[] 分配数组,delete[] 释放数组。必须严格配对使用,new[] 对应 delete[],new 对应 delete。 |
co_await | 协程等待 (C++20) | 挂起当前协程的执行,等待某个计算完成。是 C++20 协程的核心操作之一。 |
<=> | 三路比较 (Spaceship) (C++20) | 一次性比较两个对象,返回一个表示小于、等于或大于的类别类型(如 std::strong_ordering)。简化了比较运算符的重载。 |