←

C 语言程序设计 · C语言

选择结构程序设计

选择结构程序设计

结构化讲义

S1-4 · 3 个大纲考点讲义 · 已精编

练本节题目

S1-4.1

用 if 语句实现选择结构。

精编讲义 v1#

if 语句的三种基本形式与判断规则

必记
  • 三种结构:① 单分支 if (表达式) 语句;;② 双分支 if (表达式) 语句1; else 语句2;;③ 多分支阶梯 if (e1) ... else if (e2) ... else ...(从上往下依次判断,一旦某个分支成立并执行完毕,立即跳出整个阶梯)。
  • 条件真假判定:if 圆括号内可以是任意数值类型表达式(不限于关系或逻辑表达式),值非 0 即判为“真”,值为 0 即判为“假”。
  • 子句管辖范围:若 if 或 else 后不加花括号 {},则只管辖紧随其后的第一条语句;要控制多条语句必须使用 { ... } 复合语句。

if 语句三大经典考题陷阱

必记

易错陷阱

① if (a = 5) vs if (a == 5):if (a = 5) 是把 5 赋给 a,表达式值为 5(非 0),恒走真分支;if (a = 0) 表达式值为 0,恒走假分支。<br>② if (条件); 多余分号:圆括号后紧跟 ; 代表空语句,后面的代码不论条件真假都会无条件执行,且若后续还有 else 会导致 else 无匹配 if 编译报错。<br>③ else 不能单独出现:每个 else 前面必须有与之配对的 if,且 else 后绝不能直接带条件表达式(必须写 else if (条件))。

随堂自测(3 题 · 共 161 道关联题)展开作答
填空2 分自测不计入学习进度

以下程序输出 x, y, z 三个数中的最小值,请完善程序。 int main() { int x,y,z,min ; scanf("%d %d %d", &x, &y, &z); if(x > y) 【1】 else min = x; if(【2】) min = z; printf("%d", min); return 0; }

填空2 分自测不计入学习进度

70 以下程序对输入的两个整数,按从大到小顺序输出,请分析程序填空。 main() {int x,y,z; scanf("%d,%d",&x,&y); if(【1】) {z=x;【2】} printf("%d,%d",x,y); }

填空2 分自测不计入学习进度

102 当运行时输入:1992<CR>,则以下程序的运行结果是______。 main() {int y,t; scanf("%d",&y); t=((y%4==0)&&(y%100!=0)||y%400==0)?1:0; if(t) printf("%d is",y); else printf("%d is not",y); printf("a leap year"); }

S1-4.2

用 switch 语句实现多分支选择结构。

精编讲义 v1#

switch 多分支语法铁律与穿透(Fall-through)特性

必记
  • 表达式类型限制:switch (表达式) 括号内的表达式结果必须是整型、字符型或枚举型,绝不能是实型(float / double)或字符串。
  • case 标号规则:每个 case 后必须是整型或字符型常量表达式(不能含变量或关系表达式如 case x >= 60:),且同一个 switch 内各 case 常量值互不相同。
  • 穿透执行与 break:case 仅起入口标号作用;一旦匹配成功(或匹配 default),若分支末尾没有写 break;,程序会继续顺序往下执行后续所有 case/default 中的语句,直到遇到 break; 或 switch 右花括号结束。
  • default 位置:default 分支可选,且可放在 switch 内的任意位置;若 default 放在最前面或中间且末尾未写 break;,同样会向下穿透执行后面的 case 语句!

switch 缺省 break 穿透与 default 前置典型考题

重点
c
#include <stdio.h>

int main(void) {
    int k = 3, s = 0;
    switch (k) {
        default: s += 1;      /* k=3 无匹配 case,进入 default 但无 break,向下穿透 */
        case 1:  s += 2;
        case 2:  s += 3; break;
        case 4:  s += 4;
    }
    printf("s=%d\n", s);      /* 输出 s=6 (1 + 2 + 3) */
    return 0;
}
随堂自测(3 题 · 共 80 道关联题)展开作答
填空2 分自测不计入学习进度

109 根据以下嵌套的if语句所给条件,填写switch语句,使它完成相同的功能。 (假设mark的取值在1-100之间) if语句: if(mark<60) k=1; else if(mark<70) k=2; else if(mark<80) k=3; else if(mark<90) k=4; else k=5; switch语句: switch(【1】) {【2】k=1;break; case 6 :k=2;break; case 7 :k=3;break; case 8 :k=4;break; 【3】k=5; }

填空2 分自测不计入学习进度

113 以下程序的运行结果是______。 main() {int a=2,b=7,c=5; switch(a>0) {case 1:switch(b<0) {case 1:printf("@");break; case 2:printf("!");break; } case 0:switch(c==5) {case 0:printf("*");break; case 1:printf("#");break; default:printf("#");break; } default:printf("&"); } printf("\n"); }

填空2 分自测不计入学习进度

114 下面程序的运行结果是______。 #include <stdio.h> main() {int x=1,y=0,a=0,b=0; switch(x) {case 1:switch(y) {case 0:a++;break; case 1:b++;break; } case 2:a++;b++;break; } printf("a=%d,b=%d",a,b); }

S1-4.3

选择结构的嵌套。

精编讲义 v1#

if-else 嵌套配对原则与 switch 嵌套

必记
  • else 就近配对原则:在没有花括号 {} 强制界定时,else 总是与它前面最近的、且尚未配对的 if 相配对,与代码的缩进对齐位置完全无关。
  • 改变配对关系:若希望 else 与外层 if 配对,必须用花括号 { ... } 将内层 if 语句包裹成复合语句。
  • switch 嵌套里的 break:在嵌套的 switch 结构中,break; 只跳出它直接所在的那一层内层 switch,不会直接跳出外层 switch。

悬空 else 就近配对真题演示

重点
c
#include <stdio.h>

int main(void) {
    int a = 2, b = -1, c = 2;
    if (a < b)
        if (b < 0) c = 0;
    else c += 1;              /* 注意:此 else 实际与内层 if (b < 0) 配对! */
    printf("c=%d\n", c);      /* 因外层 a < b 为假,内层 if-else 整体跳过,c 仍为 2 */
    return 0;
}
随堂自测(3 题 · 共 54 道关联题)展开作答
填空2 分自测不计入学习进度

阅读下列程序,写出程序的输出结果。 main() {int x=100,a=10,b=20,ok1=5,ok2=0; if(a<b) if(b!=15) if(!ok1) x=1; else if(ok2) x=10; else x=-1; printf("%d\n",x); }

填空2 分自测不计入学习进度

73 以下程序的运行结果是______。 main() {int a,b,c; int s,w,t; s=w=t=0; a=-1;b=3;c=3; if(c>0) s=a+b; if(a<=0) {if(b>0) if(c<=0) w=a-b; } else if(c>0) w=a-b; else t=c; printf("%d %d %d",s,w,t); }

填空2 分自测不计入学习进度

74以下程序的运行结果是______。 main() {int a,b,c,d; a=c=0; b=1; d=20; if(a) d=d-10; else if(!b) if(!c) d=15; else d=25; printf("%d\n",d); }