관계 연산자와 논리 연산자
관계 연산자 개요
관계 연산자는 두 값 사이의 관계를 비교하는 데 사용됩니다. 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;
}
연산자 우선순위
관계 연산자와 논리 연산자의 우선순위는 다음과 같습니다.
- NOT
!
- 관계 연산자
<
,>
,<=
,>=
,==
,!=
- AND
&&
- 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;
}
주의사항
- 부동소수점 비교 : 부동소수점 숫자를 비교할 때는 정확한 값 비교보다는 오차 범위를 고려해야 합니다.
#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;
}
- 문자열 비교 : 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;
}
- 비교 연산자 체이닝 : 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;
}
연습 문제
- 사용자로부터 두 수를 입력받아 크기를 비교하는 프로그램을 작성하세요.
- 연도를 입력받아 윤년인지 판단하는 프로그램을 작성하세요. (윤년 : 4로 나누어 떨어지고, 100으로 나누어 떨어지지 않거나 400으로 나누어 떨어지는 해)
- 단락 평가를 이용하여 0으로 나누는 상황을 방지하는 프로그램을 작성하세요.
- 세 개의 정수를 입력받아 가장 큰 수를 출력하는 프로그램을 작성하세요. (if문을 사용하지 않고 관계 연산자와 논리 연산자만 사용하여 구현해보세요)
- 문자열을 입력받아 모음(a, e, i, o, u)의 개수를 세는 프로그램을 작성하세요. (논리 연산자를 활용하여 구현해보세요)
참고자료
- C++ 공식 문서의 연산자 우선순위 표 : C++ Operator Precedence
- 부동소수점 비교에 대한 심화 학습 : Comparing Floating Point Numbers
- C++ 20 삼방 비교 연산자 : Three-Way Comparison Operator
- 비트 연산자 vs 논리 연산자 : Bitwise and Logical Operators in C++