北京海淀区信息学竞赛 · 2023 北京市海淀区信息学竞赛(初赛)试题 第 5 题

选择题 · 答案 B

← 整套速查表 北京海淀区信息学竞赛 全部真题

题目

在 C++ 语言中,三种逻辑运算符运算(注意这里不是按位运算)规则如下:

运算符示例运算规则
逻辑与 (&&)a && b如果 a 和 b 都为真,结果为真,否则为假
逻辑或 (``)`ab`如果 a 和 b 有一个为真,则结果为真,二者都假,结果为假
逻辑非 (!)!a如果 a 为假,!a 为真,如果 a 为真,!a 为假

判断 a 等于 0 或 b 等于 0 或 c 等于 0 的正确的条件表达式是( )。

答案:B

解题思维

这题其实是考逻辑运算的德摩根定律,别被题目描述绕晕了,直接想‘三个都不为 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%,属于高频考点。从近三年的趋势看,逻辑运算符的考查形式从单纯的‘判断真假’逐渐转向‘组合条件’,如本题所示,需要学生将多个条件组合起来进行逻辑判断。预计未来几年,逻辑运算符的考查将继续保持高频,且题目难度将有所提升,更倾向于考查学生对于逻辑运算符优先级、结合性以及德摩根定律的灵活运用。

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断