布尔表达式与 if 语句 (Boolean Expressions and If Statements) — AP Computer Science A CS A 学习指南
适合谁:AP Computer Science A 参加 AP Computer Science A 的考生。
覆盖内容:布尔运算符、短路求值、复合条件、德摩根定律、等价表达式五大核心考点,以及对应选择题、FRQ题型的解题技巧。
前置知识:基础 Java 或任何其他过程式语言编程。
关于练习题:下文「练习题」一节的所有题目均为我们按 AP Computer Science A 风格编写的原创题目 (original problems),仅用于教学。它们不是 College Board 真题的复制,措辞、数值或语境可能不同。请把它们当作练手用;评分细则请对照 College Board 官方 mark scheme。
1. 什么是布尔表达式与if语句?
布尔表达式(Boolean expression)是返回true(真)或false(假)两种值的表达式,是Java选择逻辑的核心基础;if语句(if statement)则是根据布尔表达式的结果选择执行不同代码块的控制结构。本章节是AP CS A考纲Unit 3的唯一内容,占考试总分的10%-15%,选择题中每年固定考3-5题,FRQ的所有算法类题目都会用到条件判断逻辑,属于必须熟练掌握的核心基础考点。
2. 布尔运算符(Boolean Operators)—— &&, ||, !
布尔运算符是用来组合多个布尔值、生成新布尔值的运算符号,Java中核心的三个运算符规则如下:
- 逻辑与(
&&):仅当左右两个操作数都为true时,结果为true,否则为false。例如5>3 && 10<20返回true,5>3 && 10>20返回false。 - 逻辑或(
||):只要左右任意一个操作数为true,结果就为true,仅当两个都为false时结果为false。例如5>10 || 10<20返回true,5>10 || 10>20返回false。 - 逻辑非(
!):一元运算符,对操作数的布尔值取反,true变false,false变true。例如!(5>3)返回false,!(5>10)返回true。
运算优先级从高到低为:! > && > ||,括号可以改变运算顺序,考官推荐复杂条件优先用括号明确优先级,避免逻辑错误。
3. 短路求值(Short-circuit Evaluation)
短路求值是Java对&&和||两个运算符的特殊优化规则:
- 对
&&:如果左侧操作数已经是false,无论右侧是什么,整体结果一定是false,因此右侧的代码不会被执行。 - 对
||:如果左侧操作数已经是true,无论右侧是什么,整体结果一定是true,因此右侧的代码不会被执行。
这个规则的核心作用是提升运行效率,同时可以避免运行时错误,例如:
int a = 0;
boolean res = (a != 0) && (10 / a > 2);
这里a != 0为false,右侧的10/a不会运行,因此不会触发除零异常,如果使用非短路的位运算符&则会直接报错,这是选择题高频考点。
4. 复合条件(Compound Conditions)
复合条件指由多个布尔运算符组合而成的布尔表达式,常用于判断复杂的逻辑场景。编写时需注意两点:
- 严格遵循运算符优先级,不确定的地方一律加括号,避免逻辑偏差。
- 关系运算符的组合要符合逻辑常识,例如判断数字
num是否属于[10,20]区间,不能写成10 <= num <=20(Java不支持连续比较),必须写为num >=10 && num <=20。
举个实际例子:判断用户输入的年份是否是闰年,规则是能被4整除但不能被100整除,或者能被400整除,对应的复合条件为:
(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)
外层的括号不能省略,否则由于&&优先级高于||,逻辑会变成year %4 ==0 && (year%100 !=0 || year%400 ==0),虽然结果一致,但可读性大幅下降,考官阅卷时会判定为不规范写法。
5. 德摩根定律(De Morgan's Laws)
德摩根定律是布尔表达式等价转换的核心规则,也是AP考试必考点,内容为: $$ \neg(A \land B) \equiv \neg A \lor \neg B $$ $$ \neg(A \lor B) \equiv \neg A \land \neg B $$ 对应Java语法的表述为:
!(A && B)等价于!A || !B!(A || B)等价于!A && !B
简单记忆规则:对复合条件取反时,每个子条件分别取反,同时&&和||互换。需要特别注意的是关系运算符取反时要翻转:>变<=,<变>=,==变!=,例如!(num > 5 && num < 10)等价于num <=5 || num >=10,很多考生会漏写等于号导致失分。
6. 等价表达式(Equivalent Expressions)
等价布尔表达式指对于任意输入,两个表达式的返回值完全一致,考试中常见题型为给出原表达式,选择逻辑完全等价的选项。判断等价的常用方法有三种:
- 真值表法:枚举所有可能的输入值,对比两个表达式的输出是否全部一致,适合只有2-3个变量的场景。
- 定律转换法:用德摩根定律、分配律(
A && (B || C) ≡ (A && B) || (A && C))、吸收律(A || (A && B) ≡ A)等规则进行代数转换。 - 反例排除法:找一个输入让两个表达式返回不同结果,直接排除错误选项,是选择题最高效的解题方法。
例如表达式(a > 0 && b >0) || (a>0 && c>0),用分配律可以简化为a>0 && (b>0 || c>0),两个表达式完全等价。
7. 常见陷阱(Common Pitfalls)
- 错误做法:把相等判断符
==写成赋值符=,例如if (grade = 90)。原因:和赋值操作混淆,若判断的是布尔变量,代码不会编译报错但逻辑完全错误。正确做法:条件判断用==,布尔变量可以直接写if (flag)而非if (flag == true),减少写错概率。 - 错误做法:德摩根转换时漏翻转关系运算符,例如
!(num > 10)写成!num > 10或者num <10。原因:对取反的逻辑边界理解不到位,大于的反面是小于等于,不是小于。正确做法:取反时先翻转关系运算符,再加逻辑非,>↔<=、<↔>=、==↔!=。 - 错误做法:忽略短路求值的副作用,例如写
if (x++ >5 || y++ <3)后默认y一定会自增。原因:不知道短路时右侧代码不会执行。正确做法:不要把带副作用的操作(自增、方法调用)放在短路运算符的右侧,若需要两边都执行,改用非短路的&或|。 - 错误做法:复合条件漏加括号导致逻辑偏差,例如想表达「成绩>90 且 出勤>95 或 有竞赛加分」,写为
grade >90 && attendance >95 || bonus == true,实际逻辑变成(grade>90 && attendance>95) || bonus == true和需求一致,但如果需求是「成绩>90 且(出勤>95 或有竞赛加分)」,漏加括号就会逻辑错误。原因:忘记&&优先级高于||。正确做法:所有复合条件都加括号明确运算顺序。
8. 练习题(AP CS A 风格)
题目1(选择题)
下列哪个表达式和!(score >= 60 && score < 90)完全等价?
A. score <60 || score >=90
B. score <60 && score >=90
C. score <=60 || score >90
D. score <=60 && score >90
解答:答案选A。根据德摩根定律,原表达式等价于!(score >=60) || !(score <90),关系运算符取反后>=变<,<变>=,因此结果为score <60 || score >=90,选项B、D用错了运算符,选项C的边界判断错误。
题目2(选择题)
执行以下代码后,变量count的值是多少?
int x = 2, count = 0;
boolean res = (x > 5) || (count++ < 3);
A. 0 B.1 C.2 D.编译错误
解答:答案选B。||左侧x>5为false,因此需要执行右侧代码判断结果,count++ <3执行时先判断count=0 <3为true,再将count自增为1,因此最终count为1。若左侧为true则右侧不执行,count会保持0。
题目3(FRQ小问)
编写一个布尔表达式,判断乘客可以享受机票折扣的条件:年龄age小于12岁或大于65岁,且购票时间buyDays大于等于14天,或者持有VIP卡isVip为true。
解答:正确写法为((age <12 || age >65) && buyDays >=14) || isVip。必须给年龄判断加括号,否则会因为&&优先级高,变成age <12 || (age>65 && buyDays >=14) || isVip,导致小于12岁的乘客无论提前多久购票都能享受折扣,不符合需求。
9. 速查表(Quick Reference Cheatsheet)
| 知识点 | 核心规则 |
|---|---|
| 布尔运算符优先级 | ! > && > ` |
| 短路求值 | &&左假则右不执行;` |
| 德摩根定律 | $!(A && B) \equiv !A | |
| 关系运算符取反 | >↔<=、<↔>=、==↔!= |
| 等价恒等式 | 、$A | |
10. 接下来怎么学
布尔表达式与if语句是后续所有控制结构的基础:后续单元的嵌套if、switch选择结构,for、while循环结构,以及数组、ArrayList的遍历筛选、类方法的逻辑判断都会大量用到本章节的知识点,掌握不牢会直接影响后续80%的考点学习。本章节的选择题技巧性较强,建议多刷官方真题的Unit 3专项题,熟悉常见的等价转换和短路求值考法。 如果有任何知识点疑问、练习题不会做,都可以随时到小欧提问,我们会给你针对性的讲解和配套练习。