C 연산자 · 비트 · 제어문 E04

우선순위, 비트 연산, 삼항, break 없는 switch, static 지역변수, 진법. 짧은 코드에 함정 하나씩이다

왜 이 장을 하나
이 장의 코드는 10줄 안팎이고 답은 숫자 하나가 대부분이다. 그런데도 틀리는 이유는 연산자 하나의 규칙을 잘못 알아서다. << 는 곱셈, &&& 는 다른 것, switch 는 break 없으면 흘러내리고, static 은 남는다. 규칙 10개를 표로 굳히고 기출 11문항에 대 본다.
다루는 것우선순위 · 비트 · 삼항 · switch · static · 진법 · 반복 누적
문항기출 11 · 예상 3 · 훈련 10
끝나면연산자 식을 2진수 표로 계산한다

01왜 이 장인가

왜 이걸 하나 — C 42문항 중 11문항이 이 장이고, 짧아서 시간이 덜 드는 5점이다. 규칙만 맞으면 30초짜리다.

11회분 220문항 중 이 장의 기출은 11문항이다. 11회 중 8회에 나왔고 2023년 2회 · 2025년 3회에 2문항씩이었다. 훈련 C 10문항(5 · 6 · 11 · 14~16 · 20~22 · 27 · 30)이 붙는다.

몇 문항무엇을 적나보기
연산자 식 계산4시프트 · 삼항 · 비트 AND · 논리 · unsigned · XOR2024-1회 2번 · 2025-1회 19번 · 2025-3회 15번 · 17번
switch 흘러내림2break 없는 case 의 출력 · 누적2023-2회 10번 · 2024-2회 10번
반복 누적 · 판별2배수 세기 · 완전수 합2023-2회 4번 · 2023-3회 9번
빈칸 — 식2진법 변환의 % 와 자리값, 나눗셈 · 나머지 식 4개2023-1회 9번 · 2023-2회 13번
static 지역변수1호출마다 누적된 값의 합2024-3회 6번

→ 11문항 중 답이 숫자 하나인 것이 8문항이다. 계산이 짧은 만큼 규칙을 하나만 잘못 알아도 통째로 틀리고, 부분 점수도 없다. 2023년 2회 13번(식 4개)만 소문항이 있다.

E01 진단에 이 장 문항은 없었다. 그러나 2025년 3회에 2문항(비트 · unsigned)이 나왔고 2026년에는 안 나왔으니, 3회에 다시 나올 자리로 본다. 03절의 규칙 표를 외우면 이 장은 끝난다.

문항 수는 이 노트의 문제 데이터에서 ch=E04 인 것을 센 값이다(2026-09-14). 2023-2회 13번은 grandlife 복원이 Java 코드라 그대로 실었다(식 자체는 C 와 같다). 11문항 전부 실행하거나 빈칸을 채워 실행해 정답을 확인했다.

02한눈에

왜 이걸 하나 — 시험 전날 규칙 10개를 다시 본다.

우선순위괄호 → 단항(++ -- ! ~ * & 주소) → * / %+ - → 시프트 << >> → 비교 < > <= >=== != → 비트 &^| → 논리 &&|| → 삼항 ?: → 대입. 비트 &== 보다 낮다.
시프트x << n = x × 2ⁿ, x >> n = x ÷ 2ⁿ(내림). 37 << 2 = 148.
비트 연산& 둘 다 1 · | 하나라도 1 · ^ 다르면 1 · ~ 뒤집기. 2진수 8자리로 펴서 자리마다 계산. 12 & 10 = 8, 12 | 10 = 14, 12 ^ 10 = 6.
논리 연산결과는 1 또는 0. && 는 둘 다 참, || 는 하나라도. 0 이 아니면 참. &(비트)와 &&(논리)는 다른 연산자.
삼항 · 증감조건 ? A : B. x++ 는 쓰고 나서 증가, ++x 는 증가하고 나서 씀. i++ + ++i 같은 식은 왼쪽부터 값을 적으며 간다.
switch 흘러내림맞는 case 부터 break 를 만날 때까지 아래 case 와 default 를 전부 실행한다. case 값이 겹치면 첫 것에서 시작.
static 지역변수함수가 끝나도 값이 남는다. 초기화는 첫 호출 때 한 번. 같은 이름의 main 지역변수와는 다른 변수.
정수 나눗셈 · 나머지7 / 2 = 3, 7 % 2 = 1. 금액 분해는 m / 1000, (m % 1000) / 500 …. 자릿수 분리는 n % 10n /= 10.
진법2진수 → 10진수: 아래 자리부터 % 10 으로 떼어 place(1 · 2 · 4 …)를 곱해 더한다. 10진수 → 2진수: % 2 로 떼어 거꾸로. 16진수 A~F = 10~15, 0xA5 = 1010 0101.
unsigned음수가 없다. 0 아래로 내려가면 최댓값으로 되감긴다. %u 로 찍는다. 5u · 7u 는 unsigned 상수.

