🔀

第4章 选择结构程序设计

谭浩强《C程序设计》第五版 · 交互式教学演示

🔢 1. 关系运算符与逻辑运算符

关系运算符 (结果为 0 或 1)

运算符含义示例结果
<小于3 < 51 (真)
>大于5 > 80 (假)
<=小于等于3 <= 31 (真)
>=大于等于2 >= 50 (假)
==等于4 == 41 (真)
!=不等于3 != 51 (真)

逻辑运算符真值表

ABA && BA || B!A

🎮 交互式:逻辑表达式求值

⚠️ 短路求值: && 左边为假则不计算右边;|| 左边为真则不计算右边
🔀 2. if 语句三种形式
单分支 if
双分支 if-else
多分支 if-else if

语法形式

if (表达式)
    语句;
/* 示例:判断是否及格 */
if (score >= 60)
    printf("及格!\n");
注意:表达式为非零即为"真"

流程图

开始
输入 score
score>=60?
否→
←是
输出"及格!"
结束

🎮 演示:单分支 if

语法形式

if (表达式)
    语句1;
else
    语句2;
/* 示例:判断奇偶 */
if (n % 2 == 0)
    printf("%d是偶数\n", n);
else
    printf("%d是奇数\n", n);

流程图

开始 n%2==0? 奇数 偶数 结束

🎮 演示:双分支 if-else

成绩分级演示 (if-else if-else 链)

if (score >= 90)
    grade = 'A';
else if (score >= 80)
    grade = 'B';
else if (score >= 70)
    grade = 'C';
else if (score >= 60)
    grade = 'D';
else
    grade = 'F';

🎮 动态判断路径可视化

75
🪆 3. if-else 嵌套与悬挂 else

悬挂 else 问题

/* 看起来像这样... */
if (x > 0)
    if (y > 0)
        printf("第一象限");
else
    printf("x不大于0");
⚠️ 规则:else 与最近的未匹配的 if 配对!
/* 实际上等价于: */
if (x > 0) {
    if (y > 0)
        printf("第一象限");
    else  // 与内层if配对!
        printf("x不大于0");
}

🎮 判断象限演示

if (x > 0 && y > 0)      printf("第一象限");
else if (x < 0 && y > 0) printf("第二象限");
else if (x < 0 && y < 0) printf("第三象限");
else if (x > 0 && y < 0) printf("第四象限");
else                        printf("在轴上");

🎮 坐标系可视化

点击坐标系判断象限

🔦 4. switch 语句

语法形式

switch (表达式) {
    case 常量1:
        语句序列1;
        break;
    case 常量2:
        语句序列2;
        break;
    /* ... */
    default:
        默认语句;
}
⚠️ 必须注意:每个 case 末尾必须加 break,否则会"贯穿"执行下一个 case!

🎮 星期映射演示

switch (day) {
    case 1: printf("Monday"); break;
    case 2: printf("Tuesday"); break;
    /* ... */
    default: printf("Error");
}

⚡ break 贯穿效果演示

✅ 有 break(正确)

switch(n) {
  case 1: puts("一"); break;
  case 2: puts("二"); break;
  case 3: puts("三"); break;
}

❌ 无 break(贯穿)

switch(n) {
  case 1: puts("一");
  case 2: puts("二");
  case 3: puts("三");
}
❓ 5. 条件运算符(三目运算符)

语法形式

表达式1 ? 表达式2 : 表达式3

等价于:

if (表达式1)
    表达式2;   /* 为真时的值 */
else
    表达式3;   /* 为假时的值 */
优先级:右结合,仅次于赋值运算符,常用于简化简单的 if-else

常见用例

/* 取最大值 */
max = (a > b) ? a : b;

/* 绝对值 */
abs_x = (x >= 0) ? x : -x;

/* 奇偶判断 */
printf((n%2==0) ? "偶数" : "奇数");

/* 嵌套(不推荐) */
grade = (s>=90)?'A':(s>=60)?'B':'C';

🎮 交互式:条件表达式计算器

🧪 6. 综合练习:年份与月份判断

判断闰年

/* 闰年条件:
   能被4整除但不能被100整除,
   或者能被400整除 */
if ((year%4==0 && year%100!=0)
    || year%400==0)
    printf("%d是闰年\n", year);
else
    printf("%d是平年\n", year);

switch 查月份天数

switch (month) {
  case 1:case 3:case 5:
  case 7:case 8:case 10:
  case 12:
      days = 31; break;
  case 4:case 6:
  case 9:case 11:
      days = 30; break;
  case 2:
      days = leap ? 29 : 28;
}
/

🎯 日历格子可视化