증감 연산자(increment and decrement operator) ++·--는 변수의 값을 1 늘리거나 줄이고, 복합 대입 연산자(compound assignment operator)는 a += 3처럼 셈과 대입을 한 번에 합니다. ++가 이름 앞에 붙느냐 뒤에 붙느냐에 따라 식이 내놓는 값이 달라 출력이 갈리므로, 두 칸이 바뀌는 차례를 가려 읽어야 합니다. 아래 그림은 i++와 ++i에서 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++ | 5 | 6 |
++i | 6 | 6 |
i-- | 5 | 4 |
--i | 4 | 4 |
i++;처럼 혼자 쓴 줄은 전위·후위 모두 i를 1 늘릴 뿐이라 결과가 같습니다. 차이는 대입이나 printf 안처럼 식의 값을 쓰는 자리에서만 납니다.
한 식에서 같은 칸을 두 번 바꾸는 i++ + ++i는 C가 결과를 정해 두지 않아 컴파일러마다 다를 수 있습니다. 이런 줄에 경고를 내는 컴파일러도 있습니다.
2복합 대입 연산자
| 연산자(a 10 · b 3) | 같은 뜻 | 뒤의 a |
|---|---|---|
a += b | a = a + b | 13 |
a -= b | a = a - b | 7 |
a *= b | a = a * b | 30 |
a /= b | a = a / b | 3 |
a %= b | a = a % b | 1 |
오른쪽 식 전체를 먼저 셈합니다. 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 55번 줄은 후위라 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으로
| C | Java | Python | |
|---|---|---|---|
++ · -- | 있음 | 있음 | 없음 — i += 1로 씀 |
i++ + ++i(i는 5) | 결과가 정해지지 않음 | 12(왼쪽부터 셈하도록 정해짐) | — |
| 산술 복합 대입 | 다섯 | 다섯 | 다섯 + //= · **= |
| 비트 복합 대입 | 다섯(&= · ^= · <<= 등) | 다섯 + >>>= | 다섯 |
| 조건 연산자 | c ? x : y | c ? x : y | x 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;
}
| 줄 | x | y |
|---|---|---|
| 5 | 20 | 3 |
| 6 | 14 | 3 |
| 7 | (가) | 3 |
| 8 | (나) | (다) |
| 9 | (라) | 7 |
정답
(가) 4 · (나) 3 · (다) 7 · (라) 3
받는 답:
3 77번 줄은 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 56번 줄은 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 언어 과목(준비 중)의 '++ · --와 복합 대입' 레슨에서 같은 규칙을 처음부터 천천히 봅니다.