运算符是 C 语言表达计算的"动词"。加减乘除、比较判断、逻辑与或、甚至直接操作二进制位——掌握了它们,你才能写出真正有逻辑的程序。本文按类别梳理 C 的常用运算符,并指出最容易踩的坑。

1. 算术运算符

C 的算术运算符包括 +-*/%(取余)。特别要注意:两个整数相除,结果还是整数,小数部分被直接丢弃。

#include <stdio.h>

int main(void) {
    int a = 10, b = 3;
    printf("a + b = %d\n", a + b);
    printf("a - b = %d\n", a - b);
    printf("a * b = %d\n", a * b);
    printf("a / b = %d\n", a / b);    // 整数除法,结果为 3
    printf("a %% b = %d\n", a % b);   // 取余,结果为 1
    printf("10.0 / 3 = %.2f\n", 10.0 / 3);  // 浮点除法
    return 0;
}

2. 赋值与复合赋值

除了 =,C 还提供 +=-=*=/=%= 等复合赋值运算符。x += 5 等价于 x = x + 5,写起来更简洁,而且左侧表达式只计算一次。

#include <stdio.h>

int main(void) {
    int x = 10;
    x += 5;   // x = 15
    x *= 2;   // x = 30
    x -= 8;   // x = 22
    x /= 2;   // x = 11
    printf("x = %d\n", x);
    return 0;
}

3. 关系与逻辑运算符

关系运算符 <><=>===!= 的结果是 0 或 1;逻辑运算符 &&(与)、||(或)、!(非)用来组合条件。最容易犯的错:== 是比较,= 是赋值,写混了程序不会报错但逻辑全错——这是新手一号 bug。

4. 位运算符

位运算直接操作二进制位,在嵌入式、图像处理和性能敏感场景非常有用:

#include <stdio.h>

int main(void) {
    int x = 5, y = 3;  // 二进制:0101 & 0011
    printf("x & y = %d\n", x & y);    // 按位与:1
    printf("x | y = %d\n", x | y);    // 按位或:7
    printf("x ^ y = %d\n", x ^ y);    // 按位异或:6
    printf("x << 1 = %d\n", x << 1);  // 左移一位:10
    printf("x >> 1 = %d\n", x >> 1);  // 右移一位:2
    return 0;
}

左移一位相当于乘以 2,右移一位相当于整除 2。注意:对有符号负数右移,行为与具体平台相关。

5. 自增自减与三目运算符

i++ 先使用再自增,++i 先自增再使用;三目运算符 条件 ? 表达式1 : 表达式2 是 if-else 的简写:

#include <stdio.h>

int main(void) {
    int i = 3;
    printf("%d\n", i++);   // 打印 3,然后 i 变成 4
    printf("%d\n", ++i);   // i 先变成 5,再打印 5

    int score = 75;
    char *result = score >= 60 ? "及格" : "不及格";
    printf("%s\n", result);
    return 0;
}

6. 优先级速查

优先级运算符结合性
最高() [] -> .左→右
* / %左→右
+ -左→右
< > <= >= == !=左→右
更低&& ||左→右
最低= += -= 等赋值右→左

记忆口诀:括号最优先,乘除先于加减,比较先于逻辑,赋值最后做。拿不准就加括号——可读性永远优先。

💡 学习建议:找一张"运算符优先级表"存起来;再故意把 == 写成 = 一次,亲眼看看编译器给出什么警告——错误是最好的老师。