S1-4.1
用 if 语句实现选择结构。
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 道关联题)展开作答
以下程序输出 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; }
70 以下程序对输入的两个整数,按从大到小顺序输出,请分析程序填空。 main() {int x,y,z; scanf("%d,%d",&x,&y); if(【1】) {z=x;【2】} printf("%d,%d",x,y); }
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 语句实现多分支选择结构。
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 前置典型考题
重点#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 道关联题)展开作答
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; }
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"); }
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
选择结构的嵌套。
if-else 嵌套配对原则与 switch 嵌套
必记else就近配对原则:在没有花括号{}强制界定时,else总是与它前面最近的、且尚未配对的if相配对,与代码的缩进对齐位置完全无关。- 改变配对关系:若希望
else与外层if配对,必须用花括号{ ... }将内层if语句包裹成复合语句。 switch嵌套里的break:在嵌套的switch结构中,break;只跳出它直接所在的那一层内层switch,不会直接跳出外层switch。
悬空 else 就近配对真题演示
重点#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 道关联题)展开作答
阅读下列程序,写出程序的输出结果。 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); }
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); }
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); }