当前位置: 首页 > 知识库问答 >
问题:

为什么一个变量对多个值的非相等检查总是返回true?

鲍国兴
2023-03-14

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

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

我的目标是只在v不是“x”“y”、或“z”时执行一些语句。

我试过了,

>

  • 对于类C语言(等式运算符比较实际字符串值;例如C#、javascript、php)

    if (v != "x" || v != "y" || v != "z")
    {
        // the statements I want to be executed
        // if v is neither "x", nor "y", nor "z"
    }
    

    对于类Pascal语言(如plsql)

    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条件中的语句总是被执行。我做错什么了吗?

  • 共有3个答案

    宗政坚白
    2023-03-14

    对于PHP,您可以使用这样的东西:

    if(strpos('xyz',$v[0])===false)//example 1
    //strpos returns false when the letter isn't in the string
    //returns the position (0 based) of the substring
    //we must use a strict comparison to see if it isn't in the substring
    
    if(!in_array($v[0],array('x','y','z')))//example 2
    
    //example 3
    $out=array('x'=>1,'y'=>1,'z'=>1); //create an array
    if(!$out[$v[0]]) //check if it's not 1
    
    if(!preg_match('/^[xyz]$/',$v))//example 4, using regex
    
    if(str_replace(array('x','y','z'),'',$v[0]))//example 5
    
    
    if(trim($v[0],'xyz'))//example 6
    

    对于Javascript:

    javascript prettyprint-override">if(~'xyz'.search(v[0]))//example 1(.indexOf() works too)
    
    if(!(v[0] in {x:0,y:0,z:0}))//example 2
    
    if(~['x','y','z'].indexOf(v[0]))//example 3, incompatible with older browsers.
    
    if(!/^[xyz]$/.match(v))//example 4
    
    if(v.replace(/^[xyz]$/))//example 5
    

    对于MySQL:

    Select not locate(@v,'xyz'); -- example 1
    
    select @v not in ('x','y','z'); -- example 2
    
    -- repetition of the same pattern for the others
    

    对于C:

    if(!strstr("xyz",v))//example 1, untested
    

    还有更多的方法,我只是太懒了。

    发挥你的想象力,只写一个你更喜欢的!

    颜欣怡
    2023-03-14
    匿名用户

    我想我应该为Bourne shell脚本提供一个答案,因为它的语法有些奇怪。

    在传统的/POSIXsh中,字符串相等性测试是[命令的一项功能(是的,这是一个不同的命令名!)在报价等方面有一些令人讨厌的要求。

    #### WRONG
    if [ "$v" != 'x' ] || [ "$v" != 'y'] || [ "$v" != 'z' ]; then
        : some code which should happen when $v is not 'x' or 'y' or 'z'
    fi
    

    像Ksh、Bash、Zsh等现代shell也有[[,这有点不那么麻烦。

    #### STILL WRONG
    if [[ $v != 'x' || $v != 'y' || $v != 'z' ]]; then
        :  some code which should happen when $v is not 'x' or 'y' or 'z'
    fi
    

    我们应该强调每个令牌周围都有空格的要求,这是许多初学者忽略的(也就是说,如果[[$v或$v,你不能说!='y'命令和运算符周围没有空格),以及引用的明显选择性。没有引用一个值通常不是语法错误,但是如果你没有引用一个需要引用的值,它会导致严重的不希望的语义问题。(更多关于这个在其他地方。)

    这里明显的修复方法是使用

    if [[ ! $v =~ ^(x|y|z)$ ]]; then
        : yeah
    fi
    

    不要忘记值得信赖的旧case语句,这是非常自然的,并且可以追溯到20世纪70年代末:

    case $v in
        x | y | z)
           ;; # don't actually do anything in this switch
        *) # anything else, we fall through to this switch
           yeah
           some more yeah
           in fact, lots of yeah;;
     esac
    

    拖尾的双分号起初会导致动脉瘤,但你会很快康复,学会欣赏,甚至爱它们。POSIX允许您在匹配表达式前放一个开括号,这样您就不会有未配对的右括号,但是这种用法相当不常见。

    (对于非伯恩家族的Unix shell来说,这显然不是一个合适的答案。外壳的C家族——包括仍然有些流行的tcsh——使用一种被认为是“类似C”的语法,但这就像无法区分爱丽丝·库珀和去仙境的女孩;鱼壳有它的自己的特点,我甚至没有能力评论。)

    阮炯
    2023-03-14

    使用

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

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

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

    >

  • v=“x”时,

    v!="x"变成"x"!="x",这是false.
    v!="y"变成"x"!="y",这是真的。
    v!="z"变成"x"!="z",这是真的。

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

    v=“y”时,表达式变为

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

    true||false||true,这是true。

    v=“z”时,表达式变为

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

    或者true | | true | | false,这是真的。

    对于v的任何其他值,表达式求值为true||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

    您要做的是,找到一个逻辑表达式,当

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

    正确的构造是,

    >

      if (v != "x" && v != "y" && v != "z")
      {
          // the statements I want to be executed
          // if v is neither "x", nor "y", nor "z"
      }
    

    对于类Pascal语言plsql

      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;
    

    根据德摩根定律,表达式也可以重写为(使用类C语法)

    !(v == "x" || v == "y" || v == "z")
    

    意思

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

    这使得逻辑更加明显。

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

    >

  • sql:v不在('x','y','z')

    javascript:[“x”、“y”、“z”]。indexOf(v)=-1

    python:v不在{“x”、“y”、“z”}

    java:!数组。asList(“x”、“y”、“z”)。包含(v)

    java-9(及以上版本):!设置属于(“x”、“y”、“z”)。包含(v)

  •  类似资料:
    • 问题内容: 我想检查一个变量是否具有多个值之一。我对为什么在这种情况下不起作用感到困惑。我正在按照给出该示例的教程进行操作,但是当我尝试执行此操作时,它只会根据第一个值检查变量。我的支票怎么了? 问题答案: (“Jesse” or “jesse”) 上面的表达式测试是否评估为。如果是这样,则表达式将返回它;否则,它将返回。该表达式等同于编写: 因为是一个非空字符串,所以它将 始终 求值为并因此返回

    • 我一直在想一些初学者的错误,最后我犯了语句中的错误。我对代码进行了一些扩展: 我已经看到语句返回true,它

    • 我试图创建一个函数,将多个变量与一个整数进行比较,并输出一个由三个字母组成的字符串。我想知道是否有办法将其翻译成Python。那么说: 它将返回以下列表: 这样的事情可能吗?

    • 初学者问题,很抱歉,如果这不是一个合适的地方,请尝试学习在中逻辑是如何工作的,我无法理解这一点 我希望它会说“是的!”如果是A、A、D或D,而是z,但出于某种原因,它会说“是的!”无论第一个符号是什么,都会断开,并且只检查第二个符号是否为z。

    • 问题内容: 我有限的大脑无法理解为什么会这样: 在PHP中,等效比较返回false: 问题答案: 从文档中: 对于Unicode和字符串类型,当且仅当 x 是 y 的子字符串时,才为true 。等效测试为。注意, x 和 y 不必是同一类型;因此,将返回。 空字符串始终被视为任何其他字符串的子字符串,因此将返回。 通过查看呼叫,您正在使用2.x。 要更深入,请看一下字节码: 是我们进行布尔运算并查