03밑바닥

왜 이걸 하나 — 규칙 10개는 2진수 한 줄과 흐름 한 줄이면 전부 그려진다.

3-1. 비트 식은 8자리 2진수로 펴서 자리마다 계산한다

비트 연산은 숫자를 2진수로 펴 놓고 같은 자리끼리 계산한다. 12 는 1100, 10 은 1010 이라 AND 는 둘 다 1 인 자리만 → 1000 = 8, OR 는 하나라도 1 → 1110 = 14, XOR 는 다르면 1 → 0110 = 6(예상 1회 6번). 시프트는 자리를 옮기는 것이라 왼쪽 n 칸은 2ⁿ 배, 오른쪽 n 칸은 2ⁿ 으로 나눈 몫이다.

2024년 1회 2번은 삼항과 시프트다. x = 37 은 20 보다 크니 x << 2 = 148, 거기에 3 을 더해 151. 2025년 1회 19번은 value & 0xA5 로 점수마다 1010 0101 자리만 남긴다 — 0xDB(1101 1011) & 0xA5 = 1000 0001 = 129 처럼 한 값씩 표로 계산해 합하면 908 이다. 16진수 한 자리가 2진수 네 자리라는 것만 알면 된다.

2025년 3회 15번은 &&& 가 한 식에 있다. y % 3 < 3 은 1 < 3 참이라 z = 2, z & z >> 1 은 시프트가 먼저라 2 & 1 = 0, 마지막 삼항에서 x > 5 && z <= 3 이 참이라 z × x = 0. 비트 & 는 시프트보다 늦고 논리 && 는 비교보다 늦다는 우선순위가 답을 정한다.

3-2. switch 는 break 가 없으면 흘러내린다

switch 는 맞는 case 로 뛰어 들어간 뒤 break 를 만날 때까지 아래로 계속 실행한다. 2023년 2회 10번은 total 240 을 30 으로 나눈 8 이라 case 8 부터 시작해 B · C · D 를 전부 찍는다(A 는 위라 안 찍힘). 2024년 2회 10번은 7 % 3 = 1 이라 case 1 부터 −7 − 4 − 2 = −13 이다.

case 값이 겹쳐 적힌 것(case 10: case 9:)은 둘 중 어느 값이든 같은 자리에서 시작한다는 뜻이다. break 가 하나도 없는 switch 는 「시작점만 정하고 아래는 전부」라고 읽으면 틀리지 않는다.

3-3. static 은 남고, 지역변수는 함수마다 따로다

함수 안의 static int value = 0; 은 첫 호출 때 한 번만 0 이 되고 그 뒤로는 이전 호출의 값이 남는다. 2024년 3회 6번의 next_value 는 부를 때마다 2 · 4 · 6 · 8 을 돌려주고 합이 20 이다. main 에도 value 라는 변수가 있지만 이름만 같은 다른 변수라 서로 건드리지 않는다(훈련 11 · 27번).

