루아에서 조건문들 상의 논리 관계를 규정할 때 and, or, not 연산자를 사용한다. 예를 들어 변수 x가 -1과 1 사이의 값인지를 검사하려면


if -1 < x and x<1 then … end


와 같이 -1<x 와 x<1 을 and로 연결하면 된다. and 연산자는 조건식 두 개를 받아서 둘 다 true인 경우에만 true가 된다. or연산자는 둘 다 false 인 경우에만 false 가 된다.


x

y

x and y

x or y

true

true

true

true

true

fasle

false

true

fasle

true

false

true

fasle

fasle

false

false


만약 ‘변수 a가 -2보다 작거나 1보다 크다’는 조건을 검사하려면 다음과 같이 하면 될 것이다.


if a<-2 or a>1 then … end


 연산자 not 은 피연산자가 하나인 단항 연산자로서 not x 의 경우 x가 true이면 false가 되고 x가 false이면 true가 된다.


a = nil
b = 0
c = not a
d = not b


위의 예어서 c에 저장되는 값은 true이다. 왜냐면 nil은 false 로 간주되므로 false의 역은 true이기 때문이다. 루아에서는 오직 nil과 false 만 거짓으로 간주된다는 사실에 유의해야 한다. 숫자 0은 true이므로 d에는 false가 대입된다.


local b = 10
if not a then b=b+1 end


위 예에서 a 는 선언되지 않았으므로 nil이다. 따라서 then~end 블럭이 수행된다. not a 가 true이기 때문이다. 이 프로그램이 수행되면 b에는 11이 저장될 것이다.



Posted by 살레시오

