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
로 평가된다. x
는 5
이므로 !x
는 0
이 되고 0
은 false
이므로 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
사이인지 테스트할 수 있다. 이것은 사실 두 가지 조건으로써, x
가 10
보다 큰지와 x
가 20
보다 작은지 확인해야 한다.
#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
// 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
x
가 1
이 아닌 경우, 조건은 false
가 되므로 y++
은 평가되지 않는다. 따라서 y++
은 x == 1
일 경우에만 수행되므로 만약 의도한 게 아니라면 주의해야 한다.
논리 OR 연산자 처럼, 초보 프로그래머는 논리 AND 연산자 &&
와 bitwise AND 연산자 &
를 혼동하곤 한다. 이름에 'AND'가 있더라도 다른 기능을 수행하므로 주의해야 한다.
이 포스트의 원문은 http://www.learncpp.com/cpp-tutorial/36-logical-operators/ 입니다.