소년코딩

03.06 - 논리 연산자 (Logical operators)

관계 연산자(relational operator)는 특정 조건이 참(true)인지 거짓(false)인지를 테스트할 수 있지만 한 번에 하나의 조건만 테스트할 수 있다. 그러나 한 번에 여러 가지 조건을 테스트 해야 하는 경우가 있다. 예를 들어, 복권에 당첨되었는지 확인하려면 선택한 모든 숫자를 비교해야 한다. 즉, 다중 조건이 참인지 아닌지를 확인해야 한다.

논리 연산자(logical operator)는 여러 조건을 테스트할 수 있는 기능을 제공한다.

C++에는 3가지 논리 연산자가 있다.

Operator Symbol Form Operation
Logical NOT ! !x true if x is false, or false if x is true
Logical AND && x && y true if both x and y are true, false otherwise
Logical OR l l x l l y true if either x or y are true, false otherwise

논리 부정 (Logical NOT)

'02.07 - Boolean 값과 if 문의 소개' 포스트에서 이미 논리 부정 연산자를(logical not operator: !) 사용한 적이 있다.

Logical NOT (operator !)
Right operand Result
true false
false true

논리 부정 연산자( !) 연산자가 피연산자 true를 평가하면 false가 된다. 반대로, false를 평가하면 true가 된다. 즉, 논리 부정 연산자(!)는 부울(bool) 값을 반전시킨다.

! 연산자는 논리적으로 사용된다:
bool bTooLarge = (x > 100); // bTooLarge is true if x > 100
if (!bTooLarge)
    // do something with x
else
    // print an error
한 가지 주의할 점은 논리 부정 연산자(!)는 우선순위가 매우 높다:
int x = 5;
int y = 7;

if (! x == y)
    cout << "x does not equal y";
else
    cout << "x equals y";

x equals y

위 프로그램은 "x equals y"를 출력한다. ! 연산자가 == 연산자보다 우선순위가 높으므로 x == y는 실제로 (!x) == y로 평가된다. x5이므로 !x0이 되고 0false이므로 else 문이 실행된다.

올바른 방법:
int x = 5;
int y = 7;

if (!(x == y))
    cout << "x does not equal y";
else
    cout << "x equals y";

x does not equal y

위처럼 하면, x == y가 먼저 평가된 다음 논리 부정 연산자 !가 부울 값을 반전시킨다.

항상 괄호()를 사용하여 의도를 분명히 하는 것이 좋다.


논리 OR (Logical OR) - 논리합

논리 OR 연산자는 두 조건 중 하나가 참(true)인지 테스트하는 데 사용한다. 왼쪽 피연산자가 true로 평가되거나, 오른쪽 피연산자가 true로 평가되면 논리 OR 연산자(||)는 true를 반환한다.

Logical OR (operator l l)
Left operand Right operand Result
false false false
false true true
true false true
true true true
예:
#include <iostream>

int main()
{
    std::cout << "Enter a number: ";
    int value;
    std::cin >> value;

    if (value == 0 || value == 1)
        std::cout << "You picked 0 or 1" << std::endl;
    else
        std::cout << "You did not pick 0 or 1" << std::endl;
    return 0;
}

위 프로그램은 논리 OR 연산자를 사용하여 왼쪽 조건(value == 0) 또는 오른쪽 조건(value == 1)이 true인지 테스트한다. 둘 중 하나라도 true이면 논리 OR 연산자(||)는 true로 평가된다. 이는 if 문이 실행됨을 의미한다. 어느 쪽도 true가 아닌 경우, 논리 OR 연산자는 false로 평가되어 else문이 실행된다.

여러 조건에도 논리 OR 연산자를 사용할 수 있다:
if (value == 0 || value == 1 || value == 2 || value == 3)
     std::cout << "You picked 0, 1, 2, or 3" << std::endl;

초보 프로그래머는 논리 OR 연산자||와 bitwise OR 연산자|를 혼동하곤 한다. 이름에 'OR'이 있더라도 다른 기능을 수행하므로 주의해야 한다.


논리 AND (Logical AND) - 논리곱

논리 AND 연산자는 두 조건이 모두 참인지 여부를 테스트하는 데 사용한다. 두 조건이 모두 참(true)이면 논리 AND 연산자(&&)는 참(true)을 반환한다. 그렇지 않으면 거짓(false)을 반환한다.

Logical AND (operator &&)
Left operand Right operand Result
false false false
false true false
true false false
true true true

예를 들어, 변수 x의 값이 10에서 20 사이인지 테스트할 수 있다. 이것은 사실 두 가지 조건으로써, x10보다 큰지와 x20보다 작은지 확인해야 한다.

#include <iostream>

int main()
{
    std::cout << "Enter a number: ";
    int value;
    std::cin >> value;

    if (value > 10 && value < 20)
        std::cout << "Your value is between 10 and 20" << std::endl;
    else
        std::cout << "Your value is not between 10 and 20" << std::endl;
    return 0;
}

위 프로그램은 논리 AND 연산자(&&)를 사용해서 왼쪽 조건(value > 10)과 오른쪽 조건(value < 20)이 모두 true인지 테스트한다. 둘 다 true이면 논리 AND 연산자(&&)는 true로 평가된다. 이는 if 문이 실행됨을 의미한다. 둘 다 true가 아니거나 하나면 true면, 논리 AND 연산자는 false로 평가되어 else 문이 실행된다.

논리 OR 연산자처럼 논리 AND 연산자도 여러 조건을 연결할 수 있다:
if (value > 10 && value < 20 && value != 16)
    // do something
else
    // do something else

위 조건이 모두 true이면 if 문이 실행된다. 조건 중 하나라도 거짓이면 else 문이 실행된다.


단락 평가 (Short circuit evaluation)

논리 AND 연산자(&&)가 true로 평가되려면 두 피연산자가 모두 true여야 한다. 만약 첫 번째 피연산자가 false로 평가되면, 논리 AND 연산자는 두 번째 피연산자가 true인지 false인지와 관계없이 false를 반환해야 한다는 것을 알 된다. 그러므로 논리 AND 연산자는 즉시 false를 반환한다. 이 경우를 단락 평가(short circuit evaluation)라고 하며 주로 최적화 목적으로 수행된다.

if (x == 1 && y++ == 2)
    // do something

x1이 아닌 경우, 조건은 false가 되므로 y++은 평가되지 않는다. 따라서 y++x == 1일 경우에만 수행되므로 만약 의도한 게 아니라면 주의해야 한다.

논리 OR 연산자 처럼, 초보 프로그래머는 논리 AND 연산자 &&와 bitwise AND 연산자 &를 혼동하곤 한다. 이름에 'AND'가 있더라도 다른 기능을 수행하므로 주의해야 한다.


cpp 이 포스트의 원문은 http://www.learncpp.com/cpp-tutorial/36-logical-operators/ 입니다.

댓글 로드 중…

블로그 정보

소년코딩 - 소년코딩

소년코딩, 자바스크립트, C++, 물리, 게임 코딩 이야기

최근에 게시된 이야기