5.1 KiB
5.1 KiB
C++ 逻辑表达式的构建 讲义
一、 目标
我们的目标,是将生活中的复杂规则(自然语言)准确地翻译成计算机能懂的、没有歧义的逻辑表达式(代码)。
二、 翻译的步骤公式
无论规则多复杂,都可以遵循这三步:
-
拆解:将一句长长的规则,拆分成一个个最小的、不可再分的独立判断条件。
- 例:“一个数字
x是大于4的偶数” -> 拆成x > 4和x是偶数。
- 例:“一个数字
-
观察连接词:找出连接这些独立条件的逻辑关系词。
- “并且”、“同时”、“但” -> 对应 C++ 的
&&。全真才为真,一假即为假。 - “或者”、“至少一个” -> 对应 C++ 的
||。一真即为真,全假才为假。 - “不”、“不是” -> 对应 C++ 的
!,将一个条件的结果取反。
- “并且”、“同时”、“但” -> 对应 C++ 的
-
组合:用 C++ 的逻辑运算符将这些条件按顺序组合起来。
三、 优先级
计算机在计算表达式时,并不是简单地从左到右。也就是存在运算符优先级。记忆口诀:非算关与或
- 基本规则:
!(逻辑非) 的优先级最高,其次是&&(逻辑与),最后是||(逻辑或)。 - 使用括号
()明确意图- 为了避免优先级带来的混淆和错误,当一个表达式中同时包含多个逻辑运算符的时候时,使用括号
()来明确你的逻辑分组,这既能保证程序正确,也让代码更容易阅读。 - 例如:如果你数学或者英语考了100分,并且作业都写完了,我们就去游乐园。
- 错误写法:
数学100分 || 英语100分 && 作业都写完了(错误原因:&&的优先级比||高) - 正确写法:
(数学100分 || 英语100分) && 作业都写完了。
- 为了避免优先级带来的混淆和错误,当一个表达式中同时包含多个逻辑运算符的时候时,使用括号
四、 布尔变量
以后当我们写条件表达式的时候,如果一个判断条件的结果,已经被保存在一个布尔(bool)变量里了,我们就可以直接根据它的语义来去使用。
假设我们已经将两个判断条件,分别存入了布尔变量 a 和 b 中:
bool a = (考试成绩 > 80);// a 代表“考试成绩大于80分”这件事bool b = (综合成绩 > 90);// b 代表“综合成绩大于90分”这件事
当我需要写一个条件表达式来判断:“考试成绩大于80分 并且 综合成绩大于90分”时,我们就可以像翻译句子一样,把自然语言和我们的代码进行一一对照:
- “考试成绩大于80分” → 这正是我们的布尔变量
a所代表的含义。 - “并且” → 在代码中对应的就是逻辑运算符
&&。 - “综合成绩大于90分” → 这正是我们的布尔变量
b所代表的含义。
然后,把它们按顺序串联起来,就得到了最终的表达式:a && b。
这种方式让我们的代码逻辑和自然语言逻辑完全对应。而不需要通过 a == true && b == true 重复进行判断。
五、 整除的逻辑表达式
在编程中,我们经常需要判断一个数能否被另一个数整除。这在判断奇偶性、倍数关系时非常有用。
- 工具:求余运算符
%。a % b的意思是计算a除以b之后的余数。 - 逻辑:如果
a能被b整除,那么a除以b之后没有余数,所以a % b的结果就是0。 - 实例:
9 % 3的结果是0,所以9 % 3 == 0为true,代表9是3的倍数。10 % 3的结果是1,所以10 % 3 == 0为false,代表10不能被3整除。
六、 构建实例
实例1:闰年判断
-
规则:年份能被4整除但不能被100整除,或者能被400整除。
-
第一步:拆解
- 条件A: 年份能被4整除 ->
year % 4 == 0 - 条件B: 年份不能被100整除 ->
year % 100 != 0 - 条件C: 年份能被400整除 ->
year % 400 == 0
- 条件A: 年份能被4整除 ->
-
第二步:观察连接词
- 条件A和B之间是“但”(也就是“并且”)的关系。
- (A和B的整体) 与 条件C之间是“或者”的关系。
-
第三步:组合(使用括号明确优先级)
bool a = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
实例2:数字性质筛选
-
规则:一个数字
x要满足“是3的倍数,但不是偶数”。 -
第一步:拆解,并用布尔变量存起来
- 条件A:“是3的倍数”
bool b = (x % 3 == 0); // "是3的倍数" 的结果存在布尔变量 b 里 - 条件B:“是偶数”
bool c = (x % 2 == 0); // "是偶数" 的结果存在布尔变量 c 里
- 条件A:“是3的倍数”
-
第二步:观察连接词
- 条件A 和 “不是条件B” 之间是“但”(“并且”)的关系。
-
第三步:组合(使用布尔变量)
// 条件A和条件B的结果已经储存在布尔变量中了,可直接根据语义去使用。 bool d = b && !c;