Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 不等于Lua中的这个或那个_Variables_If Statement_Lua_Operators - Fatal编程技术网

Variables 不等于Lua中的这个或那个

Variables 不等于Lua中的这个或那个,variables,if-statement,lua,operators,Variables,If Statement,Lua,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 有办法做到这一点吗?对于只测试两个值,我个人会这样做: if x ~= 0 and x ~= 1 then

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

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

有办法做到这一点吗?

对于只测试两个值,我个人会这样做:

if x ~= 0 and x ~= 1 then
    print( "X must be equal to 1 or 0" )
    return
end
如果您需要针对两个以上的值进行测试,我会将您的选择填充到一个表中,就像这样:

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

x~=0或1
((x~=0)或1)

x~=(0或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 )

您的问题源于对
运算符的误解,这是学习此类编程语言的人常见的。是的,你眼前的问题可以通过写作来解决,但我会更详细地解释为什么你尝试的解决方案不起作用

当你阅读
x~=(0或1)
x~=0或1
时,很自然地会像解析句子“x不等于0或1”一样解析它。在对该陈述的一般理解中,“x”是主语,“不等于”是谓语或动词短语,“零或一”是宾语,一组由连词连接的可能性。将主语和动词应用于集合中的每个项目

然而,Lua并没有根据英语语法规则来解析它,而是根据它的操作顺序对两个元素进行二进制比较来解析它。每个运算符都有一个确定其求值顺序的值
的优先级低于
~=
,就像数学中加法的优先级低于乘法一样。所有内容的优先级都低于括号

因此,当计算
x~=(0或1)
时,解释器将首先计算
0或1
(由于括号),然后计算第一次计算的结果,在第二个示例中,它将计算
x~=0
,然后将该计算的结果应用于
或1

“如果此值不同于nil和false,则返回其第一个参数;否则,或返回其第二个参数”。是相等运算符的倒数
==
;如果其参数是不同类型的(x是一个数字,对吗?),则返回true,否则会正常比较其参数

使用这些规则,
x~=(0或1)
将分解为
x~=0
(在应用
运算符后),如果x不是0,包括1,则返回“true”,这是不需要的。另一种形式,
x~=0或1
将首先计算
x~=0
(它可能返回true或false,具体取决于x的值)。然后,它将分解为
false或1
true或1
之一。在第一种情况下,语句将返回
1
,在第二种情况下,语句将返回
true
。因为Lua的控制结构只考虑了代码> NIL和<代码> false <代码>是错误的,其他任何事情都是真的,如果< < /C> >语句,这将始终进入<代码>,这也不是您想要的。 无法使用编程语言中提供的二进制运算符将单个变量与值列表进行比较。相反,您需要逐个比较变量和每个值。有几种方法可以做到这一点。最简单的方法是将语句“not one or zero”(不能用二进制运算符计算)表示为“not one and not zero”(可以用二进制运算符轻松编写):

if x ~= 1 and x ~= 0 then
    print( "X must be equal to 1 or 0" )
    return
end
或者,可以使用循环检查这些值:

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
最后,您可以使用关系运算符检查一个范围,然后测试x是否是该范围内的整数(您不需要0.5,对吗?)


如果没有(x>=0和x=0和x,谢谢,这很好地解释了它!如果你还没有,你应该教编程课。:)我对Lua不太了解,但也许你应该提到,如果没有(x==1或x==0),那么你也可以使用
,与你提到的德摩根定律相关。
if not (x >= 0 and x <= 1 and math.floor(x) == x) then
    print( "X must be equal to 1 or 0" )
    return
end