- if语句的三种形式:单分支、双分支、多分支(else if链)。
- if的嵌套与else 与最近 if 配对规则。
- 条件运算符?:构成的三目表达式。
- switch语句的结构、执行流程、case标签要求、default的摆放。
- C 语言没有布尔类型(C99前):条件判断中非 0 为真、0 为假;关系/逻辑表达式结果为1(真)或0(假)。
- else与离它最近的、尚未配对的if配对:缩进格式不影响配对关系,只有{}能改变。
- switch(表达式)的表达式类型为整型(含char):其各个case标签必须是整型常量表达式,不能是变量;default子句可放在任何位置,不一定在最后。
- switch遇break立即跳出:没有break则"贯穿"执行后续所有case与default,直到switch结束。
- 条件运算符exp1 ? exp2 : exp3:优先级仅高于赋值运算符与逗号运算符,结合方向自右向左,如a > b ? a : c > d ? c : d等价于a > b ? a :(c > d ? c : d)。
- if判断实型数据避免直接判等:浮点误差可能使0.1 + 0.2 == 0.3为假,应判断误差范围(如fabs(x) < 1e-6)。
三、!!! 辨析(错误是什么 / 正确是什么)
!!! 1:悬空 else——else 配对错误
期望else与外层if配对,实际配给了内层if。
int a = 1, b = 2;
if (a == 1)
if (b == 3) printf("A");
else // 这个 else 实际与内层 if (b==3) 配对!
printf("B");
// 执行结果:什么都不输出(a==1 真 → 进入外层;b==3 假 → 执行 else?错)
// 实际:else 属于内层 if,b==3 为假时执行 printf("B")
正确是什么:用花括号明确归属关系。
if (a == 1) {
if (b == 3) printf("A");
} else {
printf("B"); // 明确属于外层 if
}
!!! 2:switch的case标签写成变量或实型
int n = 2;
switch (n) {
case 1.5: ... // 错误:case 标签必须是整型常量表达式
case n: ... //错误:不能是变量,哪怕它此刻是常量值
}
正确是什么:case后只能是整型常量(含字符常量、#define宏或常量表达式)。
#define TWO 2
switch (n) {
case 1 + 1: ... // 正确:常量表达式
case TWO: ... // 正确:宏替换后仍是常量
case 'A': ... // 正确:字符常量按 ASCII 整数值处理
}
!!! 3:switch漏写break造成贯穿
switch (2) {
case 1: printf("一");
case 2: printf("二"); // 漏写 break
case 3: printf("三");
}
// 输出:二三(错误地"贯穿"到 case 3)
正确是什么:每个分支末尾加break跳出switch。
switch (2) {
case 1: printf("一"); break;
case 2: printf("二"); break;
case 3: printf("三"); break;
default: printf("其他"); break;
}
// 输出:二
!!! 4:if条件中把赋值当判断(强调选择结构场景)
if (flag = 0) { ... }恒为假;
if (ch = 'A') { ... }恒为真且修改了ch——逻辑被悄悄改变。
正确是什么:判断用==;把常量写到左边可以防错(if (0 == flag)),一旦写成=编译直接报错。
??? 1:switch语句中表达式的结果类型为 ______。
"任意类型"或"实型"——switch只能对离散的整型值分支,实型(float/double)不能作switch表达式。
正确是什么:整型(含字符型,字符按 ASCII 码处理)。注意枚举类型本质也是整型,可用于switch。
??? 2:if (a = 3, b = 5) printf("ok");能否输出 ok?______。
答"不能,因为if里不能用逗号"或答"输出a=3,b=5"——混淆了逗号表达式与多个判断。
正确是什么:填能输出。(a = 3, b = 5)是逗号表达式,先执行a=3再执行b=5,整个表达式取最后一项的值5,非0为真,故输出ok。若把逗号换成&&:if (a = 3 && b = 5)则是另一种(先算3 && (b=5),且a = 3部分语法错)——考试中逗号表达式作if条件是经典陷阱。
if (0, 0) // 结果0,假,不执行
if (0, 100) // 结果100,真,执行
这里括号里是逗号表达式,逗号运算符规则:
从左往右依次执行 a=3,再执行 b=5
整个逗号表达式的值 =最右边表达式的值,也就是 5
C 语言里:非 0 即为真,5 是真值,条件成立,执行 printf("ok");
??? 3:以下程序的运行结果是 ______。
int x = 1, y = 2;
if (x > y)
if (x > 3) printf("A");
else printf("B");
答"输出B"——凭缩进直觉以为else属于外层if (x > y)。C语言的配对规则与缩进无关:else与最近的未配对 if配对,即内层if (x > 3)。于是内层if-else整体成为外层if的子语句;外层条件1 > 2为假,该子语句被整体跳过。
正确是什么:填什么都不输出。若确实想让else属于外层if,必须用花括号限定:
if (x > y)
{
if (x > 3) printf("A");
} else {
printf("B"); // 加 {} 后才属于外层 if,此时才输出 B
}
int a = 2, b = 3, c = 4;执行if (a < b) if (b < c) c = a; a = b; b = c;后,a、b、c依次为___2 3 2___。
if (x > 0) y = 1; else y = -1;不等价的语句是___D___。
A.y = x > 0 ? 1 : -1;
B.if (x <= 0) y = -1; else y = 1;
C.y = 1; if (x <= 0) y = -1;
D.if (x > 0) y = 1; if (x <= 0) y = -1;
标准结论:if-else不等价于两个连续 if。
if…else:互斥分支,只会走其中一个
两个 if 顺序写:是两次独立判断,语法结构不等价