C++는 널리 사용되는 프로그래밍 언어이지만 프로그래밍 오류가 가장 많이 발생하는 언어이기도 합니다. 이러한 오류의 대부분은 논리적 오류로 인해 발생합니다. 특히 비교 연산 중에 발생하는 오류는 코드의 정확성과 신뢰성에 영향을 미칠 수 있습니다.
C++ 언어에는 많은 초보 개발자가 간과하는 특정 비교 오류가 하나 있습니다. 이 오류는 여러 비교를 수행할 때 연산자가 작동하는 방식을 잘못 이해하여 발생합니다. 이 일반적인 실수를 피하는 방법과 이러한 오류가 발생하는 이유를 알아보세요.
C++의 비교
C++ 프로그래밍 언어는 비교 연산자와 같은 기본 연산과 함께 다양한 기능과 도구를 제공합니다. 비교 연산자는 데이터를 서로 비교하는 데 사용할 수 있는 프로그래밍 언어의 특수 연산자입니다. 개발자는 특히 알고리즘을 만들 때 이러한 연산자를 자주 사용합니다.
비교 연산자는 일상 생활의 다양한 예에서 볼 수 있습니다. 예를 들어 식료품점에서 쇼핑할 때 가격을 비교할 때 이러한 연산자를 사용합니다. 한 제품의 가격이 다른 제품보다 낮으면 해당 제품을 선택합니다.
if-else 문에서 비교 연산자를 자주 볼 수 있습니다. 비교 연산자는 한 값이 다른 값보다 크거나 작거나 같은지 확인하기 위해 사용하는 연산자입니다. 간과해서는 안 되는 아주 작지만 중요한 세부 사항이 있습니다. 비교 표현식의 결과는 부울 값인 참 또는 거짓을 반환합니다. 이러한 값은 프로그래밍에서 제어 구조의 기본 구성 요소 중 하나입니다.
예를 들어, C++ 프로그래밍 언어에서 “==” 연산자는 두 값이 같은지 확인합니다. 값이 같으면 결과는 참을 반환합니다. 그렇지 않으면 결과는 거짓이 됩니다.
if (a == b)
{
return true;
}
else
{
return false;
}
비교 문제의 예
C++ 초보자가 흔히 저지르는 실수 중 하나는 비교 연산자를 사용하는 것입니다. 이러한 연산자를 사용하면 프로그래머는 두 값을 비교하고 그 비교 결과에 따라 다른 연산을 수행할 수 있습니다. 그러나 이러한 연산자를 잘못 사용하면 예기치 않은 오류가 발생할 수 있습니다.
예를 들어, 표현식 3 < 15 < 10은 수학적으로 올바르지 않지만 C++에서는 그 결과를 참으로 간주합니다. 다음과 같은 간단한 테스트 프로그램을 작성하여 이를 증명할 수 있습니다.
먼저 test.cpp라는 파일을 만듭니다. 선호하는 코드 편집기를 사용하여 이 파일을 열고 다음 코드를 추가합니다.
#include <iostream>
int a = 15;
int main()
{
if (3 < a < 10)
{
std::cout << "foo" << std::endl;
}
else
{
std::cout << "boo" << std::endl;
}
return 0;
}
이 명령을 사용하여 코드를 컴파일하고 실행할 수 있습니다:
g++ test.cpp -o Test
이제 Test라는 프로그램이 생겼습니다. 프로그램을 실행하고 출력을 살펴봅니다.
C++는 이 프로그램을 실행할 때 3, 15, 10을 참으로 간주합니다. 수학적으로 틀린 진술인데도 결과가 이런 식으로 나오는 이유는 무엇일까요?
C++에서 비교 문제의 원인
대부분의 프로그래밍 언어와 마찬가지로 C++는 코드를 왼쪽에서 오른쪽으로 읽습니다. 각 비교 연산자는 부울 값을 생성합니다. 부울 값은 단순히 참과 거짓을 의미하는 것이 아니라 수학적으로 동등한 의미를 갖습니다.
컴퓨터의 작동 원리는 1과 0에 의존합니다. 컴퓨터에게 어떤 결과는 참 또는 거짓입니다. 컴퓨터 프로그램은 일반적으로 숫자 1을 참으로, 숫자 0을 거짓으로 취급합니다.
비교 문제를 다시 살펴보고 문장을 왼쪽에서 오른쪽으로 읽으면 두 가지 다른 비교가 있음을 알 수 있습니다. 첫 번째 비교는 숫자 3과 3이 15보다 작으므로 이것은 참값입니다.
두 번째 비교는 이 결과와 숫자 사이의 비교입니다. 숫자 비교를 수행해야 하므로 C++는 자동으로 부울 참값을 1이 10보다 작으므로 전체 결과는 참값으로 변환합니다.
결론적으로, 수학적 오류처럼 보이지만 이 문장은 C++와 컴퓨터에서 사실입니다.
C++에서 비교 문제를 해결하는 방법
C++는 대부분의 다른 프로그래밍 언어와 마찬가지로 논리적 비교를 위해 전통적인 수학과는 다른 구문을 사용합니다. 수학 표현식 3 < a < 15는 “3은 a보다 작고 a는 15보다 작다”는 의미입니다. 하지만 앞서 살펴본 것처럼 C++에서는 이 표현식을 다르게 해석합니다.
C++에서 표현하려면 & 연산자를 사용합니다. 그런 다음 부울 표현식을 서로 연결하고 AND를 나타내는 &, OR을 나타내는 ||, NOT을 나타내는 ! 등의 연산자를 사용하여 논리를 구축할 수 있습니다. Java와 같은 언어도 동일한 논리 연산자를 사용합니다.
올바른 논리 연산자를 사용하면 이전 예제의 버그를 수정할 수 있습니다.
#include <iostream>
int a = 15;
int main()
{
if (3 < a && a < 10)
{
std::cout << "foo" << std::endl;
}
else
{
std::cout << "boo" << std::endl;
}
return 0;
}
이제 이 코드는 값 a가 3보다 큰지, 값 a보다 작은지 테스트합니다. 프로그램을 컴파일하고 실행하고 결과를 관찰합니다.
이전 예제에서는 “foo”를 출력했지만, 이제 프로그램은 의도한 대로 “boo”를 출력합니다. 비교의 왼쪽(3 < a)의 부울 값은 참입니다. 오른쪽의 값(a < 10)은 거짓입니다. 참과 거짓은 항상 거짓이므로 전체 표현식이 거짓으로 평가되므로 조건이 실패하고 else 블록이 실행됩니다.
AND(&&) 연산자를 OR(||)로 전환하고 다른 결과를 관찰해 보십시오.
C++에서 논리 검사의 중요성
C++의 논리 비교에는 부울 값과 비교 연산자를 사용합니다. 올바른 부울 값과 비교 연산자를 사용하여 프로그램 작동을 제어해야 합니다. C++는 완전히 실패하지 않고 다른 동작을 수행하는 경우가 많기 때문에 잘못된 형식의 표현식을 발견하기 어려울 수 있습니다.
이제 컴파일러가 이 문제를 무시하고 왼쪽에서 오른쪽으로 읽을 때 각 비교를 부울로 처리하는 방법을 알았습니다. 어떤 언어를 사용하든 이 문제를 주의하고 그 영향을 인식하는 방법을 배워 한 발 앞서 나가세요.