Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 논리 연산자 완벽 정리: ||, &&, ! 연산자의 동작 원리

논리 연산자(logical operator)의 개념은 매우 간단합니다. 프로그램이 여러 조건을 바탕으로 의사결정을 내릴 수 있도록 도와주는 연산자로, 각 피연산자는 참(true) 또는 거짓(false)으로 평가될 수 있는 하나의 조건으로 간주됩니다. 그리고 이 조건들의 값을 종합하여 op1 연산자 op2 또는 !op1 형태의 전체 표현식 결과가 결정됩니다.

논리 OR 연산자 (||)

논리 OR 연산자(||)는 두 피연산자 중 하나라도 참이면 true를 반환하고, 둘 다 거짓일 경우에만 false를 반환합니다. 피연산자는 평가되기 전에 bool 타입으로 암시적으로 변환되며, 결과값의 타입 역시 bool입니다. 논리 OR는 왼쪽에서 오른쪽으로 결합(left-to-right associativity)됩니다.

피연산자들이 반드시 같은 타입일 필요는 없지만, 정수형(integral) 또는 포인터(pointer) 타입이어야 합니다. 실제 코드에서는 주로 관계식(relational expression)이나 동등 비교식(equality expression)이 피연산자로 사용됩니다.

흥미로운 점은 첫 번째 피연산자가 완전히 평가되고 모든 부수 효과(side effect)가 처리된 후에야 나머지 평가가 진행된다는 것입니다. 두 번째 피연산자는 첫 번째 피연산자가 false(0)로 평가되는 경우에만 평가되는데, 이러한 방식을 단락 평가(short-circuit evaluation)라고 부릅니다. 덕분에 논리 OR 표현식이 이미 참이라면 두 번째 피연산자의 불필요한 평가를 건너뛸 수 있어 성능상 이점도 있습니다.

논리 AND 연산자 (&&)

논리 AND 연산자(&&)는 두 피연산자가 모두 참일 때만 true를 반환하고, 하나라도 거짓이면 false를 반환합니다. 마찬가지로 피연산자는 평가 전에 bool 타입으로 암시적으로 변환되고, 결과값의 타입은 bool입니다. 결합 방향 역시 왼쪽에서 오른쪽이며, 피연산자는 정수형 또는 포인터 타입이어야 하고 보통 관계식이나 동등 비교식이 사용됩니다.

AND 연산에서도 첫 번째 피연산자가 먼저 완전히 평가되고, 두 번째 피연산자는 첫 번째 피연산자가 true(0이 아닌 값)로 평가되는 경우에만 평가됩니다. 즉, 논리 AND 표현식이 이미 거짓으로 확정되면 두 번째 피연산자는 아예 평가하지 않으므로 불필요한 연산을 줄일 수 있습니다.

논리 부정 연산자 (!)

논리 부정 연산자(!)는 피연산자의 의미를 정반대로 뒤집습니다. 피연산자는 산술(arithmetic) 타입 또는 포인터 타입, 혹은 해당 타입으로 평가되는 표현식이어야 하며, bool 타입으로 암시적으로 변환됩니다. 변환된 피연산자가 false이면 결과는 true가 되고, true이면 결과는 false가 됩니다. 결과값의 타입은 bool입니다.

예제 코드

#include<iostream>
using namespace std;
int main() {
    bool x = true, y = false;
    cout << (x || y) << endl;
    cout << (x && y) << endl;
    cout << (!x) << endl;
    return 0;
}

실행 결과

위 코드를 실행하면 다음과 같은 출력을 얻습니다.

1
0
0

결과 해설

x는 true, y는 false이므로 세 연산의 결과는 다음과 같이 설명할 수 있습니다.

  • (x || y): 두 값 중 하나(x)가 참이므로 OR 연산의 결과는 참, 즉 1
  • (x && y): 두 값이 모두 참이 아니므로(y가 거짓) AND 연산의 결과는 거짓, 즉 0
  • (!x): 참(x)을 부정하면 거짓이 되므로 0

이처럼 C++의 논리 연산자는 조건문(if, while 등)과 함께 사용되어 복잡한 판단 로직을 간결하게 표현할 수 있게 해주며, 단락 평가 특성을 활용하면 안전하고 효율적인 코드를 작성할 수 있습니다.