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 (b3) 配对printf(B);// 执行结果什么都不输出a1 真 → 进入外层b3 假 → 执行 else错// 实际else 属于内层 ifb3 为假时执行 printf(B)正确是什么用花括号明确归属关系。if (a 1) {if (b 3) printf(A);} else {printf(B); // 明确属于外层 if}!!! 2switch的case标签写成变量或实型int n 2;switch (n) {case 1.5: ... // 错误case 标签必须是整型常量表达式case n: ... //错误不能是变量哪怕它此刻是常量值}正确是什么case后只能是整型常量含字符常量、#define宏或常量表达式。#define TWO 2switch (n) {case 1 1: ... // 正确常量表达式case TWO: ... // 正确宏替换后仍是常量case A: ... // 正确字符常量按 ASCII 整数值处理}!!! 3switch漏写break造成贯穿switch (2) {case 1: printf(一);case 2: printf(二); // 漏写 breakcase 3: printf(三);}// 输出二三错误地贯穿到 case 3正确是什么每个分支末尾加break跳出switch。switch (2) {case 1: printf(一); break;case 2: printf(二); break;case 3: printf(三); break;default: printf(其他); break;}// 输出二!!! 4if条件中把赋值当判断强调选择结构场景if (flag 0) { ... }恒为假if (ch A) { ... }恒为真且修改了ch——逻辑被悄悄改变。正确是什么判断用把常量写到左边可以防错if (0 flag)一旦写成编译直接报错。??? 1switch语句中表达式的结果类型为 ______。任意类型或实型——switch只能对离散的整型值分支实型float/double不能作switch表达式。正确是什么整型含字符型字符按 ASCII 码处理。注意枚举类型本质也是整型可用于switch。??? 2if (a 3, b 5) printf(ok);能否输出 ok______。答不能因为if里不能用逗号或答输出a3,b5——混淆了逗号表达式与多个判断。正确是什么填能输出。(a 3, b 5)是逗号表达式先执行a3再执行b5整个表达式取最后一项的值5非0为真故输出ok。若把逗号换成if (a 3 b 5)则是另一种先算3 (b5)且a 3部分语法错——考试中逗号表达式作if条件是经典陷阱。if (0, 0) // 结果0假不执行if (0, 100) // 结果100真执行这里括号里是逗号表达式逗号运算符规则从左往右依次执行 a3再执行 b5整个逗号表达式的值 最右边表达式的值也就是 5C 语言里非 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 顺序写是两次独立判断语法结构不等价