按优先级从高到低排列。优先级决定「不加括号时谁先算」。 记不住也没关系——拿不准就加括号,括号永远最高优先级。
| 优先级 | 运算符 | 示例 | 说明 |
|---|---|---|---|
| 最高优先级 | |||
| 1 | :: | std::cout | 作用域解析 |
| 后缀 | |||
| 2 | ++ -- | i++ i-- | 后缀自增/自减(先用后改) |
| 2 | () | f(x) | 函数调用 |
| 2 | [] | a[3] | 下标 |
| 前缀 / 一元 | |||
| 3 | ++ -- | ++i --i | 前缀自增/自减(先改后用) |
| 3 | ! | !flag | 逻辑非 |
| 3 | ~ | ~x | 按位非 |
| 3 | - | -x | 一元负号 |
| 乘除模 | |||
| 4 | * / % | a * b a / b a % b | 乘、除、取模(同优先级,左结合) |
| 加减 | |||
| 5 | + - | a + b a - b | 加、减 |
| 移位 | |||
| 6 | << >> | x << 2 x >> 1 | 左移、右移 |
| 比较 | |||
| 7 | < <= > >= | a < b | 小于、小于等于、大于、大于等于 |
| 8 | == != | a == b | 等于、不等于 |
| 按位 | |||
| 9 | & | x & 1 | 按位与(取最低位常用) |
| 10 | ^ | a ^ b | 按位异或 |
| 11 | | | x | mask | 按位或 |
| 逻辑 | |||
| 12 | && | a > 0 && b > 0 | 逻辑与(短路求值) |
| 13 | || | a == 0 || b == 0 | 逻辑或(短路求值) |
| 条件 / 赋值(最低) | |||
| 14 | ? : | x > 0 ? 1 : -1 | 三目运算符 |
| 15 | = += -= *= /= %= | x += 5 | 赋值及复合赋值 |
%int r = 17 % 5; // r = 2(17 除以 5 的余数)
bool odd = n % 2; // 奇数时 true(竞赛判奇偶最常用)
-7 % 3 结果是 -1(符号跟被除数走)。
竞赛中要非负余数,用 ((a % m) + m) % m。
++i vs i++int i = 5;
int a = ++i; // i 先变成 6,a = 6
int b = i++; // b 先拿 6,然后 i 变成 7
i++ 和 ++i 效果一样(没人在意返回值)。
但单独写一句你想让 i 加 1 时,i++; 和 ++i; 完全等价。
&& 和短路求值if (i < n && a[i] > 0) // 安全!先判断 i<n,不成立就不会访问 a[i]
短路:A && B 如果 A 已经是 false,B 根本不会执行。这是竞赛中防越界的标准写法。
? :int ans = (x > 0) ? 1 : -1; // 你刚用过
cout << (y < 60 ? "fail" : "pass"); // 可以嵌套,但别超过一层
& 判奇偶if (x & 1) // x 是奇数(比 x%2 略快,竞赛人爱用)
if (!(x & 1)) // x 是偶数
<< 算 2 的幂int p = 1 << k; // p = 2^k(k 不能太大,int 溢出在 k≥31)
sum += x; // 等价 sum = sum + x
cnt %= 10; // 等价 cnt = cnt % 10
times *= 2; // 等价 times = times * 2
!= 判不等while (cin >> x) // 读到 EOF 停 —— 其实 cin>>x 返回的是流状态
if (a != b) // 不等于
| 坑 | 好写法 | 说明 |
|---|---|---|
if (a < b < c) |
if (a < b && b < c) |
C++ 不能链式比较!a<b<c 先算 a<b 得到 true/false(0/1),再和 c 比——完全不是你想要的 |
a ^ b ^ c(混淆) |
(a ^ b) ^ c |
异或优先级低于比较,但建议多加括号 |
if (x = 5) |
if (x == 5) |
赋值 = 和判等 == 写混——编译会警告,但能过 |
1 << 32 |
1LL << 32 |
int 左移 ≥32 位是未定义行为,用 long long |
运算符速查表 · 持续更新 · 返回资源列表