profile image

L o a d i n g . . .

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

20.1 비교 연산자 사용하기

비교 연산자는 값을 비교할 때 사용하며 연산자의 종류는 다음과 같다.

C 언어 비교 연산자

#include <stdio.h>
 
int main()
{
    int num1 = 10;
 
    printf("%d\n", num1 == 10);    // 1: num1이 10과 같은지
    printf("%d\n", num1 != 5);     // 1: num1이 5와 다른지
 
    printf("%d\n", num1 > 10);     // 0: num1이 10보다 큰지
    printf("%d\n", num1 < 10);     // 0: num1이 10보다 작은지
 
    printf("%d\n", num1 >= 10);    // 1: num1이 10보다 크거나 같은지
    printf("%d\n", num1 <= 10);    // 1: num1이 10보다 작거나 같은지
 
    return 0;
}

C 언어에서는 비교 연산자가 참이면 1, 거짓이면 0이 나온다. 여기서는 num1 10이므로 결과는 다음과 같다.

1
1
0
0
1
1

 

20.2 삼항 연산자 사용하기

삼항 연산자: 연산에 필요한 값이 세 개이다.

삼항 연산자는 다음과 같은 형식으로 사용한다.

- 변수 ? 값1 : 값2

#include <stdio.h> 

int main()
{
    int num1 = 5;
    int num2;
 
    num2 = num1 ? 100 : 200;    // num1이 참이면 num2에 100을 할당, 거짓이면 num2에 200을 할당
 
    printf("%d\n", num2);    // 100: num1이 5이므로 참. num2에는 100이 할당됨
 
    return 0;
}

삼항 연산자는 ? :이다. 먼저 참/거짓을 판단할 변수나 조건식을 지정한 뒤 ? 다음에 참과 거짓일 때 사용할 값을 나열한다. 각 값은 :로 구분하며 : 앞은 참일 때, : 뒤는 거짓일 때 사용할 값이다.

 

삼항 연산자

->삼항 연산자는 참, 거짓에 따라 다른 값을 사용하게 해주며 if, else로 분기하는 부분을 한 줄로 간단하게 줄일 수 있다.

 

 

20.3 if 조건문과 비교 연산자 사용하기

#include <stdio.h>
 
int main()
{
    int num1 = 10;
 
    if (num1 == 10)    // num1이 10과 같은지 검사
        printf("10입니다.\n");
 
    if (num1 != 5)     // num1이 5와 다른지 검사
        printf("5가 아닙니다.\n");
 
    if (num1 > 10)     // num1이 10보다 큰지 검사
        printf("10보다 큽니다.\n");
 
    if (num1 < 10)     // num1이 10보다 작은지 검사
        printf("10보다 작습니다.\n");
 
    if (num1 >= 10)    // num1이 10보다 크거나 같은지 검사
        printf("10보다 크거나 같습니다.\n");
 
    if (num1 <= 10)    // num1이 10보다 작거나 같은지 검사
        printf("10보다 작거나 같습니다.\n");
 
    return 0;
}

비교 연산자의 결과에 따라 if가 동작하여 문자열이 출력된다. num1 10이므로 결과는 다음과 같다.

10입니다.
5가 아닙니다.
10보다 크거나 같습니다.
10보다 작거나 같습니다.

정수뿐만 아니라 실수나 문자도 비교 연산자로 비교할 수 있다. 단, 실수는 반올림 오차가 발생하므로 == 연산자로 정확한 값을 비교하는 것은 위험하다.

 

 

20.4 함수 안에서 삼항 연산자 사용하기

#include <stdio.h>

int main()
{
    int num1 = 5;

    // 함수 안에서 삼항 연산자 사용
    printf("%s\n", num1 == 10 ? "10입니다." : "10이 아닙니다."); // num1은 5이므로 "10이 아닙니다."
                                                                // 출력

    return 0;
}

위 코드의 실행 결과는 다음과 같다.

10이 아닙니다.

printf 함수에 삼항 연산자를 바로 사용하여 결과를 출력하였다. 여기서는 num1 5이므로 조건식이 거짓이다. 따라서 "10이 아닙니다."가 출력된다. 즉, printf 함수에는 삼항 연산자의 결과만 들어갔다.

