귀하의 문제는이 같은 프로그래밍 언어를 배우는 사람들에게 공통적 인 or
연산자의 오해에서 유래한다. 예, 즉각적인 문제는 x ~= 0 and x ~= 1
으로 작성하여 해결할 수 있지만 시도한 솔루션이 작동하지 않는 이유에 대해 좀 더 자세하게 설명하겠습니다.
x ~=(0 or 1)
또는 x ~= 0 or 1
을 읽을 때 "x는 0 또는 1과 같지 않습니다."문장처럼 자연 스럽습니다. 그 진술의 일반적인 이해에서, 주제는 "동일하지 않은 경우에" "X"술어 나 동사구, 및 "0 또는 1"은 개체, 접속사 합류 가능성의 집합입니다. 동사가있는 주제를 세트의 각 항목에 적용합니다.
그러나, 루아는이 영어 문법의 규칙에 따라,이 작업의 순서에 따라 두 가지 요소의 이진 비교에서 그것을 구문 분석 구문 분석하지 않습니다. 각 연산자에는 평가 될 순서를 결정하는 precedence이 있습니다. or
는 수학 첨가 승산보다 낮은 우선 순위를 갖는 것처럼 ~=
보다 낮은 우선 순위를 갖는다. 모든 것은 괄호보다 우선 순위가 낮습니다. 결과적 x ~=(0 or 1)
을 평가할 때, 인터프리터 제 (인해 괄호) 0 or 1
하고 x ~=
제 계산 결과를 계산할 것이며, 두 번째 예는 x ~= 0
을 계산하고 결과를 적용로서는
그 계산은 or 1
입니다.
logical operator or
"는, 그렇지 않으면, 또는 두 번째 인자를 반환 값이 전무 거짓 다르면 첫 번째 인자를 반환한다." relational operator ~=
은 항등 연산자 ==
의 반대입니다. 그것은 일반적으로 인수를 비교 그렇지 않으면 인수가 다른 유형의 경우 (오른쪽 숫자입니다 x를?)가 true를 반환하고. 이러한 규칙을 사용
, x ~=(0 or 1)
합니다 (or
연산자를 적용한 후) x ~= 0
로 분해되며, 여기서 x는 바람직하지 않다 1을 포함하여 0 이외 인 경우에는이 '참'리턴한다. 다른 형태 x ~= 0 or 1
먼저 평가할 것이다 x ~= 0
(x의 값에 따라서, 참 또는 거짓 복귀 할 수 있음).그런 다음 false or 1
또는 true or 1
중 하나로 분해됩니다. 첫 번째 경우 문은 1
을 반환하고 두 번째 경우 문은 true
을 반환합니다. 루아의 제어 구조는 nil
과 false
만을 거짓으로 간주하고 다른 것이 참이 될 것이라고 생각하기 때문에 항상 if
문을 입력하게됩니다. 이는 어느 것이 든 원하지 않습니다.
프로그래밍 언어에서 제공되는 연산자와 같은 이진 연산자를 사용하여 단일 변수를 값 목록과 비교할 수는 없습니다. 대신 변수를 각 값과 하나씩 비교해야합니다. 이를 수행 할 수있는 몇 가지 방법이 있습니다. 가장 간단한 방법은 De Morgan's laws을 사용하여 2 진 연산자로 계산할 수없는 '1 또는 0이 아닌'진술을 표현할 수 있습니다. 이진 연산자로 쉽게 작성할 수있는 '1이 아닌 0'으로 표현할 수 있습니다.
원하지 않는 (당신은 x가 범위의 정수였다 테스트 한 후 범위를 확인하기 위해 관계 연산자를 사용할 수, 마지막으로
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
:
다른 방법으로,이 값을 확인하기 위해 루프를 사용할 수 있습니다 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
필자는 x >= 0 and x <= 1
이라고 적었습니다. 위의 설명을 이해했다면 이제 왜 0 <= x <= 1
을 쓰지 않았는 지 설명하고이 잘못된 표현이 반환 할 내용을 설명 할 수 있습니다.
감사합니다. 완벽하게 설명합니다! – Ian
프로그래밍 클래스를 가르쳐야합니다. :) – spirulence
루아에 대해 많이 알지는 못하지만 드 모르간 (De Morgan)의 법에 대한 언급과 관련하여 '그렇치 않으면 (x == 1 또는 x == 0)'을 사용할 수 있다고 언급해야합니다. –