우선순위, 비트 연산, 삼항, 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 · XOR
2024-1회 2번 · 2025-1회 19번 · 2025-3회 15번 · 17번
switch 흘러내림
2
break 없는 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.
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);
}
}
"큰 돈부터 거슬러주기": /는 "몇 장 주나", %는 "얼마 남았나". 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);