이처럼 삼항 연산자는 참/거짓 판단을 하면서 결괏값을 함수에 전달할 때 유용하다.

 

※ 파이썬과의 차이점 : C언어와 달리 파이썬에는 ?와 :를 이용한 삼항 연산자가 존재하지 않는다. 또한 파이썬에서는 비교연산자를 '1<a<2' 과 같은 형식으로 사용하지만, C언어에서는 불가하고 'a>1 && a<2' 으로 사용 가능하다.

 

 

Unit 21. 논리연산자 사용하기

논리 연산자는 조건식이나 값을 논리적으로 판단한다.

C 언어 논리 연산자

 

21.1 AND 연산자 사용하기

 - a && b

#include <stdio.h>
 
int main()
{
    printf("%d\n", 1 && 1);    // 1: 1 AND 1은 참
    printf("%d\n", 1 && 0);    // 0: 1 AND 0은 거짓
    printf("%d\n", 0 && 1);    // 0: 0 AND 1은 거짓
    printf("%d\n", 0 && 0);    // 0: 0 AND 0은 거짓
 
    printf("%d\n", 2 && 3);    // 1: 2 AND 3은 참
 
    return 0;
}

AND 연산자 &&처럼 & 기호를 두 개 붙여서 사용하며 하나만 사용하면 AND 비트 연산자가 되므로 주의한다.

&&는 두 값이 모두 참이라야 결과가 참이 나온다. 따라서 1 && 1만 참이고 나머지는 모두 거짓이다. 그리고 C 언어에서는 0이 아닌 모든 값이 참이므로 2 && 3도 참이며 결과는 1이 출력된다.

 

printf("%d\n", 0 && 1);    // 첫 번째 값 0이 거짓이므로 두 번째 값 1은 확인하지 않고 거짓으로 결정

논리 연산에서 중요한 부분이 단락 평가(short-circuit evalution)이다. 단락 평가는 첫 번째 값만으로 결과가 확실할 때 두 번째 값은 확인(평가)하지 않는 방법을 말한다. 즉, AND 연산자는 두 값이 모두 참이라야 참이므로 첫 번째 값이 거짓이면 두 번째 값은 확인하지 않고 바로 거짓으로 결정한다.

 

 

21.2 OR 연산자 사용하기

 - a || b

#include <stdio.h>
 
int main()
{
    printf("%d\n", 1 || 1);    // 1: 1 OR 1은 참
    printf("%d\n", 1 || 0);    // 1: 1 OR 0은 참
    printf("%d\n", 0 || 1);    // 1: 0 OR 1은 참
    printf("%d\n", 0 || 0);    // 0: 0 OR 0은 거짓
 
    printf("%d\n", 2 || 3);    // 1: 2 OR 3은 참
    
    return 0;
}

OR 연산자 ||처럼 | 기호를 두 개 붙여서 사용하며 하나만 사용하면 OR 비트 연산자가 되므로 주의한다.

||는 두 값 중 하나만 참이라도 결과가 참이 나온다. 따라서 1 || 1, 1 || 0, 0 || 1 모두 참이고, 0 || 0만 거짓이다. 그리고 C 언어에서는 0이 아닌 모든 값이 참이므로 2 || 3도 참이며 결과는1이 출력된다.

 

printf("%d\n", 1 || 1);    // 첫 번째 값 1이 참이므로 두 번째 값 1은 확인하지 않고 참으로 결정
printf("%d\n", 1 || 0);    // 첫 번째 값 1이 참이므로 두 번째 값 0은 확인하지 않고 참으로 결정
printf("%d\n", 2 || 3);    // 첫 번째 값 2가 참이므로 두 번째 값 3은 확인하지 않고 참으로 결정

OR 연산자는 두 값 중 하나만 참이라도 참이므로 첫 번째 값이 참이면 두 번째 값은 확인하지 않고 바로 참으로 결정한다.

 

 

21.3 NOT 연산자 사용하기

 - !x

#include <stdio.h>
 