반복 누적 문제는 조건이 전부다. 2023년 2회 4번은 1~2023 에서 4 의 배수를 세면 2023 / 4 = 505 이고, 2023년 3회 9번은 1~100 의 완전수(약수 합이 자기 자신: 6 · 28)를 더해 34 다. 반복 변수의 시작 · 끝 · 증가폭과 조건식을 표에 적으면 손으로도 센다.

3-4. 진법과 금액 분해는 나머지와 몫이다

2진수 101110 을 10진수로 바꾸는 코드(2023년 1회 9번)는 아래 자리부터 input % 10 으로 한 자리를 떼고, 자리값 place 를 1 · 2 · 4 · 8 로 키우며 곱해 더한다. 빈칸은 %2(place *= 2)이고, 채워 돌리면 46 이 나온다. 거꾸로 10진수 → 2진수는 % 2 로 떼어 뒤에서부터 적는다(훈련 30번).

금액 4620 을 1000 · 500 · 100 · 10 으로 나누는 식(2023년 2회 13번)은 큰 단위부터 몫을 취하고 나머지를 다음 단위로 넘긴다 — money / 1000 = 4, (money % 1000) / 500 = 1, (money % 500) / 100 = 1, (money % 100) / 10 = 2. 정수 나눗셈이 몫만 남긴다는 것이 이 식의 근거다.

unsigned(2025년 3회 17번)는 음수가 없는 정수다. 이 문제는 되감김이 없고 리스트 값을 sum × 3 + value 로 모아 125 를 만든 뒤 42 와 XOR 해 87, 100 을 더해 187 이다. XOR 도 2진수로 펴서 자리마다 다르면 1 로 계산한다.

통과 기준은 넷이다. 첫째, 12 와 10 의 AND · OR · XOR · 시프트를 2진수로 펴서 30초 안에 계산한다. 둘째, 우선순위 표에서 시프트 · 비트 · 비교 · 논리 · 삼항의 순서를 안 보고 적는다. 셋째, break 없는 switch 의 시작점과 흘러내림을 손으로 따라간다. 넷째, static 지역변수 · 진법 변환 · 금액 분해의 규칙을 말한다. 기출 11문항이 이 넷 안에 있다.
& 와 && 는 같은 AND 다.& 는 비트끼리, && 는 참 · 거짓끼리다. 2 & 1 은 0(0010 과 0001 은 겹치는 자리가 없다)이지만 2 && 1 은 1(둘 다 0 이 아니라 참). 2025년 3회 15번이 이 둘을 한 식에 넣었다.
switch 는 맞는 case 하나만 실행한다.break 가 있을 때만 그렇다. 없으면 아래 case 와 default 까지 흘러내린다. 2023년 2회 10번이 B 하나가 아니라 BCD 인 이유다.

04기출

왜 이걸 하나 — 규칙 10개를 기출 11문항에 하나씩 대 본다. 어느 규칙이 빠졌는지 정답을 열면 보인다.

비트 식은 2진수 8자리를 종이에 적고, switch 는 시작 case 에 표시를 하고 아래로 선을 긋고, 반복문은 변수 표를 그린다. 답이 숫자 하나라도 과정을 답 칸에 적어 두면 틀린 자리가 남는다.

2023-1회 · 9번C

다음 C 프로그램에서 ①과 ②에 들어갈 연산자와 값을 순서대로 쓰시오.

#include <stdio.h> int main(void) { int input = 101110; int place = 1; int sum = 0; while (input != 0) { sum += (input ① 10) * place; place *= ②; input /= 10; } printf("%d", sum); return 0; }
정답① %, ② 2
input%10은 "맨 오른쪽 자릿수 한 개 떼기", input/10은 "뗀 자리 버리기". 자릿수마다 2의 거듭제곱(di)을 곱해 더하면 10진수가 됩니다. n%10, n/10 콤보는 코드 문제 단골 부품! 빈칸에 답을 넣어 실행하면 출력이 「46」 로 나오는 것을 확인했다. (gcc(도커 alpine)) 그랜드라이프 가답안 표기는 「① %, ② 2」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2023-2회 · 4번C

