icon안동민 개발노트

관계 연산자와 논리 연산자


관계 연산자 개요

 관계 연산자는 두 값 사이의 관계를 비교하는 데 사용됩니다. C++에서 제공하는 관계 연산자는 다음과 같습니다.

 1. 같음 ==

 2. 같지 않음 !=

 3. 큼 >

 4. 작음 <

 5. 크거나 같음 >=

 6. 작거나 같음 <=

 이 연산자들의 결과는 항상 불리언(boolean) 타입인 true 또는 false입니다.

관계 연산자 상세 설명

 같음 연산자 ==

 두 값이 같은지 비교합니다.

#include <iostream>
 
int main() {
    int a = 5, b = 5, c = 10;
    
    std::cout << "a == b: " << (a == b) << std::endl;  // 출력: 1 (true)
    std::cout << "a == c: " << (a == c) << std::endl;  // 출력: 0 (false)
    
    return 0;
}

 같지 않음 연산자 !=

 두 값이 다른지 비교합니다.

#include <iostream>
 
int main() {
    int a = 5, b = 5, c = 10;
    
    std::cout << "a != b: " << (a != b) << std::endl;  // 출력: 0 (false)
    std::cout << "a != c: " << (a != c) << std::endl;  // 출력: 1 (true)
    
    return 0;
}

 큼 연산자 >

 왼쪽 값이 오른쪽 값보다 큰지 비교합니다.

#include <iostream>
 
int main() {
    int a = 10, b = 5;
    
    std::cout << "a > b: " << (a > b) << std::endl;  // 출력: 1 (true)
    std::cout << "b > a: " << (b > a) << std::endl;  // 출력: 0 (false)
    
    return 0;
}

 작음 연산자 <

 왼쪽 값이 오른쪽 값보다 작은지 비교합니다.

#include <iostream>
 
int main() {
    int a = 3, b = 7;
    
    std::cout << "a < b: " << (a < b) << std::endl;  // 출력: 1 (true)
    std::cout << "b < a: " << (b < a) << std::endl;  // 출력: 0 (false)
    
    return 0;
}

 크거나 같음 연산자 >=

 왼쪽 값이 오른쪽 값보다 크거나 같은지 비교합니다.

#include <iostream>
 
int main() {
    int a = 5, b = 5, c = 3;
    
    std::cout << "a >= b: " << (a >= b) << std::endl;  // 출력: 1 (true)
    std::cout << "a >= c: " << (a >= c) << std::endl;  // 출력: 1 (true)
    std::cout << "c >= a: " << (c >= a) << std::endl;  // 출력: 0 (false)
    
    return 0;
}

 작거나 같음 연산자 <=

 왼쪽 값이 오른쪽 값보다 작거나 같은지 비교합니다.

#include <iostream>
 
int main() {
    int a = 3, b = 5, c = 3;
    
    std::cout << "a <= b: " << (a <= b) << std::endl;  // 출력: 1 (true)
    std::cout << "a <= c: " << (a <= c) << std::endl;  // 출력: 1 (true)
    std::cout << "b <= a: " << (b <= a) << std::endl;  // 출력: 0 (false)
    
    return 0;
}

논리 연산자 개요

 논리 연산자는 불리언 값들을 조합하거나 반전시키는 데 사용됩니다. C++에서 제공하는 논리 연산자는 다음과 같습니다.

 1. AND &&

 2. OR ||

 3. NOT !

논리 연산자 상세 설명

 AND 연산자 &&

 두 조건이 모두 참일 때 참을 반환합니다.

#include <iostream>
 
int main() {
    bool a = true, b = false;
    
    std::cout << "true && true: " << (true && true) << std::endl;   // 출력: 1 (true)
    std::cout << "true && false: " << (a && b) << std::endl;        // 출력: 0 (false)
    std::cout << "false && false: " << (false && false) << std::endl; // 출력: 0 (false)
    
    return 0;
}

 OR 연산자 ||

 두 조건 중 하나라도 참이면 참을 반환합니다.

#include <iostream>
 
int main() {
    bool a = true, b = false;
    
    std::cout << "true || true: " << (true || true) << std::endl;   // 출력: 1 (true)
    std::cout << "true || false: " << (a || b) << std::endl;        // 출력: 1 (true)
    std::cout << "false || false: " << (false || false) << std::endl; // 출력: 0 (false)
    
    return 0;
}

 NOT 연산자 !

 불리언 값을 반전시킵니다.

#include <iostream>
 
