관계 연산자는 두 개의 피연산자 간의 상등/대소 관계를 판단하는 이항 연산자이다. 보통 if 명령이나 조건 연산자 ?와 조합되어서 사용된다. 사용법을 정리하면 다음 표와 같다.
[표 3.4.1] 관계 연산자
관계 연산자 | 의미 |
x == y | x 값과 y 값이 같다. |
x != y | x 값과 y 값이 서로 다르다. |
x < y | x 값이 y 값보다 작다. |
x <= y | x 값이 y 값보다 작거나 같다. |
x > y | x 값이 y 값보다 크다. |
x >= y | x 값이 y 값보다 크거나 같다. |
관계 연산자에서 주의할 점은 ‘같다’를 표현하는 ‘==’이다. 흔히 하는 실수가 조건식에 ‘=’하나만 써 놓고 프로그램이 제대로 돌아가지 않는다고 의아해 하는 경우이다. C/C++언어에서는 ‘=’는 오른쪽의 데이터를 왼쪽에 대입하라는 의미이다. 이것과 구별시키기 위해서 ‘==’를 사용한다. 또 하나는 ‘같지 않다’란 관계 연산자인 ‘!=’이다. 만약 ‘!’하나만 쓴다면 논리연산자의 NOT 이므로 주의해야 한다. 그리고 ‘작거나 같다’의 ‘<='을 ’=<‘으로 바꿔 쓰지 않도록 주의하자. ’크거나 같다‘도 ’>=‘로 써야지 ’=>‘로 쓰지 않아야 한다.
int ia = 10, ib = 10, ic = 33ia == ib //참(1)ib == ic //거짓(0)ib != ic // 참(1)ic < ib // 거짓(0) |
관계연산의 결과가 참일 때는 내부적으로 1값(true)을 가지고 거짓일 때는 0값(false)을 갖는다.
그리고 관계 연산자의 두 피연산자의 데이터 형은 반드시 일치시켜야 한다. 만약 그렇지 않으면 엉뚱한 결과가 나올 수 있다. 다음 예를 살펴보기 전에 if 명령어의 문법을 간단하게 알아보자.
제어 명령어인 if 는 구조가 굉장히 간단한데 if 바로 다음에 오는 괄호 안 조건식이 참이면 중괄호 { }로 묶여진 명령들을 실행하고 거짓일 경우에는 실행하지 않는다. 조건식에서는 관계연산자와 다음 절의 논리연산자가 사용되며 조건식은 반드시 시작과 끝을 괄호로 묶어야 한다. if 명령은 또한 else 와 짝을 이루어 사용되기도 한다.
if (조건식) { 명령들1;} else { 명령들2;} |
이렇게 하면 조건식이 참이면 {명령들1}이 실행되고 거짓이면 {명령들2}가 수행된다.
다음 예제를 살펴 보자.
ex03-05.c |
#include<stdio.h>int main(){ char cA = 'A', cB = 'a'; short sA = -10; unsigned long ulA = 1000; float fA = 1.0/10;
if (cA == cB) printf("cA equals cB\n"); if (sA < 0) printf("sA is negative.\n"); if (ulA%2 == 0) printf("ulA is an even number.\n"); if (fA != 0.1f) printf("fA is not 0.1f.\n"); printf("%ld > %d : %d.\n",ulA, sA, ulA>sA);} |
sA is negative.lA is an even number.fA is not 0.1f.1000 > -10 : 0. |
위의 프로그램에서 실행된 결과를 하나씩 살펴보자. 먼저 첫 번째 if 문에서 (cA == cB)조건을 검사했다. 전절에서 설명한 대로 문자상수는 내부적으로 ASCII코드값으로 취급된다. ‘A’의 아스키코드는 65이고 ‘a’는 97이므로 cA는 65이고 cB는 97이다. 따라서 (cA == cB)조건은 거짓이 되므로 그 밑의 printf()함수가 수행되지 않는다. 그 밑의 printf()함수에서는 논리식 (sA < 0)이 참이므로 내부적으로 printf()문이 실행된다.
그 다음 조건식은 (fA != 0.1f)인데 fA는 1.0f/10으로 초기화 되었으므로 당연히 이 조건은 거짓으로 판명되고 그 밑의 printf()문은 수행되지 않아야 되지만 실행 결과를 보면 참으로 판단되었음을 알 수 있다. 이 예제에서 보듯이 C/C++ 에서는 실수형 변수에 대해서 직접 같다(==), 다르다(!=)를 사용하는 것은 정확하지 않은 결과를 초래할 수 있으므로 가급적 피해야 한다.
그리고 마지막 문장에서 (ulA > sA)라는 조건도 ulA는 1000이고 sA는 –10이므로 당연히 참일 것 같지만 결과는 거짓(0)으로 출력되었다. 이렇게 비교연산의 두 피연산자의 데이터형이 다르면 결과가 엉뚱하게 나올 수 있으므로 주의해야 한다.
이 예제에서 보듯이 실수형(float, double, long double)의 같고 다름을 판별할 때는 주의를 기울여야 한다. 보통 C/C++언어에서는 보통 두 실수가 서로 같은 값인가를 비교하지 않는다. 오류를 발생시킬 확률이 높기 때문이다. 이는 십진수를 2진소수로 변환하는데서 발생하는 오차때문이며 앞에서도 언급한 바와 같이 float형의 소수점 이하 유효 자리수는 정수부를 포함해서 6자리 정도에 불과하다는 사실에도 주의해야 한다.
이제 사용자로부터 입력받은 정수가 짝수라면 화면에 “even number.’ 라고 출력하고 홀수이면 “odd number”라고 출력하는 프로그램을 작성해 보자. 짝수는 2로 나누었을 때 나머지가 0인 정수이다.
ex03-06.c |
#include<stdio.h>int main(){ int ia; scanf("%d", &ia); if (ia%2 == 0) { printf("even number.\n"); } else { printf("odd number.\n"); }} |
이 프로그램을 실행시키고 정수를 입력하면 그 정수가 짝수라면 화면에 “even number!”라고 출력이 되는 것을 확인할 수 있을 것이다.