논리 연산자 C++ 자습서 28

논리 연산자 C++

논리 연산은 반복문이나 조건문에서 프로그램의 분기를 결정하는 주요한 요소입니다. 조건식을 평가하여 참과 거짓(true or false)의 결과 값에 따라서 프로그램의 분기를 할 수 있습니다.

가장 기초가 되는 논리 연산은 논리합 (OR), 논리곱(AND) 입니다. 연산자 기호를 처음보면 약간 익숙치 않을 수 있습니다. C++에서 논리합은 || 이고 논리곱은 && 를 사용합니다.

논리합 연산자 (OR)

if 나 while 등의 C++의 조건 검사식에서 논리합 연산자를 사용하는 방법은 다음과 같습니다.

(표현식1 || 표현식2) 의 조건식을 검사했을 때…

표현식1 == true표현식1 == false
표현식2 == truetruetrue
표현식2 == falsetruefalse

논리합 연산자는 양쪽 피연산자 중에 하나만 true (참)가 되어도 true (참) 값을 리턴합니다. 구체적인 예를 한번 들어보겠습니다.

(1>0) || (1==2) // true || false 의 논리합은 true 입니다. OR 연산은 하나의 표현식이 true 면 true 입니다. C++ 에서 내부적으로 true 값은 1 false 는 0 으로 계산됩니다. 이후 ANSI에서 bool 자료형이 추가되긴 하였지만 java 처럼 처음부터 bool 형이 있었던 것이 아니라 bool 형을 달리 사용하지 않는 레거시 코드도 많이 있습니다.

다음 예제는 하나의 값을 읽어서 if 문에서 논리합 연산으로 선택을 합니다. 실용적이지는 않지만 논리합 연산자의 동작을 확인할 수 있습니다.

#include<iostream>

int main()
{

    using std::cout;
    using std::cin;
    using std::endl;

    cout << "숫자를 입력하시오(1~5)" << endl;

    char ch;
    cin >> ch;

    if (ch == '1' || ch == '2')
        cout << "숫자는 1 아니면 2 입니다." << endl;
    else if(ch == '3' || ch == '4' || ch == '5')
        cout << "숫자는 3 아니면 4 아니면 5 입니다." << endl;
    else
        cout << "범위를 벗어났습니다." << endl;

    return 0;

}

논리곱 연산자 (AND)

논리곱 연산자는 && 입니다. 두 표현식 모두가 true 일 때 true 결과값을 리턴합니다.

표현식1 == true표현식1 == false
표현식2 == truetruefalse
표현식2 == falsefalsefalse

다음은 랜덤 숫자를 맞추는 코드입니다. && 논리곱 연산자를 사용하여 입력범위를 제한할 수 있습니다. 0 < myguess < 6 의 뜻을 C++로 표현하면 (myguess > 0) && (myguess < 6) 가 되는데 수학의 식과는 다르지만 같은 의미입니다. 포인트는 표현식의 값이 모두 true 가 되야 한다는 점입니다.

논리 연산자는 조합에 따라 수많은 응용을 할 수 있습니다. 어떤 하나의 기능을 수행하기 위한 연산자가 아니라는 점에 주의합니다. 알고리즘 관련 학습에서 다양한 사용법을 익힐 수 있습니다.

#include<iostream>
#include<cstdlib>
#include<ctime>

int main()
{

    using std::cout;
    using std::cin;
    using std::endl;
    
    srand(time(NULL));
    int randnum = (rand()%5)+1;
    int myguess = 0;

    cout << "1부터 5까지 숫자를 입력하시오" << endl;

    do{

        cin >> myguess;
        if(myguess == randnum)
        {
            cout << "맞았습니다!" << endl;
            break;
        }

    }while((myguess > 0) && (myguess < 6));
 
    cout << "[프로그램 종료...]" << endl; 
    return 0;
}

시퀀스 포인트

시퀀스 포인트는 표현식을 실행하는 기준입니다. 예를 들어서 ‘표현식1 || 표현식2’ 와 같은 논리 연산에서 표현식1이 먼저 수행되고 표현식2가 나중에 수행됩니다. (일반의 컴파일러에서) 표현식1 에서 true 라면 논리합 전체가 true 가 되므로 표현식2를 수행하지 않아도 전체 값이 true 가 됩니다. 이를 시퀀스 포인트(sequence point) 로 오른쪽의 표현식2를 수행하지 않습니다. 그 이유는 이미 답이 나왔는데 추가로 연산할 필요가 없기 때문입니다. 이때 만약 표현식2에 변수나 클래스의 속성을 바꾸는 연산이 들어가 있다면 실행이 되지 않기 때문에 시멘틱 오류를 주의합니다.

논리곱의 경우도 표현식1 이 false 가 되면 표현식2를 연산할 필요도 없이 전체 결과 값은 false가 됩니다. 마찬가지로 시퀀스 포인트로 여기서 끓어지니까 주의합니다.

부정 연산자 (NOT)

부정 연산자는 ! 이며 비트의 반전을 의미합니다. (0 -> 1) 아래 예제는 while문에 카운트를 종료하는 조건을 만들었습니다. !(count == 5) 의 의미는 count 가 5일 때 true 가 되고 이를 반전하면 false 입니다. 다시 말해 count가 5가 나올 때까지 지속합니다.

#include<iostream>

int main()
{

    using std::cout;
    using std::cin;
    using std::endl;

    int count = 0;

    while(!(count == 5))
    {
        cout << "카운트 " << count << endl;
        count++;
    }

    cout << "[프로그램 종료...]" << endl; 
    return 0;
}

요약

논리 연산자에 대해서 알아봤습니다. C++의 논리 연산자는 참과 거짓을 활용해서 프로그램의 제어에 다양성을 부여합니다. 문법적으로 C++ 보다 논리 연산자를 쉽게 사용할 수 있는 파이썬 같은 언어도 있습니다만 C++의 문법에서는 좀 더 원초적인 컴퓨터의 문법같은 느낌도 있습니다.

C/C++의 스타일이 좀 더 빡빡할 수 있겠지만 다른 언어를 사용하게 될 때도 C++ 학습 경험이 도움이 될 것 입니다.

참고문서

C++ Logical Operators (w3schools.com)

Leave a Comment