在 C++ 语言中,三种逻辑运算符运算(注意这里不是按位运算)规则如下:
| 运算符 | 示例 | 运算规则 | ||||
|---|---|---|---|---|---|---|
逻辑与 (&&) | a && b | 如果 a 和 b 都为真,结果为真,否则为假 | ||||
| 逻辑或 (` | `) | `a | b` | 如果 a 和 b 有一个为真,则结果为真,二者都假,结果为假 | ||
逻辑非 (!) | !a | 如果 a 为假,!a 为真,如果 a 为真,!a 为假 |
判断 a 等于 0 或 b 等于 0 或 c 等于 0 的正确的条件表达式是( )。
这题其实是考逻辑运算的德摩根定律,别被题目描述绕晕了,直接想‘三个都不为 0’的反面就是‘至少有一个为 0’,把‘不等于 0’整体取反,选项 B 就是正解。
很多学生会死盯着‘等于 0’去写表达式,结果写成 D 选项,那是‘三个都为 0’,完全跑偏了。还有人容易把逻辑与和逻辑或的优先级搞混,或者在取反时只反了局部条件,忘了反整个括号里的组合,导致逻辑关系断裂。
这道题考查的是 C++ 中的逻辑运算符(&&、||、!)及其运算规则,核心在于如何正确表达‘至少有一个变量等于 0’这一逻辑命题。
题目要求判断 a、b、c 中是否有 0。从命题逻辑的角度看,‘a 等于 0 或 b 等于 0 或 c 等于 0’的否定形式是‘a 不等于 0 且 b 不等于 0 且 c 不等于 0’。也就是说,如果三个数都不为 0,那么原命题为假;只要有一个为 0,原命题就为真。因此,最直接、最安全的写法就是取反‘三个都不为 0’这个整体条件。
命题人喜欢在这里挖坑,一是利用学生容易把‘等于 0’和‘不等于 0’的否定关系搞反,二是利用逻辑运算符的优先级和结合性,让学生写出看似合理但逻辑错误的表达式。比如,如果只把局部的‘!=0’取反,或者把‘&&’和‘||’的位置弄错,都会导致逻辑含义完全改变。
我们来逐个分析选项: A 选项 !((a!=0) || (b!=0)) 只处理了 a 和 b,完全忽略了 c,逻辑上是不完整的,肯定错。 C 选项 !((a!=0 && b!=0) || (c!=0)) 把 a 和 b 捆绑在一起,只要 c 不为 0 或者 a、b 同时不为 0,整个表达式就为假,这不符合题意。 D 选项 (a==0) && (b==0) && (c==0) 表达的是‘三个都为 0’,这是把‘或’当成了‘且’,也是典型的逻辑错误。
只有 B 选项 !((a!=0) && (b!=0) && (c!=0)) 正确地表达了‘三个都不为 0’的否定,即‘至少有一个为 0’,逻辑严密,完全符合题意。
关于考频与趋势:根据海淀区信息学竞赛 2023 年的数据,逻辑运算符的考查频率为 12 次,在基础语法类题目中占比 18%,属于高频考点。从近三年的趋势看,逻辑运算符的考查形式从单纯的‘判断真假’逐渐转向‘组合条件’,如本题所示,需要学生将多个条件组合起来进行逻辑判断。预计未来几年,逻辑运算符的考查将继续保持高频,且题目难度将有所提升,更倾向于考查学生对于逻辑运算符优先级、结合性以及德摩根定律的灵活运用。