4강 · 제3장 · 77~94쪽 · 약 65분

입·출력 함수와 연산자(2)

연산자의 종류부터 산술·관계·논리·대입·조건·비트 연산자, sizeof·형변환, 연산자 우선순위까지 예제로 익힙니다. (교재 제3장 77~94쪽)

학습 목표

  • C 언어의 연산자 종류(산술·관계·논리·대입·조건·비트·기타)를 나열한다
  • 산술 연산자(이항·단항)와 증감 연산자의 전위·후위 차이를 예제로 확인한다
  • 관계·논리 연산자의 결과가 항상 참(1)·거짓(0)임을 설명한다
  • 대입 연산자(복합 대입)와 조건(삼항) 연산자로 식을 간결히 쓴다
  • 비트 연산자(& | ^ ~ << >>)와 sizeof·cast(형변환) 연산자의 쓰임을 안다
  • 연산자 우선순위·결합 방향에 따라 복잡한 식의 계산 순서를 예측한다

왜 이 강이 필요한가?

3강에서는 자료를 화면에 출력하고 키보드로 입력하는 법을 배웠습니다. 이제 그 자료를 가지고 계산·비교·판단하는 도구인 연산자(operator) 를 배웁니다.

이 강은 교재 제3장(입출력함수와 연산자) 의 77~94쪽 범위이며, LMS 강의내용 순서를 따라 다음과 같이 구성합니다.

  1. 연산자의 종류 — 한눈에 훑기
  2. 산술 연산자 — + - * / %, 증감 연산자 ++ --
  3. 관계 연산자 — == != < > <= >=
  4. 논리 연산자 — && || !
  5. 대입 연산자 — = += -= …
  6. 조건 연산자 — ?:
  7. 비트 연산자 — & | ^ ~ << >>

교재 77~94쪽에는 이 뒤에 기타 연산자(sizeof·형변환) 와 연산자 우선순위도 함께 나오므로, 예제를 빠짐없이 다루기 위해 8·9절로 이어서 담았습니다.

본문의 C 예제는 코드 아래에 실행 칸이 붙습니다. 다만 인라인 실행 칸에는 입력 상자가 없어서, scanf가 필요한 예제는 sscanf(고정 문자열 파싱)로 결과를 보여 줍니다. 실제 키보드 입력 실습은 맨 아래 종합 실습(입력 상자 있음)에서 하세요.


1. 연산자의 종류

C 언어의 특징 중 하나는 연산자가 풍부하다는 점입니다. 크게 다음과 같이 나뉩니다.

구분연산자
산술 연산자+ - * / % ++ --
관계 연산자> < >= <= == !=
논리 연산자&& || !
대입 연산자= += -= *= /= %= &= |= ^= <<= >>=
조건 연산자?:
비트 연산자& | ^ ~ << >>
기타 연산자sizeof() cast(형변환) &(주소) *(내용)

&, * 연산자는 포인터 연산자이기도 합니다. 자세한 내용은 9강에서 다룹니다.


2. 산술 연산자

산술 연산자는 피연산자에 대해 사칙연산을 포함한 각종 산술연산을 수행하며, 이항 연산자와 단항 연산자로 나뉩니다.

2.1 이항 연산자

연산자기능사용 예
+ - * /가/감/승/제를 계산i + 5
%나눗셈의 나머지 계산i % 5

+ - * /는 덧셈·뺄셈·곱셈·나눗셈을 수행합니다. %는 나머지 연산자(modulo operator)로 정수형 자료에만 쓸 수 있고 실수형에는 쓸 수 없습니다. 그리고 /는 정수끼리 나누면 정수 나눗셈입니다 (10 / 3 == 3).

교재 예제3-9 — 이항 연산자:

이 예제 실행

실행 결과가 여기에 표시됩니다.

2.2 단항 연산자 — 증감 연산자

연산자기능사용 예
-부호의 반전-5
++1 증가i++, ++i
--1 감소i--, --i

단항 연산자는 자료 1개만을 대상으로 합니다. ++, --는 증감 연산자로, 사용 위치(앞/뒤)에 따라 기능이 달라집니다.

  • i++ (후치연산) — i의 값을 먼저 사용한 뒤 1 증가시킨다.
  • ++i (전치연산) — i의 값을 먼저 1 증가시킨 뒤 사용한다.

i가 5일 때, x = i++;은 x = 5, i = 6이 되고, x = ++i;는 x = 6, i = 6이 됩니다.

교재 예제3-10 — ++, -- 연산자:

이 예제 실행

실행 결과가 여기에 표시됩니다.

3. 관계 연산자

연산자기능사용 예
==같은가의 여부를 비교a == b : a와 b는 같다
!=다른가의 여부를 비교a != b : a와 b는 같지 않다
> >= < <=대소 관계를 비교a >= b : a는 b보다 크거나 같다

관계 연산자(relational operator)는 피연산자의 대소 관계를 비교하며, 결과는 참·거짓입니다. 그래서 조건 검정에 주로 쓰입니다.

