본문 바로가기

C언어

C 언어 코딩 도장 6

비교 연산자와 삼항 연산자 사용하기

비교 연산자는 값을 비교할 때 사용한다. 보통 비교 연산자는 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&section=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