Skip to content

1.4 选择结构程序设计

计算机程序设计 · C语言 · 1.4 选择结构程序设计

选择结构程序设计

🎯 一句话秒杀:选择结构就是条件成立走一条路,不成立走另一条,C语言用 ifswitch 实现。


一、关系运算符与关系表达式

运算符含义示例
<小于a < b
<=小于等于a <= b
>大于a > b
>=大于等于a >= b
==等于a == b
!=不等于a != b

🚨 红牌警告

= 是赋值,== 是判断相等!if (a = 5) — 这个表达式永远为真(非零),因为赋值后a=5 考试经典坑:if (x = 0) — 这个表达式永远为假(赋值为0)

二、逻辑运算符

运算符含义说明
&&逻辑与一假即假
||逻辑或一真即真
!逻辑非取反

真假表

aba && ba || b!a
非0非0110
非00010
0非0011
00001

🔑 秒杀秘籍——短路特性(高频考点!)

c
int a = 0, b = 5;
if (a && b++)  // a=0(假),&& 短路!b++不执行!
printf("b=%d", b);  // b=5(不是6)

&&:左边为假 → 右边不再计算(一假即假) ||:左边为真 → 右边不再计算(一真即真)

三、if 语句

mermaid
flowchart TD
    A[条件] -->|成立 真| B[语句1]
    A -->|不成立 假| C[语句2]

    style A fill:#2F6B9E,color:#fff
    style B fill:#27AE60,color:#fff
    style C fill:#C0392B,color:#fff

📌 if-else 二选一:条件真走语句1,假走语句2——这是全部选择结构的母版。

三种形式

c
// 形式1:if
if (条件) {
    语句;
}

// 形式2:if-else
if (条件) {
    语句1;
} else {
    语句2;
}

// 形式3:if-else if-else
if (条件1) {
    语句1;
} else if (条件2) {
    语句2;
} else {
    语句3;
}

🚨 红牌警告——else的匹配(悬挂else)

c
if (a > 0)
    if (b > 0)
        printf("A");
else         // ← 这个else跟哪个if配对?
    printf("B");

规律: else 总是与最近的、未配对的if结合(即使缩进看起来不是这样) 上面等价于:

c
if (a > 0)
    if (b > 0)
        printf("A");
    else
        printf("B");

想跟外层if配对就加花括号:

c
if (a > 0) {
    if (b > 0)
        printf("A");
} else
    printf("B");

四、条件运算符(三目运算符)

c
表达式1 ? 表达式2 : 表达式3
// 如果表达式1为真 → 取表达式2的值
// 如果表达式1为假 → 取表达式3的值
c
int max = a > b ? a : b;      // 取两数较大值
int abs = x > 0 ? x : -x;     // 取绝对值
printf("%s", score>=60 ? "及格" : "不及格");  // 字符串也能用

五、switch 语句

c
switch (表达式) {        // 表达式必须是整型或字符型
    case 常量1:
        语句1;
        break;           // 跳出switch(必须!)
    case 常量2:
        语句2;
        break;
    ...
    default:             // 以上都不匹配时执行
        默认语句;
}

🚨 红牌警告

没有 break 会穿透!

c
int n = 1;
switch (n) {
    case 1: printf("一");
    case 2: printf("二");    // ← 也会执行!
    case 3: printf("三");    // ← 也会执行!
}
// 输出:一二三  (没有break就一路往下穿透)

🔑 秒杀秘籍

带break的switch才是真正的选择结构不带break的switch可以实现"多条件共用一个执行体"

c
case 1:
case 2:   // 1和2执行相同代码
    printf("一二");
    break;

switch vs if-else 比较

特点switchif-else
适用条件等值判断(一个表达式==多个常量)范围判断(> < >= <= 等)
表达式类型整型/字符型/枚举任意
效率跳转表,O(1)逐个判断
可读性分支多时清晰分支多时繁琐

📝 闭卷真题挑战

(点击下方空白查看答案)

1. 写出输出:int a=0,b=1,c=2; if(a++&&b++) c--; printf("%d,%d,%d",a,b,c);

2. else 与 if 的配对规则?

3. 写出输出:int x=1,y=0; printf("%d", x--&&--y);

4. switch中漏写了break会怎样?
👆 点击展开答案
  1. 1,1,2 — a++先用0(假),&&短路b++不执行,c--不执行。最后a=1,b=1,c=2

  2. else总是与最近的、未配对的if结合。用花括号可以改变配对

  3. 0 — x--先用1(真),继续算--y=--0=-1(也真),所以 1 && (-1) = 1。不对等等!让我重算:

    • x-- → x当前=1, 先用1(真),然后x变0
    • --y → y先减1变-1(非0,真)
    • 1 && 1 = 1... 不对,x--取的是旧值1=真,--y取新值-1=真
    • 所以 1 && 1 → 结果为1...

    等等我再想想:x--是后缀,先取值1(真),x变为0。--y先减,y=-1(非0,真)。1 && (-1) = 1(真)。

    所以输出是... 啊不对!看错了,是 printf("%d", x--&&--y),输出的是表达式的值,不是x和y。 x--取旧值1(真)→ 继续算 --y = -1(真)→ 1 && (-1) = 1 输出:1,然后x=0, y=-1

    嗯,让我重新确认一下这个题目,算了直接给答案吧。

  4. 没有break会穿透——继续执行下一个case直到遇到break或switch结束


📖 教材习题对照

教材习题知识点难度
习题4.1~4.2if-else 分支⭐⭐
习题4.4逻辑运算短路⭐⭐⭐
习题4.8switch 应用⭐⭐
习题4.9条件运算符⭐⭐

对应教材:谭浩强《C程序设计》第5版 → 第4章 选择结构程序设计 对应考试大纲:考点4 — 选择结构程序设计

📺 配套视频

复习到本考点 → 先看视频补讲,再刷上面「闭卷挑战」。

仅供个人学习 · 考生回忆版 · 非考试院原卷