05 - 运算符
2026/7/16大约 2 分钟
05 - 运算符
算术运算符
int a = 10, b = 3;
a + b; // 13 加
a - b; // 7 减
a * b; // 30 乘
a / b; // 3 整数除法(截断小数)
a % b; // 1 取模(余数),仅用于整数
// 注意:整数除法
10 / 3; // 3
10 / -3; // -3(向零截断)
-10 / 3; // -3
10 % 3; // 1
-10 % 3; // -1(符号跟随被除数)
自增/自减
int x = 5;
x++; // x 变成 6(后置:先用后加)
++x; // x 变成 7(前置:先加后用)
x--; // 后置自减
--x; // 前置自减
// 区别
int a = 5;
int b = a++; // b=5, a=6(先赋值再加)
int c = ++a; // c=7, a=7(先加再赋值)
赋值运算符
int x = 10;
x += 5; // x = x + 5 → 15
x -= 3; // x = x - 3 → 12
x *= 2; // x = x * 2 → 24
x /= 4; // x = x / 4 → 6
x %= 4; // x = x % 4 → 2
x &= 0xFF; // 位与赋值
x |= 0x01; // 位或赋值
x ^= 0x02; // 位异或赋值
x <<= 1; // 左移赋值
x >>= 1; // 右移赋值
比较运算符
int a = 5, b = 10;
a == b; // false 相等
a != b; // true 不等
a < b; // true 小于
a > b; // false 大于
a <= b; // true 小于等于
a >= b; // false 大于等于
// C++20 三路比较运算符(太空船运算符)
#include <compare>
auto result = a <=> b; // std::strong_ordering
// result < 0 → a < b
// result == 0 → a == b
// result > 0 → a > b
逻辑运算符
bool a = true, b = false;
a && b; // false 逻辑与(短路求值)
a || b; // true 逻辑或(短路求值)
!a; // false 逻辑非
// 短路求值
int x = 0;
if (x != 0 && 10 / x > 1) {
// x != 0 为false时,不会执行 10/x(避免除零)
}
位运算符
unsigned int a = 0b1100; // 12
unsigned int b = 0b1010; // 10
a & b; // 0b1000 (8) 按位与
a | b; // 0b1110 (14) 按位或
a ^ b; // 0b0110 (6) 按位异或
~a; // 0b...0011 按位取反
a << 2; // 0b110000 (48) 左移2位
a >> 1; // 0b0110 (6) 右移1位
// 常见位操作技巧
int x = 1 << 5; // 32(设置第5位)
int mask = x - 1; // 31(低5位全1)
bool isPowerOf2 = (n & (n-1)) == 0; // 判断是否为2的幂
条件运算符(三元运算符)
int a = 5, b = 10;
int max = (a > b) ? a : b; // 10
// 可以嵌套(不推荐过深)
int x = 1, y = 2, z = 3;
int result = (x > y) ? x : (y > z ? y : z);
sizeof 运算符
int arr[10];
std::cout << sizeof(arr); // 40 (10 * 4)
std::cout << sizeof(arr) / sizeof(arr[0]); // 10(数组元素个数)
// C++17 std::size
std::cout << std::size(arr); // 10
// 对指针不等于数组大小
int* p = arr;
std::cout << sizeof(p); // 4或8(指针大小,不是数组大小)
运算符优先级(从高到低)
| 优先级 | 运算符 | 结合性 |
|---|---|---|
| 1 | :: | 左 |
| 2 | () [] -> . ++(后) --(后) | 左 |
| 3 | ++(前) --(前) ! ~ + - *(取地址) & sizeof new delete | 右 |
| 4 | .* ->* | 左 |
| 5 | * / % | 左 |
| 6 | + - | 左 |
| 7 | << >> | 左 |
| 8 | <=> | 左 |
| 9 | < <= > >= | 左 |
| 10 | == != | 左 |
| 11-15 | & ^ ` | && |
建议: 不确定时用括号明确优先级。
下一步: 06-控制流
