논리연산자 - short-circuit evaluation, sequence point

Kiwoong Park·2023년 7월 14일
0

출처 : C++ 실력 완성 올인원 패키지 Online. (fastcampus)

단축 평가 계산(Short-Circuit evaluation)이란 첫 번쨰 인수가 값을 결정하기에 충분하지 않은 경우에만, 두 번째 인수가 평가되는 일부 프로그래밍 언어(C, C++, JAVA 등)의 일부 논리 연산(AND, OR)의 계산이다.

AND 연산의 경우 좌항이 False 면 무조건(=우항의 bool값과 상관없이) False이기 때문에 우항은 평가되지 않고, OR 연산의 경우 좌항이 True 면 무조건 True이기 때문에 우항이 평가되지 않는 개념

프로그래머로써 단축 평가 계산을 고려하여 비용이 높은 코드는 나중에 평가 되도록 작성하면 좋다!👏

    {
        // short-circuit evaluation
        int num0 = 10, num1(20);
        int num2 = 20, num3(20);
        
        // num0 == num1 이 false이기 때문에 num2 == num3은 평가할 필요가 없어서 평가되지 않는다.
        if (num0 == num1 && num2 == num3)
            cout << "AND" << endl;
        
        // num0 != num1 이 true이기 때문에 num2 == num3은 평가할 필요가 없어서 평가되지 않는다.
        if (num0 != num1 || num2 == num3)
            cout << "OR" << endl;

        // printf("") 의 반환값이 0이기 때문에 false로 평가돼서 우항의 printf("ABC")는 실행되지 않는다.
        printf("") && printf("ABC");
        cout << endl;

        // printf("a") 의 반환값이 1이기 때문에 true로 평가돼서 우항의 printf("ABC")는 실행된다.
        printf("a") && printf("ABC");
        cout << endl;

        // printf("a") 의 반환값이 1이기 때문에 true로 평가돼서 우항의 printf("ABC")는 실행되지 않는다.
        printf("a") || printf("ABC");
        cout << endl;

        // printf("") 의 반환값이 0이기 때문에 false로 평가돼서 우항의 printf("ABC")는 실행된다.
        printf("") || printf("ABC");
        cout << endl;
    }

시퀀스 포인트

AND, OR은 시퀀스 포인트 이므로 좌항의 식이 먼저 실행 및 평가된다는 것이 보장된다.

    {
        // &&, || 연산자는 시퀀스 포인트
    }

논리 연산자 사용시 우선순위 주의

cout << 1 && 2 << endl;을 하게 되면 &&연산자와 <<(left-shift) 비트 연산자의 우선순위 중 비트 연산자의 우선 순위가 더 높기 때문에 반드시 (1 && 2)를 해줘야 한다.

{
        cout.setf(ios_base::boolalpha);
        
        // 10이 bool로 평가 될 경우 true 평가 되어서 false 출력
        cout << !10 << endl;

        // 좌항과 우항의 정수가 둘 다 0이 아니기 때문에 둘 다 true로 평가되어 true && true 가 된다.
        cout << (1 && 2) << endl; // true
    }
    ```
profile
You matter, never give up

0개의 댓글