본문으로 건너뛰기

증감·대입·조건 연산자

정보처리기사 목차프로그래밍 기초레슨 127 / 233

목차

증감 연산자(increment and decrement operator) ++·--는 변수의 값을 1 늘리거나 줄이고, 복합 대입 연산자(compound assignment operator)는 a += 3처럼 셈과 대입을 한 번에 합니다. ++가 이름 앞에 붙느냐 뒤에 붙느냐에 따라 식이 내놓는 값이 달라 출력이 갈리므로, 두 칸이 바뀌는 차례를 가려 읽어야 합니다. 아래 그림은 i++와 ++i에서 i 칸과 받는 칸에 드는 값, 복합 대입과 조건 연산자가 칸을 채우는 모습입니다.

9단계 중 1단계. 4번 줄 — i 칸에 5를 넣습니다. 이제 i 칸과 다른 칸이 바뀌는 차례를 봅니다.

1전위·후위 증감 연산자

그림의 코드입니다.

#include <stdio.h>

int main(void) {
  int i = 5;
  int a = i++;
  int b = ++i;
  i += 3;
  int m = i > b ? i : b;
  printf("%d %d %d\n", a, b, m);
  return 0;
}
실행 결과
5 7 10

++가 이름 뒤에 붙는 후위(postfix)는 지금 값을 식의 값으로 쓰고 1을 늘립니다. 앞에 붙는 전위(prefix)는 먼저 늘리고 늘린 값을 씁니다.

식(i는 5)식의 값그 뒤 i
i++56
++i66
i--54
--i44

i++;처럼 혼자 쓴 줄은 전위·후위 모두 i를 1 늘릴 뿐이라 결과가 같습니다. 차이는 대입이나 printf 안처럼 식의 값을 쓰는 자리에서만 납니다. 한 식에서 같은 칸을 두 번 바꾸는 i++ + ++i는 C가 결과를 정해 두지 않아 컴파일러마다 다를 수 있습니다. 이런 줄에 경고를 내는 컴파일러도 있습니다.

2복합 대입 연산자

연산자(a 10 · b 3)같은 뜻뒤의 a
a += ba = a + b13
a -= ba = a - b7
a *= ba = a * b30
a /= ba = a / b3
a %= ba = a % b1

오른쪽 식 전체를 먼저 셈합니다. a *= b + 1은 a = a * (b + 1)이라 40입니다. 알고리즘과 시간 복잡도의 i /= 2는 i를 반으로 줄이고, 알고리즘 설계 기법의 m %= coin[i]는 m을 나누고 남은 돈으로 바꿉니다.

3조건 연산자

조건 연산자(conditional operator)는 조건 ? 값1 : 값2 꼴로, 조건이 참이면 값1, 거짓이면 값2가 식의 값입니다. 피연산자가 셋이라 삼항 연산자(ternary operator)라고도 부릅니다. 쓰이지 않는 쪽은 셈하지 않습니다. 8번 줄은 i > b가 참이라 i의 값 10이 m에 들어갑니다. 조건 연산자가 겹치면 오른쪽부터 묶어, x ? 1 : y ? 2 : 3은 x ? 1 : (y ? 2 : 3)입니다.

예제

후위·전위·복합 대입·조건 연산자가 이어집니다. 무엇이 찍힐까요?

#include <stdio.h>

int main(void) {
  int a = 3;
  int b = a++ * 2;
  int c = --a + b;
  a *= b - 4;
  c %= 4;
  int d = a > c ? a - c : c - a;
  printf("%d %d\n", a, b);
  printf("%d %d\n", c, d);
  return 0;
}
실행 결과 보기
실행 결과
6 6
1 5

5번 줄은 후위라 3에 2를 곱한 6이 b에 들고 a는 4가 됩니다. 6번 줄은 전위라 a가 먼저 3이 되어 c는 9입니다. 7번 줄은 a = a * (b - 4)라 6, 8번 줄은 9 % 4라 c는 1입니다. 6 > 1이 참이라 d는 6 − 1 = 5입니다.

같은 코드를 Java·Python으로

CJavaPython
++ · --있음있음없음 — i += 1로 씀
i++ + ++i(i는 5)결과가 정해지지 않음12(왼쪽부터 셈하도록 정해짐)—
산술 복합 대입다섯다섯다섯 + //= · **=
비트 복합 대입다섯(&= · ^= · <<= 등)다섯 + >>>=다섯
조건 연산자c ? x : yc ? x : yx if c else y

Python에서 i++는 문법 오류입니다. ++i는 부호 +를 두 번 붙인 것이라 i가 그대로입니다.

시험 포인트

  • 필기: 전위(++i)는 먼저 늘리고 그 값을 쓰고, 후위(i++)는 지금 값을 쓰고 늘립니다. 혼자 쓴 i++;와 ++i;는 같습니다. 복합 대입은 오른쪽 식 전체를 먼저 셈합니다. 조건 연산자는 참이면 ? 뒤, 거짓이면 : 뒤의 값입니다. Python에는 ++가 없습니다.
  • 실기: 결과를 그대로 씁니다 — 대입·printf 안의 전위·후위, *=의 오른쪽 식, 조건 연산자가 고른 값. 이름으로는 조건 연산자(Conditional Operator)와 복합 대입 연산자(Compound Assignment Operator)를 씁니다.

