不等于这个或在Lua中

Ian*_*Ian 19 variables lua if-statement operators

我试图验证变量不等于这个或那个.我尝试使用以下代码,但都不起作用:

if x ~=(0 or 1) then
    print( "X must be equal to 1 or 0" )
    return
end


if x ~= 0 or 1 then
    print( "X must be equal to 1 or 0" )
    return
end
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

Kev*_*eer 50

您的问题源于对or运算符的误解,这对于学习这样的编程语言的人来说是很常见的.是的,您的直接问题可以通过编写解决x ~= 0 and x ~= 1,但我会详细介绍您的尝试解决方案无效的原因.

当你阅读x ~=(0 or 1)x ~= 0 or 1解析这个时,就像句子"x不等于零或一"一样.在对该陈述的普通理解中,"x"是主语,"不等于"是谓词或动词短语,而"零或一"是对象,一组由连词加入的可能性.您将带有动词的主题应用于集合中的每个项目.

但是,Lua并没有根据英语语法规则对其进行解析,它根据其操作顺序对两个元素进行二进制比较来解析它.每个运算符都有一个优先级,决定了它的计算顺序. or优先级低于~=数学中的加法优先级而不是乘法.一切都优先于括号.

因此,在评估时x ~=(0 or 1),解释器将首先计算0 or 1(因为括号),然后x ~=计算第一个计算的结果,在第二个示例中,它将计算x ~= 0然后将计算结果应用于or 1.

逻辑运算符or "如果这个值是从零和假不同返回第一个参数;否则,或返回第二个参数".的关系运算符~=是相等运算符的逆==; 如果它的参数是不同的类型(x 数字,对吧?),它返回true ,否则通常比较它的参数.

使用这些规则,x ~=(0 or 1)将分解为x ~= 0(在应用or运算符之后),如果x不是0,包括1,则返回'true',这是不合需要的.另一种形式, x ~= 0 or 1将首先评估x ~= 0(可能返回true或false,具体取决于x的值).然后,它将分解为false or 1或之一 true or 1.在第一种情况下,语句将返回1,在第二种情况下,语句将返回true.因为Lua中的控制结构只考虑nil并且false是假的,而其他任何事情都是真的,这将始终进入if语句,这也不是你想要的.

您无法使用编程语言中提供的二元运算符来将单个变量与值列表进行比较.相反,您需要逐个将变量与每个值进行比较.有几种方法可以做到这一点.最简单的方法是使用De Morgan定律将"不是一个或零"(不能用二元运算符求值)的语句表达为"不是一个而不是零",这可以简单地用二元运算符编写:

if x ~= 1 and x ~= 0 then
    print( "X must be equal to 1 or 0" )
    return
end
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用循环来检查这些值:

local x_is_ok = false
for i = 0,1 do 
    if x == i then
        x_is_ok = true
    end
end
if not x_is_ok then
    print( "X must be equal to 1 or 0" )
    return
end
Run Code Online (Sandbox Code Playgroud)

最后,您可以使用关系运算符来检查范围,然后测试x是范围内的整数(您不想要0.5,对吧?)

if not (x >= 0 and x <= 1 and math.floor(x) == x) then
    print( "X must be equal to 1 or 0" )
    return
end
Run Code Online (Sandbox Code Playgroud)

请注意,我写道x >= 0 and x <= 1.如果你理解了上面的解释,你现在应该能够解释为什么我没有写0 <= x <= 1,以及这个错误的表达会返回什么!

  • 如果你还没有,你应该教编程课程.:) (2认同)
  • 我对 Lua 不太了解,但也许你应该提到,与你提到的德摩根定律有关,也可以使用“if not (x == 1 or x == 0) then”。 (2认同)

spi*_*nce 9

为了只测试两个值,我个人会这样做:

if x ~= 0 and x ~= 1 then
    print( "X must be equal to 1 or 0" )
    return
end
Run Code Online (Sandbox Code Playgroud)

如果你需要测试两个以上的值,我会把你的选择填充到一个像集合一样的表中,如下所示:

choices = {[0]=true, [1]=true, [3]=true, [5]=true, [7]=true, [11]=true}

if not choices[x] then
    print("x must be in the first six prime numbers")
    return
end
Run Code Online (Sandbox Code Playgroud)


Lar*_*tle 5

x ~= 0 or 1 是相同的 ((x ~= 0) or 1)

x ~=(0 or 1)与 相同(x ~= 0)

尝试这样的事情。

function isNot0Or1(x)
    return (x ~= 0 and x ~= 1)
end

print( isNot0Or1(-1) == true )
print( isNot0Or1(0) == false )
print( isNot0Or1(1) == false )
Run Code Online (Sandbox Code Playgroud)