댓글을 달아 주세요

  1. FINCHIP 2022.02.08 22:53  댓글주소  수정/삭제  댓글쓰기

    아니요 님
    if a==b
    print("true")
    not
    print("nil)
    이 가능하나요?

 bitwise - not 연산자 ~ 는 단항 연산자로 각 비트를 반전(toggle)시킨다. 즉 1은 0으로, 0은 1로 바꾼다.


표 3.5.4 비트not연산

x

~x

0

1

1

0


이 연산은 전체 비트에 대해서 수행된다. 예를 들면 다음과 같다.


unsigned char uca = 0b10101100, ucb;

ucb = ~uca; // 0b01010011 이 대입된다.


 다음 예제는 위의 네 가지 비트 연산(&, |, ^, ~)을 수행한 결과를 16진수로 보여주는 예제이다. 전 절에서도 소개한 바와 같이 printf()함수에서 정수를 16진수로 표시하는 서식 문자는 ‘%x’이다. 연습을 위해서 16진수 하나하나를 이진수로 바꾼 다음 손으로 연산을 수행해 보기를 권한다.


#include <stdio.h>
typedef unsigned char uchar;
int main(void)
{
  uchar ucA1 = 0xfa;
  uchar ucB1 = 0x3a;
  uchar ucC1 = 0xc1, ucC2;
  uchar ucD1 = 0xbb, ucD2 = 0xa8, ucD3;
  ucC2 = ~ucC1;
  ucD3 = ucD1^ucD2;
  printf("0x%x & 0xf0 = 0x%x\n", ucA1, ucA1 & 0xf0);
  printf("0x%x | 0x8c = 0x%x\n", ucB1, ucB1 | 0x8c);
  printf("~0x%x = 0x%x\n", ucC1, ucC2);
  printf("0x%x ^ 0x%x = 0x%x\n", ucD1, ucD2, ucD3);
}


0xfa & 0xf0 = 0xf0
0x3a | 0x8c = 0xbe
~0xc1 = 0x3e
0xbb ^ 0xa8 = 0x13


여기에서 typedef 명령에 의해서 unsigned char 형은 uchar 로 줄여서 사용할 수 있다. 즉, main()함수 내의 uchar 은 unsigned char 와 같다.


C++ 강좌 전체 목록 >>>


c{c++},n{c0053}

Posted by 살레시오

댓글을 달아 주세요

  루아는 C언어와 다르게 true, false 값만을 가지는 부울형이 있다. C언어에서는 내부적으로 0값을 거짓(false)으로 취급하지만


     ‘루아는 nil 과 false 만을 거짓으로 간주한다


는 점을 유의해야 한다. 정수 0도 루아에서는 진리값이 true이다. C언어에 익숙했다면 참 헷갈리기 쉬운 부분이다.


이 사실을 염두에 두고 루아의 논리연산자를 살펴보자. 루아의 논리연산자는 and, or, not 세 가지가 있다. 각각의 동작을 정리하면 다음과 같다.


  • not A - A가 거짓이면 (즉 nil 혹은 false이면) true, 아니면 false 반환
  • A and B — A가 거짓이면 (즉 nil 혹은 false이면) A를 바로 반환, A가 참이면 B를 반환
  • A or B — A가 참이면 (즉 nil도 false도 아니면) A를 바로 반환, A가 거짓이면 B를 반환


A and B 연산에서 A가 거짓이면 B는 아예 보지도 않고(계산도 안하고) 바로 A를 반환하며, 반대로 A or B 연산에서는 A가 참이면 B는 아예 보지도 않고 바로 A를 반환한다. 이것을 조금만 생각해 보면 not은 항상 부울값(true, false)을 반환하는데 반해서 and와 or는 그 반환값이 부울값이 아닐 수도 있다는 것을 알 수 있다. 몇 가지 예를 들어보면


local a = 1 and 0 — a에는 0값이 이 저장됨

local b = nil and 1 — b에는 nil 이 저장됨

local c = 1 or 0 — c에는 1값이 이 저장됨

local d = nil or 0 — d에는 0 이 저장됨


이것을 응용하면 예를 들어서 함수의 입력인자가 nil인지 아닌지를 따져서 내부변수를 다르게 초기화할 때 용이하다.


---------------------------------------------------

local function Func( xR, yR )

     local x, y

     if xR==nil then

          x = 0

     else

          x = xR

     end

     if yR==nil then

          y = 0

     else

          y = yR

     end

---------------------------------------------------


위와 같은 긴 코드를 다음과 같이 간단하게 한 줄로 줄일 수 있다.


---------------------------------------------------

local function Func( xR, yR )

     local x, y = xR or 0, yR or 0

---------------------------------------------------


또 다른 예로 어떤 테이블이 nil인지 아닌지를 따져서 그 내부 요소를 참조하고자 할 때도 유용하다. 예를 들면


---------------------------------------------------

local x = tLoc.x

---------------------------------------------------


의 경우 만약 tLoc 테이블 자체가 nil 인 경우에는 변수 x에 nil 이 저장되는 것으로 오해하기 쉬운데 실제로는 런타임 에러가 발생하고 프로그램이 멈추게 된다. 개인적으로 코로나로 코딩하면서 초기에 많이 접한 것이 이런 종류의 런타임 에러이다. (반면 tLoc 테이블 자체는 nil이 아닌데 x요소가 없는 경우에는 x에 nil 이 저장되고 런타임 에러는 발생하지 않는다.)

이러한 런타임 에러를 없애고 테이블 자체가 nil일 경우를 처리하려면 예를 들어서 다음과 같이 해야 할 것이다.


---------------------------------------------------

local x

if tLoc == nil then

     x = nil

else

     x = tLoc.x

end

---------------------------------------------------


위와 같은 코드를 and연산자를 이용하면 다음과 같이 한 줄로 바꿀 수 있다.


---------------------------------------------------

     local x = tLoc and tLoc.x

---------------------------------------------------


이와 같이 and 와 or 연산의 특성을 이용하면 프로그램을 간결하게 작성할 수 있다.


Posted by 살레시오

댓글을 달아 주세요