다음 C 프로그램의 실행 결과를 쓰시오.

#include <stdio.h> int main(void) { int count = 0; for (int number = 1; number <= 2023; number++) { if (number % 4 == 0) { count++; } } printf("%d", count); return 0; }
정답505
2023 ÷ 4 = 505.75 → 몫 505개. 코드를 다 추적할 필요 없이 수학으로 검산 가능한 유형입니다. 복원된 코드를 실행해 위 출력을 그대로 얻었다. (gcc(도커 alpine)) 그랜드라이프 가답안 표기는 「505」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2023-2회 · 10번C

다음 C 프로그램의 실행 결과를 쓰시오.

#include <stdio.h> int main(void) { int score[3] = { 76, 86, 78 }; int total = 0; for (int i = 0; i < 3; i++) { total += score[i]; } switch (total / 30) { case 10: case 9: printf("A"); case 8: printf("B"); case 7: case 6: printf("C"); default: printf("D"); } return 0; }
정답BCD
250/30=8(정수 나눗셈). break가 없으면 일치한 case부터 아래로 전부 흘러내립니다(fall-through). "문이 안 닫힌 미끄럼틀"이라고 기억하세요. 복원된 코드를 실행해 위 출력을 그대로 얻었다. (gcc(도커 alpine)) 그랜드라이프 가답안 표기는 「BCD」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2023-2회 · 13번C

금액 4,620원을 1,000원, 500원, 100원, 10원 단위로 나눌 때 각 개수를 구하는 ①부터 ④의 식을 쓰시오.

public class Main { public static void main(String[] args) { int money = 4620; int a = ( ① ); int b = ( ② ); int c = ( ③ ); int d = ( ④ ); System.out.println(a); System.out.println(b); System.out.println(c); System.out.println(d); } }
정답① money / 1000, ② (money % 1000) / 500, ③ (money % 500) / 100, ④ (money % 100) / 10
"큰 돈부터 거슬러주기": /는 "몇 장 주나", %는 "얼마 남았나". 4620 → 1000원 4장, 남은 620에서 500원 1장, 남은 120에서 100원 1장, 남은 20에서 10원 2장. 빈칸에 답을 넣어 실행하면 출력이 「4 1 1 2」 로 나오는 것을 확인했다. (JDK 17) 그랜드라이프 가답안 표기는 「① money / 1000, ② (money % 1000) / 500, ③ (money % 500) / 100, ④ (money % 100) / 10」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2023-3회 · 9번C

다음 C 프로그램의 실행 결과를 쓰시오.

#include <stdio.h> int isPerfect(int number) { int divisor; int total = 0; for (divisor = 1; divisor <= number / 2; divisor++) { if (number % divisor == 0) { total += divisor; } } return number == total; } int main(void) { int number; int result = 0; for (number = 2; number <= 100; number++) { if (isPerfect(number)) { result += number; } } printf("%d", result); return 0; }
정답34
1~100의 완전수는 6(=1+2+3)과 28(=1+2+4+7+14)뿐. 6+28=34. 완전수 6, 28은 상식으로 외워두면 코드 추적 없이 10초 컷. 복원된 코드를 실행해 위 출력을 그대로 얻었다. (gcc(도커 alpine)) 그랜드라이프 가답안 표기는 「34」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2024-1회 · 2번C

다음 C 프로그램의 실행 결과를 쓰시오.

#include <stdio.h> int main(void) { int x = 37; int y = (x > 20) ? (x << 2) : (x >> 1); printf("%d", y + 3); return 0; }
정답151
핵심 부품: x << n = x × 2ⁿ, 삼항연산자 조건 ? A : B. 시프트를 곱셈으로 바꿔 계산하면 실수가 줄어듭니다. 복원된 코드를 gcc(도커 alpine) 로 실행해 위 출력을 그대로 얻었다. 그랜드라이프 가답안 표기는 「151」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2024-2회 · 10번C

다음 C 프로그램의 실행 결과를 쓰시오.

