【问题标题】:While with multiple conditions虽然有多个条件
【发布时间】:2010-05-01 20:16:01
【问题描述】:

有人可以解释为什么while 声明像

while (ch != '\n' || ch != '\t' || ch != ' ') { ... } 

没有像我预期的那样工作?

【问题讨论】:

    标签: c


    【解决方案1】:

    更新:根据您的其他评论,您的表达是错误的 - 它与具有多个条件的“同时”无关。

    ch != '\n' || ch != ' ' 始终为真,无论字符是什么。

    如果字符不是空格,则第二个条件为真,因此 OR 为真。

    如果字符是空格,则第一个条件为真(因为空格不是换行符)并且 OR 为真。

    正确的方法是ch != '\n' && ch != ' ' ...

    旧答案:

    在正常情况下,上面的表达式没有任何问题(假设你想这样做)。

    您的唯一问题是它有时可能不是最优的(例如,如果 b 和 c 在整个循环中从不改变,在这种情况下,您需要将 b!=1 的值缓存在一个变量中)。

    while 有多个条件在一种情况下可能会出现问题 - 如果这些多个条件实际上具有预期的副作用

    这是由于对 || 的懒惰评估和 && 在 C 中,因此如果第一个表达式为真,则不会计算其余表达式,因此不会发生它们的副作用。

    【讨论】:

    • 我现在正在编辑这个问题,所以它只有第二部分......所以你可能想修改你的答案以匹配它。
    【解决方案2】:

    在布尔表达式中使用 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 或空格,请执行此操作”。

    【讨论】:

    • @Mark - +1(部分是因为您编辑了问题以 imorove :))
    【解决方案3】:

    完全正确。但这取决于你想要什么,也许你的意思是&&而不是||

    【讨论】:

    • 我有这样的表达 while(ch!='\n' || ch!='\t' || ch!=' ') ... 如果我遇到,我需要停止阅读字符制表符或空格或输入
    • 但我无法退出循环,请问是什么问题?
    • @lego69:那么@ComputerGuru 是正确的,您正在混淆&&||ch!='\n' || ch!='\t' || ch!=' ' 始终是 true
    • 我觉得你需要!(ch=='\n' || ch=='\t' || ch==' ')
    • lego69:正是我的意思。你需要不是一个 \n 而不是一个 \t 而不是一个
    猜你喜欢
    • 2016-05-18
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多