확인 문제

1. x가 8일 때 y = --x * 2;를 실행했습니다. 그 뒤의 x와 y를 고르세요.

  • ① x 7 · y 14
  • ② x 7 · y 16
  • ③ x 8 · y 14
  • ④ x 8 · y 16
정답

①입니다. 전위라 x가 먼저 7이 되고, 7에 2를 곱한 14가 y에 들어갑니다.

  • ② 줄이기 전 값 8로 곱했습니다. 그것은 후위 x--일 때입니다.
  • ③ x가 그대로라고 봤습니다. --x는 x를 1 줄입니다.
  • ④ x를 줄이지 않고 8에 2를 곱했습니다. --x는 곱하기 전에 x를 1 줄입니다.

2. 위 예제에서 5번 줄만 int b = ++a * 2;로 바꿨습니다. 출력을 그대로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.

정답

받는 답:

12 8
3 9

a가 먼저 4가 되어 b는 8입니다. 6번 줄에서 a는 3이 되고 c는 3 + 8 = 11, 7번 줄에서 a는 3 × (8 − 4) = 12, 8번 줄에서 c는 11 % 4 = 3입니다. 12 > 3이라 d는 9입니다.

  • 틀리는 꼴 6 6과 1 5: 바꾸기 전 예제의 답입니다. 5번 줄을 후위처럼 읽었습니다 — 전위는 늘린 값 4로 곱합니다.
  • 틀리는 꼴 첫 줄 16 8: 6번 줄의 --a를 놓쳐 a를 4로 두었습니다.

3. 다음 코드의 추적 표 (가)~(라)를 채운 뒤, 출력을 그대로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.

#include <stdio.h>

int main(void) {
  int x = 20;
  int y = 3;
  x -= y * 2;
  x /= y;
  y += x--;
  x %= y;
  printf("%d %d\n", x, y);
  return 0;
}
줄xy
5203
6143
7(가)3
8(나)(다)
9(라)7
정답

(가) 4 · (나) 3 · (다) 7 · (라) 3

받는 답:

실행 결과
3 7

7번 줄은 14 / 3의 몫 4입니다. 8번 줄은 후위라 x의 지금 값 4를 y에 더해 7이 되고, 그다음 x가 3이 됩니다. 9번 줄은 3 % 7이라 3입니다.

  • 틀리는 꼴 (가)에 4.67: 정수끼리 나누면 몫만 남습니다.
  • 틀리는 꼴 (다)에 6: 8번 줄에서 줄인 뒤의 3을 더했습니다. 후위는 줄이기 전 값 4를 씁니다.

4. 다음 코드의 출력을 그대로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.

#include <stdio.h>

int main(void) {
  int a = 5;
  int b = 0;
  int c = a > 3 || ++b;
  int d = b ? a : a * 2;
  int e = a-- - b;
  printf("%d %d %d\n", b, c, d);
  printf("%d %d\n", a, e);
  return 0;
}
정답

받는 답:

실행 결과
0 1 10
4 5

6번 줄은 a > 3이 참이라 ||의 오른쪽 ++b를 셈하지 않아 b는 0 그대로이고 c는 1입니다. 7번 줄은 b가 0(거짓)이라 : 뒤의 a * 2 = 10입니다. 8번 줄은 후위라 5 − 0 = 5가 e에 들고 a는 4가 됩니다.

  • 틀리는 꼴 첫 줄 1 1 5: ++b가 실행된다고 봤습니다. 왼쪽이 참이면 ||는 오른쪽을 셈하지 않습니다.
  • 틀리는 꼴 둘째 줄 4 4: 줄인 뒤의 a로 뺐습니다. 후위는 줄이기 전 값 5를 씁니다.

5. 다음 (가)·(나)의 이름을 한글 이름과 영문으로 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.

  • (가) max = a > b ? a : b;처럼 앞의 식이 참인지에 따라 두 값 가운데 하나를 고르는 연산자입니다. 피연산자가 셋입니다.
  • (나) total = total + score;⁠를 total += score;로 줄여 쓰게 하는 연산자입니다.
정답

받는 답: (가) 조건 연산자(Conditional Operator) 또는 삼항 연산자(Ternary Operator) · (나) 복합 대입 연산자(Compound Assignment Operator)

(가)의 실마리는 ?와 : 사이에서 값을 고르는 것, (나)는 셈한 뒤 같은 칸에 다시 넣는 것을 한 기호로 쓰는 것입니다.

  • 틀리는 꼴 관계 연산자 — (가)에: a > b처럼 비교만 하고 1·0을 냅니다. 두 값 가운데 하나를 고르는 것은 조건 연산자입니다.
  • 틀리는 꼴 증감 연산자 — (나)에: 1씩만 늘리거나 줄입니다. 아무 값이나 더해 넣는 것은 복합 대입 연산자입니다.

처음이라면: C 언어 과목(준비 중)의 '++ · --와 복합 대입' 레슨에서 같은 규칙을 처음부터 천천히 봅니다.

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

정보처리기사 목차로