#include <stdio.h> int calculate(int value) { int result = -value; switch (value % 3) { case 0: result += 3; case 1: result -= 4; default: result -= 2; } return result; } int main(void) { printf("%d", calculate(7)); return 0; }
정답-13
두 가지 함정의 결합: ① 지역변수는 함수를 벗어나면 소멸(같은 이름이어도 다른 변수) ② break 없는 switch는 아래로 흘러내림(fall-through). 복원된 코드를 gcc(도커 alpine) 로 실행해 위 출력을 그대로 얻었다. 그랜드라이프 가답안 표기는 「-13」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2024-3회 · 6번C

다음 C 프로그램의 실행 결과를 쓰시오.

#include <stdio.h> int next_value(void) { static int value = 0; value += 2; return value; } int main(void) { int value = 1; int sum = 0; for (int i = 0; i < 4; i++) { value++; sum += next_value(); } printf("%d", sum); return 0; }
정답20
C의 static 지역변수는 "함수가 끝나도 지워지지 않는 개인 금고" — 초기화는 최초 1회만, 이후 호출에선 이전 값이 유지됩니다. 일반 지역변수와의 차이가 핵심. 복원된 코드를 gcc(도커 alpine) 로 실행해 위 출력을 그대로 얻었다. 그랜드라이프 가답안 표기는 「20」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2025-1회 · 19번C

다음 C 프로그램의 실행 결과를 쓰시오.

#include <stdio.h> typedef struct { const char *name; int score[3]; } Student; int decode(int value) { return value & 0xA5; } int total(const Student *student) { return decode(student->score[0]) + decode(student->score[1]) + decode(student->score[2]); } int main(void) { Student students[2] = { { "Kim", { 0xA0, 0xA5, 0xDB } }, { "Lee", { 0xA0, 0xED, 0x81 } } }; int result = 0; for (int i = 0; i < 2; i++) result += total(&students[i]); printf("%d", result); return 0; }
정답908
decode 는 value & 0xA5 — 비트별 AND 라 0xA5(1010 0101)에서 1 인 자리만 남는다. Kim: 0xA0 → 160, 0xA5 → 165, 0xDB → 0x81 = 129, 합 454. Lee: 0xA0 → 160, 0xED → 0xA5 = 165, 0x81 → 129, 합 454. 둘을 더해 908. 16진수를 2진수 8자리로 펴서 AND 를 취하는 것이 전부다. 복원된 코드를 gcc(도커 alpine)로 실행해 908 을 얻었다. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2025-3회 · 15번C

다음 C 프로그램의 실행 결과를 쓰시오.

#include <stdio.h> int main(void) { int x = 7, y = 4, z; z = y % 3 < 3 ? 2 : 1; z = z & z >> 1; z = x > 5 && z <= 3 ? z * x : z / x; printf("%d", z); return 0; }
정답0
C의 논리 연산 결과는 항상 1(참) 또는 0(거짓)이라는 것, &(비트)와 &&(논리)는 완전히 다르다는 것 — 두 함정의 조합. 복원된 코드를 gcc(도커 alpine) 로 실행해 위 출력을 그대로 얻었다. 그랜드라이프 가답안 표기는 「0」. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
2025-3회 · 17번C

다음 C 프로그램의 실행 결과를 쓰시오.

#include <stdio.h> struct Node { struct Node *next; unsigned int value; }; int main(void) { struct Node n1 = { 0, 5u }; struct Node n2 = { 0, 7u }; struct Node n3 = { 0, 11u }; n3.next = &n2; n2.next = &n1; struct Node *cur = &n3; unsigned int sum = 0; while (cur) { sum = sum * 3 + cur->value; cur = cur->next; } sum = (sum ^ 42u) + 100u; printf("%u", sum); return 0; }
정답187
연결 리스트를 n3 → n2 → n1 로 따라가며 sum = sum × 3 + value 를 반복한다: 0×3+11 = 11, 11×3+7 = 40, 40×3+5 = 125. 그 뒤 125 XOR 42 = 87(비트별 다르면 1), 87 + 100 = 187. unsigned 라 %u 로 찍고, 여기서는 음수가 안 나와 되감김은 없다. 복원된 코드를 gcc(도커 alpine)로 실행해 187 을 얻었다. 복원 출처는 grandlife.co.kr 회차별 복원 페이지(2026-09-14 대조). 공식 원문이 아니라 문장·변수명·값이 실제와 다를 수 있고, 문항 번호도 복원본마다 다르다.
예상 1회 · 6번C빈출 원리: 비트 연산

