C 语言书
模块一 · 入门基础 / 第 04 课

04 · 运算符:算术、比较、逻辑

入门 35 分钟 跳到过关题
学习目标
  • 会做加减乘除和取余
  • 会写比较表达式(结果是真/假)
  • 会用 && || ! 组合条件

算术运算符

运算符含义例子结果
+ - *加减乘3+4*211(先乘除)
/除7/23(整数除丢掉小数)
%取余7%21
++ --加一减一n++n 变成 n+1
新手最容易踩的坑
7 / 2 在两边都是整数时结果是 3,不是 3.5。 要小数就写成 7.0 / 2 或强制转成 float。
#include <stdio.h>

int main(void)
{
    int a = 7, b = 2;
    printf("%d\n", a / b);     // 3
    printf("%d\n", a % b);     // 1
    printf("%f\n", 7.0 / 2);   // 3.500000
    return 0;
}

比较运算符

比较的结果只有两种:成立(真,C 里用 1 表示)或不成立(假,用 0)。所以比较表达式可以参与运算,也可以赋给 int:

int a = 5, b = 3;
int flag = (a > b);   /* flag = 1 */
printf("%d\n", a == b);  /* 0 */

经典错误:= 和 ==

必须刻进脑子
判断相等是 ==,不是 =。 = 是赋值。写成 if (x = 1) 的真实语义是: 把 1 写进 x,然后判断 x 是否为真(1 为真)→ 条件几乎总是成立,而且 x 被你改成了 1。 这是 C 里最经典的逻辑 bug 之一。阅读时把常量写在左边可以帮忙防坑: if (1 == x) 若误写成 if (1 = x) 会直接编译失败。

逻辑运算符与短路

  • && 与:两边都真才真
  • || 或:有一边真就真
  • ! 非:真变假,假变真

短路求值:对 A && B,若 A 已经为假,B 不会执行; 对 A || B,若 A 已经为真,B 也不会执行。这可以写保护:

#include <stdio.h>

int main(void)
{
    int age = 20;
    int has_card = 1;  // 1 表示有

    /* 先判断指针/下标合法,再解引用——利用短路避免崩溃 */
    int arr[3] = {1,2,3};
    int i = 5;
    if (i >= 0 && i < 3 && arr[i] > 0)
    {
        /* 能安全走到这里 */
    }

    if (age >= 18 && has_card)
    {
        printf("可以进入\n");
    }
    else
    {
        printf("不可以进入\n");
    }
    return 0;
}

赋值运算符(写代码会一直用)

写法等价于意思
n += 3n = n + 3加 3 再存回
n -= 2n = n - 2减 2
n *= 2n = n * 2乘 2
n /= 2n = n / 2除 2
n %= 3n = n % 3模 3
int sum = 0;
sum += 10;   /* 累加,极常用 */
sum += 5;    /* 15 */

运算优先级(够用记忆)

从高到低大致是:

  1. () 括号
  2. ! ++ -- 等一元运算
  3. * / %
  4. + -
  5. 比较 < > == ...
  6. &&
  7. ||
  8. = 赋值

拿不准就加括号,代码更清楚,也不会算错。

易错点汇总

本课四颗雷
  • 7/2 结果是 3,不是 3.5
  • == 比较,= 赋值
  • % 两边必须是整数
  • 浮点比较不要写 f == 0.3,有误差;可比较差值是否很小

单片机场景 · 运算符:条件与赋值

算术得到数值,比较与逻辑运算得到真假。先判断条件,再执行赋值。

边界与验证:c 先是 8,条件成立后变成 2。== 比较,= 赋值;& 不等于逻辑与 &&。

int a = 5, b = 3;
int c = a + b;
if (a > b && b > 0) {
    c = a - b;
}

本课过关

必做

表达式 9 / 2 的值是?

必做作业
  1. 计算并写出结果:10/3、10%3、2*3+1、!(5>3)。
  2. 成绩 score 及格线 60,写出「不及格」的 if 条件。
  3. 找出 bug:if (score = 100) printf("满分");
先自己写完,再点开看解答

1:逐步算

  • 10/3:整数除 → 3(余 1 丢掉)
  • 10%3:余数 → 1
  • 2*3+1:先乘 → 7
  • !(5>3):5>3 为真(1),!1 → 0

2:不及格条件

if (score < 60)
{
    printf("不及格\n");
}

3:bug 分析:if (score = 100) 把 100 写入 score,表达式值为 100(真),永远打印「满分」,且 score 被改成 100。正确写法是 if (score == 100)。很多编译器会警告 “suggest parentheses around assignment used as truth value”。