C++ 运算符对照表
免费使用
超详细版
可复制
C++ 运算符完整速查表,涵盖算术、关系、逻辑、位运算、赋值、指针(* & ->)、内存管理(new/delete/sizeof)、四种类型转换、运算符重载、C++20 三路比较 <=>、优先级等全部内容。
| 分类 | 运算符 | 名称 | 示例代码 | 结果 | 说明 / 注意事项 |
|---|---|---|---|---|---|
| 算术运算符 | |||||
| + | 加法 | int a = 3 + 2; // 5 | 也可用于指针算术:p+1 指向下一个元素 | ||
| - | 减法 | int a = 5 - 3; // 2 | 指针相减得距离(元素个数) | ||
| * | 乘法 | int a = 4 * 3; // 12 | 不要与解引用 * 混淆(看操作数个数) | ||
| / | 除法 | 5 / 2; // 2 | 整数除法截断;浮点除法保留小数 | ||
| % | 取模 | 7 % 3; // 1 | C++11 起负数取模结果符号由被除数决定 | ||
| ++ | 自增 | int a=5; a++; // 6 | 前缀先加后用,后缀先用后加;重载时性能有差异 | ||
| -- | 自减 | int a=5; a--; // 4 | |||
| 关系运算符 | |||||
| == | 等于 | 5 == 5 // true | C++ 中对象比较默认比较成员(需重载 ==) | ||
| != | 不等于 | 5 != 3 // true | |||
| > | 大于 | 5 > 3 // true | |||
| < | 小于 | 3 < 5 // true | |||
| >= | 大于等于 | 5 >= 5 // true | |||
| <= | 小于等于 | 3 <= 5 // true | |||
| 逻辑运算符 | |||||
| && | 逻辑与(短路) | true && false // false | 左为 false 时右表达式不求值 | ||
| || | 逻辑或(短路) | true || false // true | 左为 true 时右表达式不求值 | ||
| ! | 逻辑非 | !true // false | |||
| 位运算符 | |||||
| & | 按位与 | 5 & 3 // 1 (0101&0011=0001) | 对应位都为1才为1 | ||
| | | 按位或 | 5 | 3 // 7 (0111) | |||
| ^ | 按位异或 | 5 ^ 3 // 6 (0110) | 相同为0,不同为1;异或自身得0(可用于交换) | ||
| ~ | 按位取反 | ~5 // -6 | 所有位取反,补码表示 | ||
| << | 左移 | 5 << 1 // 10 | 左移n位 = 乘以2^n;左移位数≥类型宽度未定义 | ||
| >> | 右移 | -8 >> 1 // -4 | 有符号右移:负数结果由实现定义(通常算术右移) | ||
| 赋值运算符 | |||||
| = | 赋值 | int a = 10; | C++ 中 = 可重载,注意深浅拷贝 | ||
| += -= *= /= %= | 复合赋值 | a += 3; // a=a+3 | 返回左值引用,可链式:a += b += c | ||
| &= |= ^= | 位运算赋值 | a &= 3; | |||
| <<= >>= | 位移赋值 | a <<= 1; | |||
| 指针/地址运算符 | |||||
| & | 取地址 | int* p = &a; | 获取变量地址 | ||
| * | 解引用 | int v = *p; | 访问指针指向的值;空指针解引用未定义行为 | ||
| -> | 成员访问 | p->field | 等价于 (*p).field | ||
| [] | 下标 | arr[0] = 10; | 可重载;a[b] 等价于 *(a+b) | ||
| 内存管理 | |||||
| new | 动态分配 | int* p = new int(10); | C++ 中 new 可重载;失败抛 bad_alloc | ||
| new[] | 数组分配 | int* p = new int[100]; | 配对使用 delete[] | ||
| delete | 释放 | delete p; | 释放单个对象;配对 new | ||
| delete[] | 释放数组 | delete[] p; | 必须配对 new[],否则未定义行为 | ||
| sizeof | 大小查询 | sizeof(int) // 通常4 | 编译期常量;对指针得指针大小,对数组得总字节 | ||
| 类型转换 | |||||
| (T) | C风格强转 | int a = (int)3.14; | 不推荐,绕过类型系统 | ||
| static_cast | 静态转换 | int a = static_cast<int>(3.14); | 编译期检查,无运行时开销 | ||
| dynamic_cast | 动态转换 | Derived* d = dynamic_cast<Derived*>(b); | 运行时检查,仅对多态类型有效;失败返回nullptr | ||
| const_cast | 去const | int* p = const_cast<int*>(&c); | 去除或添加 const/volatile 限定 | ||
| reinterpret_cast | 重解释 | void* p = reinterpret_cast<void*>(addr); | 最低安全级别,按位重解释 | ||
| 特殊运算符 | |||||
| :: | 作用域解析 | std::cout | 访问命名空间、类静态成员 | ||
| : : : | 全局作用域 | ::globalVar | 强制从全局命名空间查找 | ||
| ?: | 三元 | a>b?a:b | 可嵌套;C++11 起返回类型可不同(通用引用场景) | ||
| , | 逗号 | a=1, b=2, a+b | 从左到右求值,返回最后一个表达式的值 | ||
| 运算符重载 | |||||
| operator+ 等 | 重载 | MyInt operator+(const MyInt&, const MyInt&) | 可重载大部分运算符;不能重载 :: . .* ?: sizeof typeid | ||
| C++20 新 | |||||
| <=> | 三路比较 | auto r = a <=> b; | 返回 std::strong_ordering 等;可自动生成 == < > 等 | ||
| 优先级(高→低) | |||||
| :: | 作用域 | std::max | 最高 | ||
| ++ -- () [] . -> (T) | 单目/后缀 | *p++ / a[b] | |||
| ++ -- ! ~ & * + - | 单目前缀 | !flag / ~a / *p | |||
| .* ->* | 成员指针 | p->*m | |||
| * / % | 乘除模 | a*b/c | |||
| + - | 加减 | a+b | |||
| << >> | 位移 | a<<2 | |||
| < <= > >= | 关系 | a>b | |||
| == != | 相等 | a==b | |||
| & | 按位与 | a&b | |||
| ^ | 按位异或 | a^b | |||
| | | 按位或 | a|b | |||
| && | 逻辑与 | a&&b | |||
| || | 逻辑或 | a||b | |||
| ?: | 三元 | a?b:c | 右结合 | ||
| = += 等 | 赋值 | a=b=c | 从右向左结合 | ||
| 优先级(最低) | |||||
| , | 逗号 | a=1,b=2 | 最低优先级 | ||
C++ 运算符注意事项
- •
new失败抛std::bad_alloc(不返回 nullptr);new(std::nothrow)才返回 nullptr - •
delete与new配对,delete[]与new[]配对,混用是未定义行为 - • 整数除法
/截断小数;%负数结果符号由实现定义(C++11 起由被除数决定) - • 指针算术:
p+1移动一个元素大小,不是 1 字节;void*不能做算术 - •
static_cast优先于 C 风格强转;reinterpret_cast最危险,慎用 - •
dynamic_cast仅对含虚函数的多态类型有效,开销来自 RTTI - • 运算符重载必须至少有一个操作数为用户定义类型,不能重载
::..*?:sizeoftypeid - •
<=>(C++20)三路比较可让编译器自动生成 == < > <= >= - •
sizeof是编译期运算符,对表达式不求值(sizeof(*(int*)0)合法)
指针要点
* 解引用 & 取地址;空指针解引用是 UB;优先用智能指针
new/delete
必须配对使用;推荐用 unique_ptr / make_shared 替代裸指针
四种cast
static_cast 编译期;dynamic_cast 运行期;const_cast 去const;reinterpret_cast 重解释
C++20 <=>
三路比较运算符,自动生成全部关系运算符,减少样板代码