다음 코드의 출력을 쓰시오.

int a = 12, b = 10; printf("%d %d %d", a & b, a | b, a ^ b);
정답8 14 6
12=1100, 10=1010. AND(둘 다 1)=1000=8, OR(하나라도 1)=1110=14, XOR(다를 때만 1)=0110=6. 2진수로 세로로 적고 자리별 비교 — 2023 1회·2024 1회 유형.
예상 2회 · 3번C빈출 원리: 약수 판별

다음 코드의 출력을 쓰시오.

int n = 36, cnt = 0; for (int i = 1; i <= n; i++) if (n % i == 0) cnt++; printf("%d", cnt);
정답9
36의 약수: 1, 2, 3, 4, 6, 9, 12, 18, 36 → 9개. n % i == 0 = "나누어떨어짐 = 약수". 완전수(2023 3회)·배수 개수(2023 2회)와 같은 계열 — 코드보다 수학으로 검산하면 빠릅니다.
예상 2회 · 6번C빈출 원리: do-while

다음 코드의 출력을 쓰시오.

int i = 0, sum = 0; do { sum += i; i += 2; } while (i < 10); printf("%d %d", i, sum);
정답10 20
sum에 0+2+4+6+8=20이 쌓이고, i는 10이 되는 순간 조건(i<10) 탈락. 탈출 직후 i의 값(10)을 출력한다는 것이 함정 — 마지막으로 더해진 8과 혼동하지 마세요. do-while은 "일단 한 번은 실행".

05틀리는 자리

왜 이걸 하나 — 짧은 코드는 규칙 하나에서 통째로 깎인다.

자리새는 꼴적는 법기출
우선순위z & z >> 1 을 왼쪽부터 계산한다시프트가 & 보다 먼저. 표를 외운다2025-3회 15번
& · &&비트를 논리로, 논리를 비트로기호 개수를 센다. 하나면 비트, 둘이면 논리2025-3회 15번
흘러내림맞는 case 하나만 적는다break 가 없으면 아래 전부2023-2회 10번 · 2024-2회 10번
static호출마다 0 으로 초기화한다초기화는 첫 호출 한 번. 값이 누적된다2024-3회 6번
같은 이름main 의 value 와 함수의 value 를 섞는다다른 변수. 함수 안 static 만 누적2024-3회 6번
16진수0xA5 를 10진수로 바꾸지 않고 AND 한다2진수 8자리로 펴서 자리마다2025-1회 19번
빈칸 식place *= 2 를 10 으로2진수 자리값은 2 의 거듭제곱2023-1회 9번
서식%u%d 로 읽어 음수를 적는다unsigned 는 음수가 없다2025-3회 17번

이 장의 답은 계산 한 번에 숫자 하나라 되돌아볼 자리가 없다. 정답을 적기 전에 규칙 10개 중 무엇을 썼는지 하나씩 표시하며 검산한다.

06훈련

왜 이걸 하나 — 규칙 10개를 짧은 코드 10개로 돌린다. 매일 5문항씩 곁들이는 자리다.

훈련 10문항은 전위 · 후위 증감, continue 와 break, static, switch 흘러내림, 비트 3종, 중첩 삼항, 초 변환, do-while, 중첩 반복, 전역 · 지역 가리기, 10진수 → 2진수다. 정답은 전부 gcc 로 실행해 확인했다.

