비교 연산자
비교 연산자에는 단항 연산자, 이항 연산자, 삼항 연산자가 있다. 각각은 연산에 필요한 피연산자(값)의 갯수가 한개, 두개, 세개인 경우를 기준으로 구분한다. 단항 연산자의 예로는 증감연산자(++, --)가 있다. 이는 a++과 같이 하나의 피연산자를 필요로 한다. 이항 연산자의 예로는 +, -, *, /, %과 같은 수식을 계산하는 산술 연산자와 비교 연산자 등이 있다. 비교 연산자의 종류는 다음과 같다.
연산자 | 설명 |
== | 같다. |
!= | 같지 않다. |
> | 크다. |
< | 작다. |
>= | 크거나 같다. |
<= | 작거나 같다. |
비교 연산자 조건문, 반복문 등의 조건식에서 주로 쓰인다. 이들은 a+b, num1==num2 등과 같이 두 개의 피연산자를 필요로 한다. 산술 연산자는 연산자 기준 오른쪽의 값을 왼쪽으로 계산해서 계산된 값을 반환하지만, 비교 연산자는 연산자 기준 왼쪽과 오른쪽의 값을 비교한 후에 참, 거짓을 반환한다.
삼항 연산자
삼항 연산자는 조금 특별한데, 식의 구조는 (조건) ? 참 : 거짓 이다. 조건 부분에 들어갈 값, 참일 경우의 값, 거짓일 경우의 값, 총 3개가 필요해서 삼항 연산자라 한다. 조건이 참일 경우, 참 부분의 값을 반환, 거짓일 경우 거짓 부분의 값을 반환한다.
예를 들어 x를 입력한 후에, y값에 x가 10이상이면 100, 10미만이면 50을 저장하는 코드는 다음과 같다.
#include <stdio.h>
int main(){
int x, y;
scanf("%d", &x);
y = (x>=10) ? 100 : 50;
return 0;
}
삼항 연산자는, if ~ else 구문을 한 줄로 표현해 놓은것과 같은데, 이를 if ~ else를 이용해서 표현하면 다음과 같다.
#include <stdio.h>
int main(){
int x, y;
scanf("%d", &x);
if(x>=10){
y=100;
}
else
y=50;
return 0;
}
4줄로 작성되는 if ~ else 구문을 한 줄의 삼항 연산자로 표현 가능하기 때문에, 코드가 간결해진다는 장점이 있다.
또, 삼항 연산자는, 함수 내의 인자로서도 사용할 수 있다.
printf("%d \n", x>=10 ? 100 : 50);
과 같이 변수 y에 저장하지 않고 바로 출력할 수도 있다.
논리 연산자
논리 연산자는 조건문에서 주로 쓰인다. 연산자 기준으로 좌측과 우측의 참, 거짓 상태를 통해 결과를 반환한다. 이 때, 반환되는 값도 참, 거짓이다. 논리 연산자의 종류는 다음과 같다.
연산자 | 설명 |
&& | AND(논리곱), 양쪽 모두 참일 때 참 |
|| | OR(논리합), 양쪽 중 한쪽만 참이라도 참 |
! | NOT(논리 부정), 참과 거짓을 뒤집음 |
이 때, &&, ||가 아닌 &, |처럼 하나만 써주게 되면 이는 비트 연산자가 되므로 사용에 주의해야 한다.
!(NOT)연산자는 단항 연산자로, 어떠한 값 앞에 붙으면 해당 값이 참일 경우 거짓으로, 거짓일 경우 참으로 바꾸어 준다.
점수를 입력받고 해당 점수가 0~100 사이의 제대로 된 값인지 확인 하기 위해선 점수가 0보다 큰지 한번 비교해야 하고, 참이라면 100보다 작은지도 확인해야 한다. 이를 코드로 작성하면,
#include <stdio.h>
int main(){
int score;
scanf("%d", &score);
if(score>=0){
if(score<=100){
내용;
}
}
}
과 같은 형태가 될 것이다. 하지만 논리 연산자를 통해 두 if문을 하나로 작성할 수 있다.
if(score>=0 && score<=100)
과 같이 작성한다면, && 연산자는 두 식이 모두 참이여야 참을 반환하므로, 0보다 크고 100보다 작은 수만 참이 된다.
논리 연산에서 중요한 부분 중 단락 평가(short-circuit evalution)가 있다. 첫 번째 값만으로 결과가 확실한 경우엔, 두 번째 값은 확인하지 않고 넘어가는 방법이다. 만약 score에 -1이 입력되었다면, 앞의 비교식인 score>=0이 거짓이 되는데, && 연산자는 둘 다 참인 경우만 참을 반환하기 때문에, 뒤의 비교식은 보지 않고 거짓을 반환하게 된다. 논리 연산자는 조건문 뿐만 아니라 삼항 연산자에서도 사용 가능하다.
printf("%s \n", num1 && num2 ? "참" : "거짓");
num1의 값과 num2의 값에 따라서 출력 결과가 바뀌게 된다.
불(boolean) 자료형
논리 자료형이라고도 하며, 참 거짓을 나타내는 자료형이다. C언어는 기본적으로 0을 거짓, 0이 아닌 수를 참으로 사용하는데, stdbool.h 헤더파일에 정의된 bool 자료형을 사용하면 참, 거짓을 각각 true, false로 나타낼 수 있다. bool 자료형의 크기는 1바이트이다. 기본 사용법은 다음과 같다.
#include <stdio.h>
#include <stdbool.h>
int main(){
bool b1 = true;
if (b1 == true)
printf("참 \n");
else
printf("거짓 \n");
return 0;
}
이처럼 bool 자료형의 변수에는 true, false와 같이 값을 저장할 수 있으며, 비교 연산을 할 땐 b1 == true와 같이 연산할 수 있다. bool 자료형은 사용시에 true, false로 사용하다 보니, 코드의 가독성을 높일 수 있는 장점이 있다. bool 자료형의 변수를 출력하고자 할 때는 서식 지정자가 따로 정해져 있지 않아서 %d를 사용해야 한다. 출력 값은 0, 1이 된다. 이러한 bool 자료형은 if문의 조건식에도 쓰일 수 있다.
if(true)처럼 작성한다면, 해당 조건문은 무조건 실행된다. if(false)라면 실행되지 않는다.
#20.5 퀴즈
<= : 작거나 같다.
!= : 같지 않다.
답은 c, d.
num1=0이므로 조건은 거짓이 되어서 7을 반환하므로 num2 = 7이 된다. 답은 c.
if(조건) 과 같은 형태로 사용해야 한다. 답은 d.
삼항 연산자의 기본 형태는 (조건) ? 참 : 거짓 이다. 답은 c, d.
#20.6 연습문제: 비교 연산자 사용하기
#include <stdio.h>
int main()
{
int num1 = 27;
printf("%d\n", num1 ①__ 10);
printf("%d\n", num1 != 5);
printf("%d\n", num1 >= 27);
printf("%d\n", num1 ②__ 27);
printf("%d\n", num1 ③__ 30);
printf("%d\n", num1 <= 27);
return 0;
}
실행 결과
1
1이 반환되었으므로 조건식이 참이 되어야 한다. 답은 >, ==, <.
#20.7 연습문제: 삼항 연산자 사용하기
#include <stdio.h>
int main()
{
float num1 = 1.2f;
float num2;
printf("%f\n", num1 __ 2.0f __ 3.0f __ 4.0f);
return 0;
}
실행 결과
4.000000
해당 식이 하나의 값을 반환하려면 (num1 ___ 2.0f) ? 3.0f : 4.0f 형태의 삼항 연산자가 되어야 한다. 4.000000이 출력되려면 조건식이 거짓이 되어야 하므로 답은 <, ?, :.
#20.8 심사문제: 비교 연산자 사용하기
각각에 대한 if문을 총 3개 작성하면 된다. 조건식은 ch != 'k', ch > 'h', ch <= 'o'가 된다.
#include <stdio.h>
int main(){
char ch;
scanf("%c", &ch);
if(ch != 'k')
printf("참 \n");
else
printf("거짓 \n");
if(ch > 'h')
printf("참 \n");
else
printf("거짓 \n");
if(ch <= 'o')
printf("참 \n");
else
printf("거짓 \n");
return 0;
}
#20.9 심사문제: 삼항 연산자 사용하기
조건은 num1!=7이고, 참인 경우 1, 거짓인 경우 2를 반환해야 한다. 이를 삼항 연산자로 작성하면,
(num1 !=7) ? 1 : 2
이 된다.
#21.7 퀴즈
&& 연산자는 둘 다 참인 경우에 참, 나머지는 모두 거짓을 반환한다. 0이 아닌 모든 수는 참이므로 답은 b, d, e.
|| 연산자는 둘 다 거짓인 경우에 거짓, 나머지는 모두 참을 반환한다. 답은 a, c, e.
!(NOT) 연산자는 참을 거짓으로, 거짓을 참으로 바꾸어 주는 연산자이다. 답은 d.
단락 평가에 관한 문제이다. b의 경우 || 연산이기 때문에 둘 중 하나만 참이면 되는데, 2가 참이므로 뒤의 값은 확인하지 않고 참을 반환한다. c의 경우, 앞이 0으로 거짓이기 때문에 뒤의 값은 확인하지 않고 거짓을 반환한다. e의 경우도 마찬가지로 앞의 값이 참이므로 뒤의 값을 확인하지 않고 참을 반환한다. 답은 b, c, e.
#21.8 연습문제: 논리 연산자 사용하기
#include <stdio.h>
int main()
{
int num1 = 10;
int num2 = 0;
if (num1 ①___ num1)
printf("참\n");
else
printf("거짓\n");
if (num1 ②___ num2)
printf("참\n");
else
printf("거짓\n");
printf("%s\n", !③____ ? "참" : "거짓");
return 0;
}
실행 결과
참
참
참
1. num1은 참이므로, num1 && num1, num1 || num1 둘 다 참이 된다.
2. num1은 참이고 num2는 거짓이므로 둘을 연산해서 참이 되려면 num1 || num2 여야 한다.
3. !(_____)가 참이 되어야 참을 출력한다. 그러면 (_____)은 거짓이어야 하는데, num2가 0이므로 num2를 써주면 된다.
#21.9 심사문제: 논리 연산자 사용하기
#include <stdio.h>
int main(){
int a, b;
scanf("%d %d", &a, &b);
printf("%s \n", a&&b ? "참" : "거짓");
printf("%s \n", a||b ? "참" : "거짓");
printf("%s \n", !a ? "참" : "거짓");
return 0;
}
if문을 사용하여 작성할 수도 있지만, 코드를 간결하게 하기 위해 삼항 연산자를 사용하였다. a&&b가 참이면 "참"을, 거짓이면 "거짓"을 출력하기 위한 삼항 연산자는 첫 번째 출력문과 같이 작성하면 된다. 이하도 같다.
#22.6 퀴즈
bool, true, false는 stdbool.h 헤더파일에 정의되어 있다. 답은 d.
bool 자료형은 1바이트의 크기를 갖는다. 답은 a.
#22.7 연습문제: 불 자료형 사용하기
#include <stdio.h>
①__________________
int main()
{
bool b1 = true;
bool b2 = false;
if (b1 && ②_____)
printf("참\n");
else
printf("거짓\n");
printf("%s\n", b2 || ③____ ? "참" : "거짓");
return 0;
}
실행 결과
참
거짓
1. bool 자료형을 사용하였기에 #include <stdbool.h>를 선언해주어야 한다.
2. b1과 AND 연산을 통해 참을 출력하려면 참이 되어야 하므로 b1.
3. b2와 OR 연산을 통해 거짓을 출력하려면 거짓이어야 하므로 b2.
#22.8 심사문제: 불 자료형 사용하기
b1이 true가 아니면 참을 출력한다. 고로 b1은 false.
b2가 false가 아니면 거짓을 출력한다. b2는 true.
bool b1 = false;
bool b2 = true;
'Programming > C' 카테고리의 다른 글
[ProjectH4C] 코딩도장 Unit 26 Write-Up (0) | 2020.07.15 |
---|---|
[ProjectH4C] 코딩도장 Unit 23 ~ 25 Write-Up (0) | 2020.07.15 |
[ProjectH4C] 코딩도장 Unit 17 ~ 19 Write-Up (0) | 2020.07.13 |
[ProjectH4C] 코드업(CodeUp) 기초 100제 1081~1100 Write-up (0) | 2020.07.09 |
[ProjectH4C] 코드업(CodeUp) 기초 100제 1061~1080 Write-up (0) | 2020.07.09 |