생각해 보기: 참과 거짓은 C에서 어떻게 처리될까? 관계 연산자를 사용한 수식은 참이면 1을, 거짓이면 0을 돌려줍니다. 예를 들어 a = 1 == 10;에서 1 == 10은 거짓이므로 a에는 0이 저장됩니다.

교재 예제3-11 — 관계 연산자:

이 예제 실행

실행 결과가 여기에 표시됩니다.

4. 논리 연산자

연산자기능사용 예
&&논리곱(AND) — 양쪽 모두 참일 때만 참a && b
||논리합(OR) — 양쪽 중 하나라도 참이면 참a || b
!논리부정(NOT) — 참이면 거짓, 거짓이면 참!a

논리 연산자(logical operator)는 피연산자에 대해 AND·OR·NOT 연산을 수행하며, 결과는 참·거짓입니다. 논리연산에서 값이 0이면 거짓, 0이 아니면 참입니다.

교재 예제 — 논리 연산자:

이 예제 실행

실행 결과가 여기에 표시됩니다.

5. 대입 연산자

연산자기능사용 예
=a에 값을 대입a = 5
+=a = a + 5a += 5
-=a = a - 5a -= 5
*=a = a * 5a *= 5
/=a = a / 5a /= 5
%=a = a % 5a %= 5
&= |= ^=비트 AND/OR/XOR 후 대입a &= 5
<<= >>=왼쪽/오른쪽 시프트 후 대입a <<= 5

대입 연산자(assignment operator)는 =을 사용해 오른쪽 값을 왼쪽에 대입합니다. 복합 대입은 수식을 압축해 짧고 빠르게 씁니다.

교재 예제3-13 — 대입 연산자:

이 예제 실행

실행 결과가 여기에 표시됩니다.

6. 조건 연산자

  • 형식: (조건) ? 수식1 : 수식2
  • 사용 예: x = (5 > 2) ? 1 : 0;
  • 기능: 조건이 참이면 수식1을, 거짓이면 수식2를 수행합니다.

조건 연산자(conditional operator)는 피연산자 3개를 취하는 유일한 3항 연산자로, ?와 :의 조합으로 씁니다.

교재 예제3-14 — 조건 연산자:

이 예제 실행

실행 결과가 여기에 표시됩니다.

7. 비트 연산자

연산자기능사용 예
&bit AND — 대응 비트가 모두 1일 때만 1a & b
|bit OR — 대응 비트 중 하나라도 1이면 1a | b
^bit XOR — 대응 비트가 서로 다를 때만 1a ^ b
~bit NOT — 1은 0으로, 0은 1로~a
<<왼쪽으로 n bit 이동a << 2
>>오른쪽으로 n bit 이동a >> 2

비트 연산자(bitwise operator)는 수치를 2진수로 바꿔 bit 단위로 연산하며, 정수형 자료에서만 쓸 수 있습니다. 연산해도 원래 변수 x, y의 값은 바뀌지 않습니다.

예를 들어 x = 12 (2진수 1100), y = 10 (2진수 1010)이면:

이 예제 실행

실행 결과가 여기에 표시됩니다.

8. 기타 연산자 — sizeof와 cast(형변환)

연산자기능
sizeof()지정한 자료형·수식·변수가 차지하는 기억공간의 크기(byte)를 구함
cast(형변환)지정된 자료형을 다른 자료형으로 강제로 바꿈
&주소 연산자 — 피연산자의 주소를 나타냄 (9강 포인터)
*내용 연산자 — 피연산자의 내용을 가져옴 (9강 포인터)

8.1 sizeof 연산자

  • 형식: sizeof(자료) 사용 예: sizeof(int)
  • 기능: 지정한 자료(자료형·상수·변수·수식)의 기억장소 크기를 구합니다. 반환 자료형은 size_t 이므로 printf에서는 %zu로 찍습니다.

교재 예제3-15 — sizeof():

이 예제 실행

실행 결과가 여기에 표시됩니다.

8.2 cast 연산자(형변환 연산자)

  • 형식: (형명칭)자료 사용 예: (float)i / j
  • 기능: 이미 지정된 자료형을 강제로 다른 자료형으로 바꿉니다.

형변환에는 자동 형변환(대입·산술연산에서 피연산자 자료형이 다를 때 컴파일러가 자동 처리)과 강제 형변환(cast 연산자로 프로그래머가 명시)이 있습니다.

교재 예제3-16(자동 형변환) · 3-17(강제 형변환):

이 예제 실행

실행 결과가 여기에 표시됩니다.

c = a / b는 int / int라서 결과가 0이 된 뒤 double로 바뀌므로 0.000000입니다. c = (double)a / b는 a를 먼저 double로 바꾸므로(그러면 산술연산 규칙에 따라 b도 자동으로 double로 바뀜) 3.0 / 4.0 = 0.75가 됩니다.


9. 연산자 우선순위

한 식에 연산자가 여럿이면 우선순위에 따라 계산되고, 순위가 같으면 결합 방향에 따라 계산됩니다.