int main() {
    bool a = true;
    
    std::cout << "!true: " << (!a) << std::endl;   // 출력: 0 (false)
    std::cout << "!false: " << (!false) << std::endl; // 출력: 1 (true)
    
    return 0;
}

단축 평가 (Short-circuit Evaluation)

 논리 연산자의 중요한 특성 중 하나는 단축 평가입니다.

 이는 논리 연산의 결과가 첫 번째 피연산자만으로 결정될 수 있을 때, 두 번째 피연산자를 평가하지 않는 것을 말합니다.

  • AND && 연산에서 첫 번째 조건이 거짓이면, 두 번째 조건은 평가하지 않습니다.
  • OR || 연산에서 첫 번째 조건이 참이면, 두 번째 조건은 평가하지 않습니다.
#include <iostream>
 
int main() {
    int x = 5;
    bool result = (x < 0) && (x++ > 0);  // x++는 실행되지 않음
    std::cout << "x: " << x << std::endl;  // 출력: x: 5
    
    result = (x > 0) || (x++ < 0);  // x++는 실행되지 않음
    std::cout << "x: " << x << std::endl;  // 출력: x: 5
    
    return 0;
}

연산자 우선순위

 관계 연산자와 논리 연산자의 우선순위는 다음과 같습니다.

  1. NOT !
  2. 관계 연산자 <, >, <=, >=, ==, !=
  3. AND &&
  4. OR ||
#include <iostream>
 
int main() {
    int a = 5, b = 10, c = 15;
    bool result = a < b && b < c || a > c;
    // 위 식은 ((a < b) && (b < c)) || (a > c)와 동일
    std::cout << "Result: " << result << std::endl;  // 출력: 1 (true)
    
    return 0;
}

주의사항

  1. 부동소수점 비교 : 부동소수점 숫자를 비교할 때는 정확한 값 비교보다는 오차 범위를 고려해야 합니다.
#include <iostream>
#include <cmath>
 
bool isEqual(double a, double b, double epsilon = 0.0001) {
    return std::fabs(a - b) < epsilon;
}
 
int main() {
    double a = 0.1 + 0.2;
    double b = 0.3;
    
    std::cout << "a == b: " << (a == b) << std::endl;
    // 출력: 0 (false)
 
    std::cout << "isEqual(a, b): " << isEqual(a, b) << std::endl;
    // 출력: 1 (true)
    
    return 0;
}
  1. 문자열 비교 : C 스타일 문자열은 == 연산자로 비교할 수 없습니다. strcmp() 함수를 사용해야 합니다.
#include <iostream>
#include <cstring>
 
int main() {
    const char* str1 = "Hello";
    const char* str2 = "Hello";
    
    std::cout << "str1 == str2: " << (str1 == str2) << std::endl;
    // 출력: 0 (false)
 
    std::cout << "strcmp(str1, str2) == 0: " << (strcmp(str1, str2) == 0) << std::endl;
    // 출력: 1 (true)
    
    return 0;
}
  1. 비교 연산자 체이닝 : C++에서는 a < b < c와 같은 연산이 의도한 대로 동작하지 않을 수 있습니다.
#include <iostream>
 
int main() {
    int a = 5, b = 10, c = 15;
    
    bool result = a < b < c;  // (a < b) < c와 동일, 의도한 대로 동작하지 않음
    std::cout << "a < b < c: " << result << std::endl;  // 출력: 1 (true)
    
    bool intended_result = a < b && b < c;
    std::cout << "a < b && b < c: " << intended_result << std::endl;  // 출력: 1 (true)
    
    return 0;
}

연습 문제

  1. 사용자로부터 두 수를 입력받아 크기를 비교하는 프로그램을 작성하세요.
  2. 연도를 입력받아 윤년인지 판단하는 프로그램을 작성하세요. (윤년 : 4로 나누어 떨어지고, 100으로 나누어 떨어지지 않거나 400으로 나누어 떨어지는 해)
  3. 단락 평가를 이용하여 0으로 나누는 상황을 방지하는 프로그램을 작성하세요.
  4. 세 개의 정수를 입력받아 가장 큰 수를 출력하는 프로그램을 작성하세요. (if문을 사용하지 않고 관계 연산자와 논리 연산자만 사용하여 구현해보세요)
  5. 문자열을 입력받아 모음(a, e, i, o, u)의 개수를 세는 프로그램을 작성하세요. (논리 연산자를 활용하여 구현해보세요)

 참고자료