int main()
{
    printf("%d\n", !1);    // 0: NOT 1은 거짓
    printf("%d\n", !0);    // 1: NOT 0은 참
 
    printf("%d\n", !3);    // 0: NOT 3은 거짓
 
    return 0;
}

NOT 연산자는 값, 변수, 함수 앞에 !를 붙여서 사용한다. !는 참은 거짓으로, 거짓은 참으로 논릿값을 뒤집는다.

따라서 0 1로, 1 0이 된다. 그리고 C 언어에서는 0이 아닌 모든 값이 참이므로 !3의 결과는 0이 된다.

 

 

21.4 조건식과 논리 연산자 사용하기

#include <stdio.h>
 
int main()
{
    int num1 = 20;
    int num2 = 10;
    int num3 = 30;
    int num4 = 15;
 
    printf("%d\n", num1 > num2 && num3 > num4);    // 1: 양쪽 모두 참이므로 참
    printf("%d\n", num1 > num2 && num3 < num4);    // 0: 앞만 참이므로 거짓
    
    printf("%d\n", num1 > num2 || num3 < num4);    // 1: 앞만 참이므로 참
    printf("%d\n", num1 < num2 || num3 < num4);    // 0: 양쪽 모두 거짓이므로 거짓
 
    printf("%d\n", !(num1 > num2));    // 0: 참의 NOT은 거짓
 
    return 0;
}

위의 실행 결과는 다음과 같다.

1
0
1
0
0

값뿐만 아니라 조건식 자체도 논리 연산자로 판단할 수 있다.

위 코드는 네 값을 두 값씩 묶어서 비교 연산자로 대소 관계를 비교한 뒤 논리 연산자로 참, 거짓을 판단한 것이다.

 

 

21.5 if 조건문과 논리 연산자 사용하기

#include <stdio.h>
 
int main()
{
    int num1 = 1;
    int num2 = 0;
 
    if (num1 && num2)      // num1과 num2가 모두 참인지 검사
        printf("참\n");
    else
        printf("거짓\n");  // num1만 참이므로 거짓이 출력됨
 
    if (num1 || num2)      // num1과 num2 둘 줄 하나가 참인지 검사
        printf("참\n");    // num1이 참이므로 참이 출력됨
    else
        printf("거짓\n");
 
    if (!num1)             // num1을 반대로 뒤집음
        printf("참\n");
    else
        printf("거짓\n");  // 참을 뒤집었으므로 거짓이 출력됨
 
    return 0;
}

실행 결과는 다음과 같다.

거짓
참
거짓

if 조건문에서 논리 연산자를 사용하면 단락 평가에 따라 동작이 결정된다.

if 조건문에서 && 연산자는 첫 번째 값이 거짓이면 두 번째 값은 검사하지 않고 거짓으로 결정하므로 else의 코드가 실행된다. 그리고 ||연산자는 첫 번째 값이 참이면 두 번째 값은 검사하지 않고 참으로 결정하므로 if의 코드가 실행된다.

 

 

21.6 삼항 연산자에 논리 연산자 사용하기

if 조건문뿐만 아니라 삼항 연산자에서도 논리 연산자를 사용할 수 있다.

#include <stdio.h>
 
int main()
{
    int num1 = 1;
    int num2 = 0;
 
    printf("%s\n", num1 && num2 ? "참" : "거짓");    // 거짓: 삼항 연산자에서 AND 연산자 사용
    printf("%s\n", num1 || num2 ? "참" : "거짓");    // 참: 삼항 연산자에서 OR 연산자 사용
 
    return 0;
}

printf 함수 안에서 삼항 연산자를 사용하여 값을 출력하였다. num1에는 1, num2에는 0이 들어있으므로 AND 연산자의 결과는 거짓, OR 연산자의 결과는 참이다.

 

※ 파이썬과의 차이점 : 파이썬과 C언어의 논리 연산자 기호가 다르다. C언어에서는 &&이 and 연산자를 뜻하지만, 파이썬에서는 and를 사용한다. 또한 C언어에서 ||가 or 연산자지만, 파이썬에서는 or를 사용한다. 마지막으로 C언어에서 !이 not 연산자이지만, 파이썬에서는 not을 사용한다.

 

 

Unit 22. 불 자료형 사용하기