연산자결합 방향
() [] -> . (괄호·구조체·공용체)좌→우
! ~ 단항+ 단항- ++ -- &(주소) *(내용) sizeof() (형)(cast)우→좌
* / % (승제)좌→우
+ - (가감)좌→우
<< >> (비트 이동)좌→우
< <= > >= (대소 비교)좌→우
== != (등가 판정)좌→우
& (bit AND)좌→우
^ (bit XOR)좌→우
| (bit OR)좌→우
&& (논리 AND)좌→우
|| (논리 OR)좌→우
?: (조건 연산자)우→좌
= += -= … (대입 연산자)우→좌

표의 위쪽일수록 우선순위가 높습니다. 단항 연산자·조건 연산자·대입 연산자는 예외적으로 오른쪽에서 왼쪽으로 묶입니다. 헷갈리면 괄호로 명확히 하세요.

교재 예제3-18 — 우선순위에 따른 계산:

이 예제 실행

실행 결과가 여기에 표시됩니다.
  • a + b * c : *가 +보다 우선순위가 높아 b * c부터 계산합니다.
  • a = b += 2 * c : 대입 연산자는 우→좌 결합이므로 b += 2 * c가 먼저 실행되고, 그 결과가 a에 대입됩니다.
  • a / b * c : /와 *는 우선순위가 같으므로 좌→우로, (a / b) * c 순서로 계산합니다.
  • a *= b = c + 5 : a *= (b = (c + 5))의 의미입니다.

10. 종합 예제 — 연산자로 동전 교환하기

교재 예제3-2는 산술 연산자(/, %)만으로 실전 문제를 푸는 예입니다. 입력된 금액을 500·100·50·10원짜리로 나눠 줍니다.

이 예제 실행

실행 결과가 여기에 표시됩니다.

/로 몫(동전 개수)을 구하고, %로 나머지(다음 단위로 넘길 금액)를 구하는 과정을 반복합니다. 직접 실행하며 입력값을 바꿔 보려면 맨 아래 종합 실습을 이용하세요(입력 상자 있음).


11. 교재 예제와 이 사이트가 다른 점

교재에서 자주 보임이 사이트이유
void main()int main(void)표준 권장 형태 (1~3강과 동일)
scanf 앞 #pragma warning(disable:4996)불필요Visual Studio 전용 경고. GCC/clang은 그대로 컴파일
sizeof(...)를 %d로 출력%zu로 출력sizeof의 반환 자료형은 size_t. %d는 형식 불일치 경고 대상
비트 연산자 설명이 그림(비트 칸) 위주x = 12, y = 10 숫자 예제로 재구성그림 대신 실행 가능한 코드로 확인
본문 예제에서 키보드 scanf본문은 sscanf로 결과 확인인라인 실행 칸에 입력 상자가 없음. 실제 입력은 아래 종합 실습

12. 지금 실습할 것

아래 종합 실습은 입력 상자가 있는 실행 칸입니다. 「표준 입력」 칸에 금액(예: 18691)을 넣고 실행하세요. (비워 두면 기본값 18691로 동작합니다.)

  1. 그대로 실행해 500·100·50·10원 동전 개수와 잔돈을 확인
  2. 입력 금액을 730으로 바꿔 동전 개수가 어떻게 달라지는지 확인
  3. coin_500 = in_money / 500;을 coin_500 = in_money / 1000;으로 바꿔 결과가 왜 틀려지는지 관찰
  4. in_money %= 500;을 지우면 coin_100 계산이 왜 잘못되는지 생각해 보기
  5. 위쪽 본문의 비트 연산자 예제에서 x, y 값을 바꿔 &, |, ^, <<, >> 결과를 예측 후 실행으로 확인

연산자 요약: 산술 + - * / % ++/--(전위·후위), 관계 == != < > <= >=(결과 0/1), 논리 && || !, 대입 = 및 복합 대입, 조건 ?:, 비트 & | ^ ~ << >>, 기타 sizeof()/cast. 우선순위가 헷갈리면 괄호로 명확히 하세요.

코드 실습 (C)

실행 결과가 여기에 표시됩니다.

확인 퀴즈

1. C에서 5/2의 결과는? (둘 다 int)
2. int i = 5; int x = i++; 실행 후 x와 i의 값은?
3. int i = 5; int x = ++i; 실행 후 x와 i의 값은?
4. 관계 연산자(==, <, >= 등)를 사용한 수식의 결과로 알맞은 것은?
5. int a = 5, b = 0; 일 때 a && b 의 결과는?
6. int b = 3; b /= 2 + 3; 실행 후 b의 값은?
7. int x = (5 > 2) ? 1 : 0; 실행 후 x의 값은?
8. unsigned char x = 12 (2진수 1100), y = 10 (2진수 1010) 일 때 x & y 는?
9. sizeof(int) 가 반환하는 값의 자료형은?
10. int a = 3, b = 4; double c = (double)a / b; 에서 (double)a 를 쓰는 이유는?

스스로 점검