지난 편에서는 상수와 리터럴에 대해 배웠습니다. 이번에는 변수와 상수를 가지고 실제로 뭔가를 “계산”하고 “비교”할 때 쓰는 연산자에 대해 알아보겠습니다. 연산자는 C언어 문법의 뼈대라고 할 수 있을 만큼 자주 쓰이니, 오늘 확실히 정리하고 넘어가면 앞으로 조건문이나 반복문을 배울 때 훨씬 수월합니다.

산술 연산자

산술 연산자는 우리가 학교에서 배운 사칙연산과 거의 비슷합니다. 더하기(+), 빼기(-), 곱하기(*), 나누기(/) 외에 나머지를 구하는 %가 추가로 있습니다.

int a = 7, b = 2;
printf("%d\n", a + b); // 9
printf("%d\n", a - b); // 5
printf("%d\n", a * b); // 14
printf("%d\n", a / b); // 3 (정수 나눗셈이라 몫만 남음)
printf("%d\n", a % b); // 1 (나머지)

여기서 주의할 점은 int끼리 나누면 소수점이 버려진다는 것입니다. 7 / 2는 수학적으로는 3.5지만, C언어에서 정수끼리 나누면 3이 됩니다. 정확한 소수 결과가 필요하다면 둘 중 하나 이상을 double로 바꿔줘야 합니다.

관계 연산자

관계 연산자는 두 값을 비교해서 참(1)인지 거짓(0)인지를 알려줍니다. ==(같다), !=(다르다), >, <, >=, <=가 있습니다.

int x = 5, y = 10;
printf("%d\n", x == y); // 0 (거짓)
printf("%d\n", x < y);  // 1 (참)

C언어는 별도의 boolean 타입 대신 정수 01로 참/거짓을 표현합니다. 이 연산자들은 다음에 배울 조건문(if)에서 아주 많이 쓰이게 됩니다.

논리 연산자

논리 연산자는 여러 조건을 조합할 때 사용합니다. &&(그리고), ||(또는), !(부정)이 있습니다.

int age = 20;
int hasTicket = 1;

if (age >= 18 && hasTicket) {
    printf("입장 가능합니다.\n");
}

&&는 양쪽 조건이 모두 참일 때만 참이 되고, ||는 둘 중 하나만 참이어도 참이 됩니다. !는 참/거짓을 뒤집습니다.

비트 연산자

비트 연산자는 값을 2진수(비트) 단위로 다룰 때 사용합니다. 처음에는 생소하지만 하드웨어 제어나 플래그 처리 등에서 자주 쓰입니다.

int a = 6;  // 0110
int b = 3;  // 0011

printf("%d\n", a & b);  // 2  (AND)
printf("%d\n", a | b);  // 7  (OR)
printf("%d\n", a ^ b);  // 5  (XOR)
printf("%d\n", ~a);     // -7 (NOT)
printf("%d\n", a << 1); // 12 (왼쪽 시프트, 2배)
printf("%d\n", a >> 1); // 3  (오른쪽 시프트, 1/2배)

예제 코드로 확인해보기

지금까지 배운 연산자들을 하나의 프로그램으로 묶어 보겠습니다.

#include <stdio.h>

int main(void) {
    int score1 = 85, score2 = 90;
    int passLine = 60;

    // 산술 연산자
    int sum = score1 + score2;
    double average = sum / 2.0;

    // 관계 연산자
    int isPass1 = score1 >= passLine;
    int isPass2 = score2 >= passLine;

    // 논리 연산자
    int bothPass = isPass1 && isPass2;

    // 비트 연산자 (단순 예시)
    int flags = 5 & 3;

    printf("총점: %d\n", sum);
    printf("평균: %.1f\n", average);
    printf("둘 다 합격? %d\n", bothPass);
    printf("비트 연산 결과: %d\n", flags);

    return 0;
}

코드 동작 설명 및 실행 결과

  • sum은 두 점수를 더한 값이고, averagesum2.0으로 나눠 실수 나눗셈을 유도한 결과입니다. 만약 2로 나눴다면 정수 나눗셈이 되어 소수점이 잘렸을 겁니다.
  • isPass1isPass2는 각 점수가 합격선(passLine) 이상인지 관계 연산자로 비교한 결과이며, 참이면 1, 거짓이면 0이 저장됩니다.
  • bothPass는 두 결과를 &&로 묶어서 “둘 다 합격했는가”를 판단합니다.
  • flags5(0101)3(0011)을 비트 AND 연산한 결과로 1(0001)이 됩니다.

이 코드를 gcc operators.c -o operators로 컴파일하고 실행하면 다음과 같은 결과가 나옵니다.

총점: 175
평균: 87.5
둘 다 합격? 1
비트 연산 결과: 1

핵심 요약

  • 산술 연산자(+, -, *, /, %)로 기본적인 계산을 할 수 있으며, 정수 나눗셈은 소수점이 버려진다는 점을 기억해야 합니다.
  • 관계 연산자(==, !=, >, <, >=, <=)는 두 값을 비교해 참(1) 또는 거짓(0)을 반환합니다.
  • 논리 연산자(&&, ||, !)는 여러 조건을 조합해 더 복잡한 판단을 가능하게 합니다.
  • 비트 연산자(&, |, ^, ~, <<, >>)는 값을 2진수 단위로 다루며, 플래그 처리 등에 활용됩니다.

다음 편에서는 프로그램과 사용자가 값을 주고받는 방법인 “입출력 (printf/scanf)”에 대해 자세히 알아보겠습니다. 지금까지 결과를 화면에 출력할 때만 썼던 printf의 다양한 서식 지정자와, 사용자 입력을 받는 scanf의 사용법을 예제와 함께 정리해보겠습니다.