C 언어 기초: 연산자와 제어문
쉽게 말하면
4과목에는 짧은 코드를 보고 출력값을 맞히는 문제가 나와요. 가장 중요한 건 값이 어떻게 바뀌는지 종이에 적어 가며 따라가는 거예요. 특히 헷갈리는 게 증감 연산자예요. a++는 지금 값을 먼저 쓰고 나중에 1을 더하고, ++a는 먼저 1을 더하고 써요. 정수끼리 나누면 소수점 아래는 버려지고, switch에서 break가 없으면 아래 case까지 줄줄이 실행돼요.
시험용 정의
C 언어는 절차적 언어로 main() 함수에서 실행이 시작된다. 기본 자료형은 char(1바이트), int(4바이트), float(4바이트), double(8바이트)다. 연산자 우선순위는 대략 단항(++ -- ! ~) → 산술(* / % → + −) → 시프트(<< >>) → 관계(< > → == !=) → 비트(& → ^ → |) → 논리(&& → ||) → 조건(? :) → 대입(= += …) → 쉼표 순이다. 정수 / 정수는 몫(소수 버림), %는 나머지다. 증감 연산자는 전위(++a: 증가 후 사용)와 후위(a++: 사용 후 증가)가 다르다. 제어문은 if, switch(break가 없으면 다음 case로 계속 실행), for, while, do-while(조건과 상관없이 최소 1번 실행), break(반복 탈출), continue(다음 반복으로)가 있다. 출력은 printf와 서식 지정자 %d(정수), %f(실수), %c(문자), %s(문자열), %x(16진수), %o(8진수)를 쓴다.
비유로 이해하기
a++는 '먼저 계산서에 지금 값을 적고, 그다음 장부를 1 올린다', ++a는 '장부를 먼저 1 올리고 그 값을 적는다'다. switch의 break 없는 case는 엘리베이터 정지 버튼을 안 누른 것처럼 아래층까지 쭉 내려간다.
자세히
먼저 알아 둘 말
| 말 | 뜻 |
|---|---|
| 변수 | 값을 담는 이름 붙은 저장 공간 |
| 자료형 | 변수에 담을 값의 종류와 크기 (int, double, char) |
| 서식 지정자 | printf에서 값을 어떤 모양으로 출력할지 정하는 기호 (%d, %f) |
| 전위 / 후위 | 연산자가 변수 앞(++a) / 뒤(a++)에 오는 것 |
| 비트 연산 | 값을 2진수로 보고 자리마다 계산 (& | ^ ~ << >>) |
예제 1: 연산자
int a = 5, b = 3, c;
c = a++ + --b;
printf("%d %d %d\n", a, b, c); // 6 2 7
printf("%d %d %.1f\n", 7/2, 7%2, 7/2.0); // 3 1 3.5
printf("%d %d %d %d\n", 6&3, 6|3, 6^3, 1<<3); // 2 7 5 8
printf("%d %d\n", !5, ~5); // 0 -6- 6 = 110, 3 = 011 → AND 010(2), OR 111(7), XOR 101(5)
- 1 << 3 = 1을 왼쪽으로 3칸 = 8 (2³을 곱한 것과 같다)
- !5: 0이 아니면 참이라 부정은 0. ~5: 비트 반전 = −(5+1) = −6
예제 2: switch와 반복문
int n = 2, s = 0;
switch (n) {
case 1: s += 1;
case 2: s += 2; // 여기서 시작
case 3: s += 3; break; // break가 없어 여기까지 실행
default: s += 10;
}
printf("%d\n", s); // 5
int i, sum = 0;
for (i = 1; i <= 10; i++) {
if (i % 3 == 0) continue; // 3, 6, 9 건너뜀
sum += i;
}
printf("%d %d\n", sum, i); // 37 11
int k = 10;
do { k++; } while (k < 5);
printf("%d\n", k); // 11 (조건이 거짓이어도 한 번 실행)반복이 끝난 뒤 for의 i는 조건이 처음 거짓이 된 값(11)이다.
자주 틀리는 점
printf("%d", 7 / 2)는 3. 실수 결과를 원하면 7 / 2.0- 대입 연산
t += 3; t %= 4; t <<= 2;는 차례로 계산 (10 → 13 → 1 → 4) - &&는 왼쪽이 거짓이면 오른쪽을 계산하지 않는다 (단락 평가)
- 조건 연산자
x % 2 ? "odd" : "even": 0이 아니면 참
기출에서 더 나온 것
| 말 | 뜻 |
|---|---|
| 변수 이름 규칙 | 영문자·숫자·밑줄(_)만 쓰고, 숫자로 시작할 수 없다. 공백·하이픈 불가, int·else·short 같은 예약어도 쓸 수 없다 |
| 구조체 (struct) | 서로 다른 자료형 여러 개를 하나로 묶은 사용자 정의 자료형. struct 이름 { int a; char b; }; |
시험에 이렇게 나와요
- 코드 실행 결과 → 변수 값을 표로 적어 가며 한 줄씩 따라간다
- 변수 이름 규칙 → 영문자·숫자·밑줄, 숫자로 시작 불가, 하이픈·공백 불가, 예약어(else·short 등) 불가
- 비트 연산자 → & | ^ ~ << >> (?는 아님) / 논리 OR → ||
- 산술 연산자 → + - * / % (=는 대입)
- 삼항 연산자 → 조건 ? 참일 때 값 : 거짓일 때 값
- 구조체 → struct
확인 문제
Q1. int a = 5, b = 3, c; c = a++ + --b; 를 실행한 뒤 a, b, c의 값은?
- 6 2 7
- 6 3 8
- 6 2 8
- 5 2 7
정답 보기
1번 6 2 7
a++(후위)는 5를 먼저 쓰고 나중에 a가 6이 된다. --b(전위)는 먼저 b를 2로 줄이고 2를 쓴다. c = 5 + 2 = 7. 결과 a=6, b=2, c=7.
Q2. int q = 3, r = 4; printf("%d", q++ * 2 + r--);의 출력은?
- 10
- 11
- 12
- 14
정답 보기
1번 10
후위라 지금 값을 쓴다: 3 * 2 + 4 = 10. 그 뒤 q=4, r=3.
Q3. int m = 1, cnt = 0; while (m < 100) { m *= 3; cnt++; } printf("%d %d", m, cnt);의 출력은?
- 243 5
- 243 4
- 81 4
- 729 6
정답 보기
1번 243 5
3, 9, 27, 81, 243에서 100 이상이 되어 멈춤. 5번 반복.
Q4. printf("%d", 12 & 10);의 출력은?
- 2
- 6
- 8
- 14
정답 보기
3번 8
1100 & 1010 = 1000 = 8.
Q5. int t = 10; t += 3; t %= 4; t <<= 2; printf("%d", t);의 출력은?
- 1
- 4
- 13
- 52
정답 보기
2번 4
13 → 13 % 4 = 1 → 1 << 2 = 4.
헷갈리기 쉬운 O·X
do-while 문은 조건이 처음부터 거짓이면 한 번도 실행되지 않는다.
정답 보기
X 조건을 나중에 검사해 최소 한 번 실행된다.
C에서 7 / 2의 결과는 3이다.
정답 보기
O 정수끼리 나누면 소수 부분을 버린다.
switch 문의 case에 break가 없으면 그 case만 실행하고 switch를 빠져나간다.
정답 보기
X 다음 case들도 차례로 실행된다(fall-through).