if-statement - 为什么一个变量与多个值的不相等检查总是返回 true?

标签 if-statement language-agnostic logical-operators control-flow demorgans-law

我的程序中有一个变量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/:

v != "x" && v != "y" && v != "z"

问题

如果始终执行 if block ,则 if block 的条件始终计算为 true。逻辑表达式一定是错误的。

让我们考虑v != "x"|| v != "y"|| v != "z" 对于 v 的每个值。

  • v = "x"时,

    v != "x" 变为 "x"!= "x",这是 false
    v != "y" 变为 "x"!= "y",这是true
    v != "z" 变为 "x"!= "z",这是true

    表达式的计算结果为false ||真实 || true,即true

  • v = "y"时,表达式变为

      "y" != "x" || "y" != "y" || "y" != "z"
    

    true ||假|| true,即true

  • v = "z"时,表达式变为

      "z" != "x" || "z" != "y" || "z" != "z"
    

    true ||真实 || false,即true

  • 对于 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 不是“x”)并且(v 不是“y”)(v 不是“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")

含义

不是((v是“x”)(v 是“y”)(v 是“z”))

这使得逻辑更加明显。

特定语言

某些语言具有用于测试集合中的成员资格的特定构造,或者您可以使用数组/列表操作。

关于if-statement - 为什么一个变量与多个值的不相等检查总是返回 true?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55233392/

相关文章:

c - 我该如何修复 C 中的 if 语句以使其按预期工作?

algorithm - 图中唯一顶点权重的最大总和

language-agnostic - 更喜欢组合而不是继承?

language-agnostic - 您使用什么工具来概述项目?

c# - C# 中的逻辑与条件 AND、OR 之间有什么区别?

php - 逻辑运算符 AND 与 php 正则表达式

c - 使用赋值运算符的 If 子句的行为与使用等于运算符的行为相同

html - 方法比较在 Neko 中失败但适用于 JavaScript

php - 使用 PHP 检查 SQL 行是否存在

c++ - 逻辑与,或 : Is left-to-right evaluation guaranteed?