【发布时间】:2010-05-01 20:16:01
【问题描述】:
有人可以解释为什么while 声明像
while (ch != '\n' || ch != '\t' || ch != ' ') { ... }
没有像我预期的那样工作?
【问题讨论】:
标签: c
有人可以解释为什么while 声明像
while (ch != '\n' || ch != '\t' || ch != ' ') { ... }
没有像我预期的那样工作?
【问题讨论】:
标签: c
更新:根据您的其他评论,您的表达是错误的 - 它与具有多个条件的“同时”无关。
ch != '\n' || ch != ' ' 始终为真,无论字符是什么。
如果字符不是空格,则第二个条件为真,因此 OR 为真。
如果字符是空格,则第一个条件为真(因为空格不是换行符)并且 OR 为真。
正确的方法是ch != '\n' && ch != ' ' ...
旧答案:
在正常情况下,上面的表达式没有任何问题(假设你想这样做)。
您的唯一问题是它有时可能不是最优的(例如,如果 b 和 c 在整个循环中从不改变,在这种情况下,您需要将 b!=1 的值缓存在一个变量中)。
while 有多个条件在一种情况下可能会出现问题 - 如果这些多个条件实际上具有预期的副作用。
这是由于对 || 的懒惰评估和 && 在 C 中,因此如果第一个表达式为真,则不会计算其余表达式,因此不会发生它们的副作用。
【讨论】:
在布尔表达式中使用 not 时应小心,以免 AND 和 OR 混淆。阅读De Morgan's Laws。通常,只有一个否定词更容易阅读。将德摩根定律应用于您的表达式可以得出:
while (!(ch=='\r' && ch=='\n' && ch==' '))
如果您以这种形式编写它,希望您会立即注意到 (ch == '\r' && ch == '\n') 永远不会是真的。
解决办法是改变这个:
while (ch != '\n' || ch != '\t' || ch != ' ')
进入这个:
while (!(ch == '\n' || ch == '\t' || ch == ' '))
您可以将其理解为“虽然我们没有 \n 或 \t 或空格,但请执行此操作...”。请注意,“while not”类似于英语(以及一些编程语言)中的“until”,因此您也可以将其读作“直到我们有 \n 或 \t 或空格,请执行此操作”。
【讨论】:
完全正确。但这取决于你想要什么,也许你的意思是&&而不是||
【讨论】:
&& 和||。 ch!='\n' || ch!='\t' || ch!=' ' 始终是 true。
!(ch=='\n' || ch=='\t' || ch==' ')