훈련 C · 5번C전위/후위 증감
int x = 5; printf("%d ", x++); printf("%d ", ++x); printf("%d", x);
정답5 7 7
x++는 "쓰고 나서 증가"(5 출력 후 6), ++x는 "증가하고 나서 사용"(7). 최종 x=7.
훈련 C · 6번Ccontinue와 break의 순서
int s = 0; for (int i = 1; i <= 10; i++) { if (i % 2 == 0) continue; if (i > 7) break; s += i; } printf("%d", s);
정답16
홀수만 통과: 1+3+5+7=16. i=8은 짝수라 continue가 먼저 걸려 break에 못 닿고, i=9에서 break. 두 문장의 순서가 함정.
훈련 C · 11번Cstatic 지역변수
int f() { static int c = 0; c += 2; return c; } int main() { f(); f(); printf("%d", f()); }
정답6
static은 "함수가 끝나도 남는 금고" — 초기화는 최초 1회, 이후 2→4→6 누적. 일반 지역변수였다면 매번 2.
훈련 C · 14번Cswitch fall-through
int n = 3, r = 0; switch (n) { case 1: r += 1; case 3: r += 3; case 5: r += 5; break; case 7: r += 7; } printf("%d", r);
정답8
case 3에 착지 후 break를 만날 때까지 흘러내림: 3+5=8. case 1은 착지 지점 라 실행 안 됨.
훈련 C · 15번C비트 연산 3종
int a = 9, b = 6; printf("%d %d %d", a & b, a | b, a >> 2);
정답0 15 2
9=1001, 6=0110 — 겹치는 비트가 없어 AND=0, OR=1111=15. 9>>2 = 9÷4 = 2(정수).
훈련 C · 16번C중첩 삼항 연산자
int x = 8, y = 5; int r = x > y ? (x % y == 0 ? 1 : 2) : 3; printf("%d", r);
정답2
8>5 참 → 안쪽으로: 8%5=3≠0 → 2. 중첩 삼항은 바깥부터 괄호 단위로 계단식 판정.
훈련 C · 20번C초 → 시:분:초 변환
int t = 3750; printf("%d:%d:%d", t / 3600, (t % 3600) / 60, t % 60);
정답1:2:30
/는 "몇 개 들어가나", %는 "얼마 남나". 3750초 = 1시간(3600) + 150초 = 2분 + 30초. 화폐 분리(2023 2회 기출)와 동일 패턴.
훈련 C · 21번Cdo-while 자릿수 세기
int n = 2026, c = 0; do { c++; n /= 10; } while (n > 0); printf("%d", c);
정답4
2026→202→20→2→0, 4회 나눔 = 4자리. do-while은 "일단 한 번 실행" — n=0으로 시작해도 c=1이 되는 것이 while과의 차이.
훈련 C · 22번C중첩 반복 누적
int c = 0; for (int i = 2; i <= 4; i++) for (int j = 1; j <= i; j++) c += j; printf("%d", c);
정답19
i=2: 1+2=3 / i=3: 1+2+3=6 / i=4: 1+2+3+4=10 → 3+6+10=19. 안쪽 반복 범위가 i에 의존하는 삼각형 패턴.
훈련 C · 27번C전역 vs 지역 변수 가리기
int x = 1; void f() { int x = 10; x++; printf("%d ", x); } int main() { f(); x += 5; printf("%d", x); }
정답11 6
f() 안의 x는 이름만 같은 다른 변수(지역이 전역을 가림) — 10+1=11. 전역 x는 그대로 1이었다가 +5=6. 2024 2회 스코프 함정과 동일.
훈련 C · 30번C10진수 → 2진수
int n = 13, b[8], i = 0; while (n > 0) { b[i++] = n % 2; n /= 2; } for (i = i - 1; i >= 0; i--) printf("%d", b[i]);
정답1101
13을 2로 나눈 나머지 1,0,1,1을 역순으로 출력 = 1101. 2진→10진(2023 1회 기출)의 반대 방향 — 세트로 준비.

07백지 재현

왜 이걸 하나 — 아래를 안 보고 적을 수 있어야 이 장이 끝난다.