C++ 运算符速查表

按优先级从高到低排列。优先级决定「不加括号时谁先算」。 记不住也没关系——拿不准就加括号,括号永远最高优先级。

优先级总表

优先级运算符示例说明
最高优先级
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赋值及复合赋值

竞赛中最常用的 8 个

1. 取模 %

int r = 17 % 5;     // r = 2(17 除以 5 的余数)
bool odd = n % 2;    // 奇数时 true(竞赛判奇偶最常用)
⚠️ 负数取模:C++ 里 -7 % 3 结果是 -1(符号跟被除数走)。 竞赛中要非负余数,用 ((a % m) + m) % m。

2. 自增 ++i vs i++

int i = 5;
int a = ++i;  // i 先变成 6,a = 6
int b = i++;  // b 先拿 6,然后 i 变成 7
🧠 竞赛习惯:在 for 循环里 i++ 和 ++i 效果一样(没人在意返回值)。 但单独写一句你想让 i 加 1 时,i++; 和 ++i; 完全等价。

3. 逻辑与 && 和短路求值

if (i < n && a[i] > 0)  // 安全!先判断 i<n,不成立就不会访问 a[i]

短路:A && B 如果 A 已经是 false,B 根本不会执行。这是竞赛中防越界的标准写法。

4. 三目 ? :

int ans = (x > 0) ? 1 : -1;       // 你刚用过
cout << (y < 60 ? "fail" : "pass");  // 可以嵌套,但别超过一层

5. 按位与 & 判奇偶

if (x & 1)   // x 是奇数(比 x%2 略快,竞赛人爱用)
if (!(x & 1)) // x 是偶数

6. 左移 << 算 2 的幂

int p = 1 << k;   // p = 2^k(k 不能太大,int 溢出在 k≥31)

7. 复合赋值

sum += x;   // 等价 sum = sum + x
cnt %= 10;  // 等价 cnt = cnt % 10
times *= 2; // 等价 times = times * 2

8. != 判不等

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

运算符速查表 · 持续更新 · 返回资源列表