if-statement - 为什么针对多个值对一个变量进行非等式检查总是返回 true?

标签 if-statement language-agnostic control-flow multiple-languages

我有一个变量 v在我的程序中,它可以从一组值中取任何值

"a", "b", "c", ..., "z"

我的目标是仅在 v 时才执行某些语句不是 "x" , "y" , 或 "z" .

我试过了,
  • 对于类 C 语言(其中相等运算符比较实际字符串值;例如 )

    if (v != "x" || v != "y" || v != "z")
    {
        // the statements I want to be executed
        // if v is neither "x", nor "y", nor "z"
    }
    
  • 用于类似 Pascal 的语言(例如 )

    IF (v != 'x' OR v != 'y' OR v != 'z') THEN
        -- the statements I want to be executed
        -- if v is neither "x", nor "y", nor "z"
    END IF;
    

  • if 条件中的语句 总是被执行 .我做错了什么吗?

    最佳答案

    使用 &&/AND/and ,不是 ||/OR/or :

    v != "x" && v != "y" && v != "z"
    
    问题
    如果 if块总是被执行,if 块的条件总是计算为 true .逻辑表达式一定是错误的。
    让我们考虑一下 v != "x" || v != "y" || v != "z"对于 v 的每个值.
  • v = "x" ,v != "x"变成 "x" != "x" ,这是错误的。
    v != "y"变成 "x" != "y" ,这是真的。
    v != "z"变成 "x" != "z" ,这是真的。
    表达式的计算结果为 false || true || true ,这是真的。
  • v = "y" ,表达式变为
      "y" != "x" || "y" != "y" || "y" != "z"
    
    true || false || true ,这是真的。
  • v = "z" ,表达式变为
      "z" != "x" || "z" != "y" || "z" != "z"
    
    true || true || false ,这是真的。
  • 对于 v 的任何其他值,表达式的计算结果为 true || true || true ,这是真的。

  • 或者,考虑真值表:
           │     A          B          C      │
      v    │  v != "x"   v != "y"   v != "z"  │  A || B || C
    ───────┼──────────────────────────────────┼──────────────
     "x"   │    false      true       true    │     true
     "y"   │    true       false      true    │     true
     "z"   │    true       true       false   │     true
    other  │    true       true       true    │     true
    
    如您所见,您的逻辑表达式的计算结果始终为 true .
    解决方案
    您想要做的是,找到一个计算结果为 true 的逻辑表达式。什么时候(v is not "x") and (v is not "y") and (v is not "z") .
    正确的构造是,
  • 对于类 C 语言(例如 -(可能需要严格相等运算符 !== )、 )
      if (v != "x" && v != "y" && v != "z")
      {
          // the statements I want to be executed
          // if v is neither "x", nor "y", nor "z"
      }
    
  • 用于类似 Pascal 的语言
      IF (v != 'x' AND v != 'y' AND v != 'z') THEN
          -- the statements I want to be executed
          -- if v is neither "x", nor "y", nor "z"
      END IF;
    

  • 德摩根定律
    来自 De Morgan's law ,表达式也可以改写为(使用类似 C 的语法)
    !(v == "x" || v == "y" || v == "z")
    
    意义
    not ((v is "x") or (v is "y") or (v is "z")) .
    这使得逻辑更明显一些。
    特定语言
    某些语言具有用于测试集合成员资格的特定构造,或者您可以使用数组/列表操作。
  • :v NOT IN ('x', 'y', 'z')
  • :["x", "y", "z"].indexOf(v) == -1
  • :v not in {"x", "y", "z"}
  • : !Arrays.asList("x", "y", "z").contains(v)
  • (及以上): !Set.of("x", "y", "z").contains(v)
  • 关于if-statement - 为什么针对多个值对一个变量进行非等式检查总是返回 true?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26337003/

    相关文章:

    c - 我是否必须考虑控制流图中的预处理器指令?

    python - 如何检查 "if condition"并即时分配? (Python)

    java - while 循环在 Java 中不起作用

    javascript - rxjs 可观察管道内的建模和 if/else 模式

    mysql存储过程: flow control

    performance - 最危险的性能瓶颈误解

    language-agnostic - 你最重用的类(class)是什么?

    c# - C#中的简单乒乓球游戏

    java - 修改当前代码以在 > 21 时拒绝用户输入

    language-agnostic - 是否可以在托管操作系统之上运行 "native"代码?