비교 연산자와 삼항 연산자 사용하기
비교 연산자는 값을 비교할 때 사용한다. 보통 비교 연산자는 if 조건문 뿐만 아니라 for, while, do while 반복문에서 조건식을 표현할 때도 사용한다.
연산자 | 설명 |
a == b | 같음 |
a != b | 같지 않음(다름) |
a > b | 큼 |
a < b | 작음 |
a >= b | 크거나 같음 |
a <= b | 작거나 같음 |
▲ C 언어 비교 연산자
삼항 연산자는 if, else의 축약형이다.
연산자 | 설명 |
x ? a : b | 조건부 연산자, 물음표 앞에 조건식이 참이면 : 앞의 값을 반환, 거짓이면 : 뒤의 값을 반환 |
▲ C 언어 삼항 연산
단항(+x), 이항(a + b), 삼항 연산자(x ? a : b)는 연산에 필요한 값(피연산자)의 개수에 따라 구분된다.
비교 연산자 사용하기
#include <stdio.h>
int main()
{
int num1 = 10;
printf("%d\n", num1 == 10); // num1이 10과 같은지
printf("%d\n", num1 != 5); //num1이 5와 다른지
printf("%d\n", num1 > 10);
printf("%d\n", num1 < 10);
printf("%d\n", num1 >= 10);
printf("%d\n", num1 <= 10);
return 0;
}
C 언어에서는 비교 연산자가 참이면 1, 거짓이면 0이 나온다.
삼항 연산자 사용하기
삼항 연산자와 비교해볼 if 조건문을 사용한 코드를 만들어보자.
#include <stdio.h>
int main()
{
int num1 = 5;
int num2;
if (num1)
num2 = 100;
else
num2 = 200;
printf("%d\n", num2);
return 0;
}
앞의 if 조건문을 삼항 연산자로 작성해보자.
변수 ? 값1 : 값2
#include <stdio.h>
int main()
{
int num1 = 5;
int num2;
num2 = num1 ? 100 : 200;
printf("%d\n", num2);
return 0;
}
삼항 연잔사는 ?와 :이다.
참/거짓을 판단할 변수 ? 참일 때 사용할 값 : 거짓일 때 사용할 값;
num2 = num1 ? 100 : 200;
? → num1 변수 자체를 참인지 거짓인지 판단한다.
삼항 연산자는 if 조건문처럼 0일때는 거짓, 0이 아닐 때는 참으로 구분한다.
따라서 참이기 때문에, num2에는 100이 할당된다.
#include <stdio.h>
int main()
{
int num1 = 10;
int num2;
num2 = num1 == 10 ? 100 : 200;
printf("%d\n", num2);
return 0;
}
? → num1이 10이면 참, 10이 아니면 거짓으로 구분한다
따라서 참이기 때문에, num2에는 100이 할당된다.
가독성을 위해 조건식 부분을 괄호로 묶어주면 읽기가 쉬워지고, 코드의 의도 또한 명확하게 드러낼 수 있다.
하지만, 삼항 연산자 자체가 가독성을 해키기 때문에 대부분의 경우에는 if 조건문을 사용하여 여러 줄로 작성하는 것이 좋다.
if 조건문과 비교 연산자 사용하기
#include <stdio.h>
int main()
{
int num1 = 10;
if (num1 == 10)
printf("10입니다.\n");
if (num1 != 5)
printf("5가 아닙니다.\n");
if (num1 > 10)
printf("10보다 큽니다.\n");
if (num1 < 10)
printf("10보다 작습니다.\n");
if (num1 >= 10)
printf("10보다 크거나 같습니다.\n");
if (num1 <= 10)
printf("10보다 작거나 같습니다.\n");
return 0;
}
if 조건식이 비교 연산자로 구성되어 있다면, 비교 연산자의 결과에 따라 if가 동작하여 문자열이 출력된다.
정수뿐만 아니라 실수나 문자도 비교 연산자로 비교할 수 있다.
#include <stdio.h>
int main()
{
float num1 = 0.1f;
char c1 = 'a';
if (num1 >= 0.09f)
printf("0.99보다 크거나 같습니다.\n");
if (c1 == 'a')
printf("a입니다.\n");
if (c1 == 97)
printf("97입니다.\n");
if (c1 < 'b')
printf("b보다 작습니다.\n");
return 0;
}
https://dojang.io/mod/page/view.php?id=738#google_vignette
C 언어 코딩 도장: 85.4 실수 자료형의 오차
부동소수점 방식은 실수를 정확히 표현할 수 없는 문제가 있습니다. 다음 내용을 소스 코드 편집 창에 입력하고 실행해봅니다. float_rounding_error.c #include int main() { float num1 = 0.0f; float num2 = 0.1f; // 0
dojang.io
문자 자료형은 정수이므로 숫자로 직접 비교하거나 대소 관계를 비교할 수도 있다.
실수는 반올림 오차가 발생하기 때문에 == 연산자로 정확한 값을 비교하는 것은 위험하다.
함수 안에서 삼항 연산자 사용하기
#include <stdio.h>
int main()
{
int num1 = 5;
printf("%s\n", num1 == 10 ? "10입니다." : "10이 아닙니다.");
return 0;
}
num1이 5이므로 조건식이 거짓이다. 따라서 "10이 아닙니다."가 출력된다.
printf 함수에는 삼항 연산자의 결과만 들어간다.
삼항 연산자는 참/거짓 판단을 하면서 결괏값을 함수에 전달할 때 유용하다.
20.5 Quiz 완료
#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;
}
#include <stdio.h>
int main()
{
float num1 = 1.2f;
printf("%f\n", num1 > 2.0f ? 3.0f : 4.0f);
return 0;
}
20.8 심사문제 완료
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
char c1;
scanf("%c", &c1);
if (c1 != 'k')
printf("참\n");
else
printf("거짓\n");
if (c1 > 'h')
printf("참\n");
else
printf("거짓\n");
if (c1 <= 'o')
printf("참\n");
else
printf("거짓\n");
return 0;
}
▲ 정답으로 제출한 코드
20.9 심사문제 완료
num1 != 7 ? 1 : 2
▲ 정답으로 제출한 코드
논리 연산자 사용하기
논리 연산자는 조건식이나 값을 논리적으로 판단한다.
if 조건문에서 조건식을 판단할 때 주로 사용한다.
연산자 | 설명 |
&& | AND(논리곱), 양쪽 모두 참일 때 참 |
|| | OR(논리합), 양쪽 중 한쪽만 참이라도 참 |
! | NOT(논리 부정), 참과 거짓을 뒤집음 |
C 언어에서 논리값 거짓(false)은 0이고, 참(true)는 0이 아닌 값, 보통 1을 사용한다.
AND 연산자 사용하기
a && b
두 값이 모두 참일 때, 참이다.
#include <stdio.h>
int main()
{
printf("%d\n", 1 && 1); // 참 && 참 = 참
printf("%d\n", 1 && 0); // 참 && 거짓 = 거짓
printf("%d\n", 0 && 1); // 거짓 && 참 = 거짓
printf("%d\n", 0 && 0); // 거짓 && 거짓 = 거짓
printf("%d\n", 2 && 3); // 참 && 참 = 참
return 0;
}
& 기호를 하나만 사용하면 AND 비트 연산자가 되므로 주의해야 한다.
https://dojang.io/course/view.php?id=2§ion=29
강좌: C 언어 코딩 도장, 섹션: Unit 23. 비트 연산자 사용하기
값을 비트 단위로 연산하는 비트 연산자에 대해 설명합니다.
dojang.io
C 언어에서는 0이 아닌 모든 값이 참이므로 2 && 3도 참이며 결과는 1이 출력된다.
논리 연산에서 중요한 부분이 단락 평가(short-circuit evalution)이다. 첫 번째 값만으로 결과가 확실할 때 두 번째 값은 확인하지 않는 방법을 말한다.
즉, AND 연산자는 두 값이 모두 참이어야 참이므로 첫 번째 값이 거짓이면 두 번째 값은 확인하지 않고 바로 거짓으로 결정한다.
OR 연산자 사용하기
a || b
두 값 중 하나만 참이어도 참이다.
#include <stdio.h>
int main()
{
printf("%d\n", 1 || 1); // 참 OR 참 = 참
printf("%d\n", 1 || 0); // 참 OR 거짓 = 참
printf("%d\n", 0 || 1); // 거짓 OR 참 = 참
printf("%d\n", 0 || 0); // 거짓 OR 거짓 = 거짓
printf("%d\n", 2 || 3); // 참 OR 참 = 참
return 0;
}
| 기호를 하나만 사용하면 OR 비트 연산자가 되므로 주의해야 한다.
OR 연산자는 두 값 중 하나만 참이라도 참이므로 첫 번째 값이 참이면 두 번째 값은 확인하지 않고 바로 참으로 결정한다.
NOT 연산자 사용하기
!x
참을 거짓으로, 거짓을 참으로 논리값을 반대로 뒤집는다.
#include <stdio.h>
int main()
{
printf("%d\n", !1); // !1 = 0
printf("%d\n", !0);
printf("%d\n", !3); // !3 = !참 = 거짓
return 0;
}
C 언어에서는 0이 아닌 모든 값이 참이므로 !3의 결과는 0이 된다.
조건식과 논리 연산자 사용하기
값 뿐만 아니라 조건식 자체도 논리 연산자로 판단할 수 있다.
#include <stdio.h>
int main()
{
int num1 = 20;
int num2 = 10;
int num3 = 30;
int num4 = 15;
printf("%d\n", num1 > num2 && num3 > num4);
printf("%d\n", num1 > num2 && num3 < num4);
printf("%d\n", num1 > num2 || num3 < num4);
printf("%d\n", num1 < num2 || num3 < num4);
printf("%d\n", !(num1 > num2));
return 0;
}
네 값을 두 값씩 묶어서 비교 연산자로 대소 관계를 비교한 뒤 논리 연산자로 참, 거짓을 판단한다.
비교 연산자와 논리 연산자가 연달아서 나오면 알아보기 어려우므로 괄호를 사용하여 의도를 명확하게 나타내는 것이 좋다.
+) AND 연산자의 경우 단락 평가에 따라 두 번째 조건은 검사하지 않는다.
if 조건문과 논리 연산자 사용하기
#include <stdio.h>
int main()
{
int num1 = 1;
int num2 = 0;
if (num1 && num2)
printf("참\n");
else
printf("거짓\n");
if (num1 || num2)
printf("참\n");
else
printf("거짓\n");
if (!num1)
printf("참\n");
else
printf("거짓\n");
return 0;
}
if 조건문에서 논리 연산자를 사용하면 단락 평가에 따라 동작이 결정된다. if 조건문에서 && 연산자는 첫 번째 값이 거짓이면 두 번째 값은 검사하지 않고 거짓으로 결정하므로 else의 코드가 실행된다.
|| 연산자는 첫 번째 값이 참이면 두 번째 값은 검사하지 않고 참으로 결정하므로 if의 코드가 실행된다.
단락 평가의 활용
&& 연산자의 단락 평가를 활용하면 문제가 발생하는 코드를 미리 예방할 수 있다.
int num1 = 0;
int num2 = 10;
if ((num1 != 0) && (num2 / num1) < 20) // num1이 0이면 나눗셈 연산을 하지 않음
printf("참\n");
else
printf("거짓\n";
정수를 0으로 나누면 에러가 발생하지만 나눗셈 연산 전에 num != 0으로 num1이 0인지 검사하면 에러를 예방할 수 있다.
단락 평가는 논리 연산자로 된 조건 검사 뿐만 아니라 사칙 연산 수행에도 적용된다.
삼항 연산자에 논리 연산자 사용하기
삼항 연산자에서도 논리 연산자를 사용할 수 있다.
#include <stdio.h>
int main()
{
int num1 = 1;
int num2 = 0;
printf("%s\n", num1 && num2 ? "참" : "거짓");
printf("%s\n", num1 || num2 ? "참" : "거짓");
return 0;
}
21.7 Quiz 완료
#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", !num2 ? "참" : "거짓");
return 0;
}
21.9 심사문제 완료
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int num1, num2;
scanf("%d %d", &num1, &num2);
if (num1 && num2)
printf("참\n");
else
printf("거짓\n");
if (num1 || num2)
printf("참\n");
else
printf("거짓\n");
if (!num1)
printf("참\n");
else
printf("거짓\n");
return 0;
}
▲ 정답으로 제출한 코드
불(boolean) 자료형 사용하기
불 자료형은 논리 자료형이라고도 하며, 참 거짓을 나타낸다.
C 언어는 0을 거짓으로, 0이 아닌 숫자를 참으로 사용하지만, stdbool.h 헤더 파일을 사용하면 true를 참으로, false를 거짓으로 나타낼 수 있다.
stdbool.h 헤더 파일 사용하기
#include <stdio.h>
#include <stdbool.h>
int main()
{
bool b1 = true;
if (b1 == true)
printf("참\n");
else
printf("거짓\n");
return 0;
}
stdbool.h 헤더 파일을 포함한 뒤 자료형 bool과 값 true, false를 사용하면 된다.
불 자료형 크기 알아보기
int 자료형과 bool 자료형의 크기를 알아보자
#include <stdio.h>
#include <stdbool.h>
int main()
{
printf("int의 크기 : %d\n", sizeof(int));
printf("bool의 크기 : %d\n", sizeof(bool));
return 0;
}
출력 결과에 따르면 int의 크기는 4바이트, bool의 크기는 1바이트이다.
지금까지 int로 참, 거짓을 표현했는데, int와 bool은 크기가 다르다.
불 자료형과 논리 연산자 사용하기
불 자료형과 논리 연산자를 함께 사용해보자.
#include <stdio.h>
#include <stdbool.h>
int main()
{
printf("%d\n", true && true);
printf("%d\n", true && false);
printf("%d\n", false && true);
printf("%d\n", false && false);
printf("%d\n", true || true);
printf("%d\n", true || false);
printf("%d\n", false || true);
printf("%d\n", false || false);
return 0;
}
printf로 결과를 출력할 때는 정수를 출력하는 것처럼 서식 지정자로 %d를 사용한다. stdbool.h에는 자료형과 불값만 정의할 뿐 전용 서식 지정자는 없다.
true, false를 문자열로 출력하기
true, false를 printf로 출력하고 싶다면 삼항 연산자와 문자열을 활용하면 된다.
#include <stdio.h>
#include <stdbool.h>
int main()
{
bool b1 = true;
bool b2 = false;
printf(b1 ? "true" : "false");
printf("\n");
printf(b2 ? "true" : "false");
printf("\n");
printf("%s\n", b1 ? "true" : "false");
printf("%s\n", b2 ? "true" : "false");
return 0;
}
서식 지정자 없이 그대로 출력해도 되고, %s 서식 지정자를 사용해도 된다. 삼항 연산자는 조건식 뿐만 아니라 참, 거짓 값으로도 판단할 수 있으므로 불값이 들어있는 변수를 그대로 사용하면 된다.
if 조건문에서 불 자료형 사용하기
불 자료형은 if 조건문에서 그대로 사용할 수 있다.
#include <stdio.h>
#include <stdbool.h>
int main()
{
if (true)
printf("참\n");
else
printf("거짓\n");
if (false)
printf("참\n");
else
printf("거짓\n");
return 0;
}
값이 고정되어 있기 때문에 결과는 항상 똑같다.
22.6 Quiz 완료
#include <stdio.h>
#include <stdbool.h>
int main()
{
bool b1 = true;
bool b2 = false;
if (b1 && true)
printf("참\n");
else
printf("거짓\n");
printf("%s\n", b2 || false ? "참" : "거짓");
return 0;
}
22.8 심사문제 완료
#include <stdio.h>
#include <stdbool.h>
int main()
{
bool b1 = false;
bool b2 = true;
if (b1 != true)
printf("참\n");
else
printf("거짓\n");
printf("%s\n", b2 == false ? "참" : "거짓");
return 0;
}
https://dojang.io/mod/page/view.php?id=745
C 언어 코딩 도장: 85.12 불 자료형
처음 C 언어가 개발될 당시에는 따로 불 자료형이 없었습니다. 그래서 숫자 1을 참, 0을 거짓으로 정하였고 지금까지도 바뀌지 않고 그대로 사용되고 있습니다. 시간이 흘러 C++이 나왔고, C++에서
dojang.io
'C언어' 카테고리의 다른 글
C 언어 코딩 도장 7 (0) | 2025.01.13 |
---|---|
C 언어 코딩 도장 5 (0) | 2025.01.12 |
C 언어 코딩 도장 4 (1) | 2025.01.10 |
C 언어 코딩 도장 3 (0) | 2025.01.09 |
C 언어 코딩 도장 2 (0) | 2024.09.02 |