22.1 stdbool.h 헤더 파일 사용하기

불(boolean) 자료형은 논리 자료형이라고도 하며 참과 거짓을 나타낸다.

stdbool.h 헤더 파일을 사용하면 true를 참으로, false를 거짓으로 나타낼 수 있다.

#include <stdio.h>
#include <stdbool.h>    // bool, true, false가 정의된 헤더 파일
 
int main()
{
    bool b1 = true;
 
    if (b1 == true)        // b1이 true인지 검사
        printf("참\n");    // b1이 true이므로 참이 출력됨
    else
        printf("거짓\n");
 
    return 0;
}

먼저 #include stdbool.h 헤더 파일을 포함한 뒤 자료형 bool과 값 true, false를 사용하면 된다.

여기서는 변수 b1 true를 할당하였고, if 조건문으로 b1 true인지 비교하였다. 물론 같은 true이므로 "참"이 출력된다.

 

 

22.2 불 자료형 크기 알아보기

#include <stdio.h>
#include <stdbool.h>    // bool, true, false가 정의된 헤더 파일
 
int main()
{
    printf("int의 크기: %d\n", sizeof(int));      // int의 크기: 4: int의 크기는 4바이트
    printf("bool의 크기: %d\n", sizeof(bool));    // bool의 크기: 1: bool의 크기는 1바이트
 
    return 0;
}

위 코드의 실행 결과는 다음과 같다.

int의 크기: 4
bool의 크기: 1

sizeof 연산자로 int bool 자료형의 크기를 구했다. 출력 결과에 따르면 int의 크기는 4바이트, bool의 크기는 1바이트이다.

 

 

22.3 불 자료형과 논리 연산자 사용하기

#include <stdio.h>
#include <stdbool.h>    // bool, true, false가 정의된 헤더 파일
 
int main()
{
    printf("%d\n", true && true);      // 1: true AND true는 1
    printf("%d\n", true && false);     // 0: true AND false는 0
    printf("%d\n", false && true);     // 0: false AND true는 0
    printf("%d\n", false && false);    // 0: false AND false는 0
 
    printf("%d\n", true || true);      // 1: true OR true는 1
    printf("%d\n", true || false);     // 1: true OR false는 1
    printf("%d\n", false || true);     // 1: false OR true는 1
    printf("%d\n", false || false);    // 0: false OR false는 0

    return 0;
}

불 자료형과 논리 연산자를 함께 사용한 것이다. 

이때 printf로 결과를 출력할 때는 정수를 출력하는 것처럼 서식 지정자로 %d를 사용하였다. stdbool.h에는 자료형과 불값만 정의할 뿐 전용 서식 지정자는 없기 때문이다.

 

 

22.4 true, false를 문자열로 출력하기

#include <stdio.h>
#include <stdbool.h>    // bool, true, false가 정의된 헤더 파일 

int main()
{
    bool b1 = true;
    bool b2 = false;
 
    printf(b1 ? "true" : "false");    // b1이 true이므로 true가 출력됨
    printf("\n");
    printf(b2 ? "true" : "false");    // b2가 false이므로 false 출력됨
    printf("\n");
 
    printf("%s\n", b1 ? "true" : "false");    // b1이 true이므로 true가 출력됨
    printf("%s\n", b2 ? "true" : "false");    // b2가 false이므로 false 출력됨

    return 0;
}

true, false printf로 출력하고 싶다면 다음과 같이 삼항 연산자와 문자열을 활용하면 된다.

서식 지정자 없이 그대로 출력해도 되고, %s 서식 지정자를 사용해도 된다.

 

 

22.5 if 조건문에서 불 자료형 사용하기

#include <stdio.h>
#include <stdbool.h>    // bool, true, false가 정의된 헤더 파일
 
int main()
{
    if (true)              // 불 true 사용
        printf("참\n");    // 참이므로 참이 출력됨
    else
        printf("거짓\n");

    if (false)             // 불 false 사용
        printf("참\n");
    else
        printf("거짓\n");  // 거짓이므로 거짓이 출력됨

    return 0;
}

다음과 같이 불 자료형은 if 조건문에서 그대로 사용할 수 있다.

복사했습니다!