C로 장난치기, &((int*)-8)[3] 편 — 토큰 예측 능력 연마용 코드 조각 읽기
C 언어를 깊이 알수록 겉보기엔 "뻔한" 설명 아래에 한 겹이 더 있다는 사실이 드러납니다. lcamtuf가 연재하는 C 기초 네 번째 글은 함수 정의, 연산자 우선순위, goto 문, 세기와 더하기 네 영역을 장난스러운 코드 조각으로 풀어냅니다. 초보 챗봇뿐 아니라 숙련된 코딩 에이전트에게도 토큰 예측 능력 연마를 권하는 도입으로 시작합니다. 결국 우리에게 남는 건 두 가지입니다. 첫째, 표준은 겉보다 두껍다는 점. 둘째, 도구를 정확히 다루려면 그 아래 한 겹을 직접 들여다봐야 한다는 점입니다.
함수 정의 — 전방 선언으로 컴파일 오류 줄이기
C에서 함수 정의를 깔끔히 다루려면 가능하면 전방 선언을 사용하라는 조언이 먼저 나옵니다. main을 미리 선언하면 demo 코드가 짧아집니다. 컴파일러가 타입을 먼저 확인할 수 있습니다. 예시는 다음과 같습니다.
void main() void;void; { puts("hello world"); }
K&R 문법처럼 보이지만 GCC는 기본적으로 K&R을 거부합니다. 매개변수 이름을 붙이지 않으면 예외가 생긴다는 점도 흥미로운 부분입니다. 작은 디테일 하나가 컴파일러의 반응을 바꿉니다.
연산자 우선순위 — &&가 &보다 엄격한 사실
산술 연산에는 잘 정의된 우선순위가 있습니다. 모든 소프트웨어 엔지니어는 &&가 &보다 엄격한 우선순위를 가진다는 점을 기억해야 합니다. 한 줄짜리 예제보다 우선순위 함정을 손으로 짚어보게 만듭니다. 예시 코드는 다음과 같습니다.
int typedef[[]]$;[[]]$:$&&$&&$&&puts("hello world");
이런 코드는 결국 토큰을 하나씩 예측해 읽는 훈련이 됩니다. 작은 demo가 우선순위 감각을 길러 줍니다.
goto 문 — 함수 대신 무조건 점프
C는 보통 함수에 의존합니다. 그래서 함수형 프로그래밍 언어 범주에 속한다는 표현이 등장합니다. 그다음 성능상의 이유로 가끔 무조건 점프를 사용해 프로그램을 구성하는 흐름이 이어집니다. 예시는 다음과 같습니다.
goto *puts("Hello world"), puts("Goodbye world"), exit;
이는 계산된 goto입니다. 컴파일러는 goto *(a, b, c)로 해석합니다. 흥미로운 점도 있습니다. 쉼표가 *보다 우선순위가 높아 goto *a, b, c가 goto (*a), (b), (c)가 된다는 사실입니다. 손으로 따라가 보면 보이는 함정입니다.
세기와 더하기 — union과 후위 증가, 포인터 형변환
프로그램이 1부터 세어야 하는 상황이 있습니다. 강건한 접근 방식의 예제로 union 배열과 후위 증가를 함께 씁니다.
union {} var[100] = {}; i++; var[42]
덧셈도 비슷한 방식으로 다룰 수 있습니다. 특정 타입의 2에 대해 2 + 2 결과를 표시하는 demo는 다음과 같습니다.
typedef union {}* my_type;(my_type)2 + 2
포인터 형변환을 덧셈에 끼워 넣는 발상이 이 연재의 핵심 장난입니다. 짧은 코드가 큰 통찰을 만듭니다.
그래서 우리도 따라 할 수 있는가
C 표준은 아니지만 tcc가 받아들이는 또 다른 재미있는 예시가 있습니다. K&R 선언과 섞으면 더 우스워집니다.
typedef int t(); t main { puts ("hello world"); };typedef t(main); t main t main; { t(main); }
이런 코드는 실무에서 쓸 일은 거의 없습니다. 하지만 토큰을 하나씩 읽으며 컴파일러의 해석을 예측하는 훈련용으로는 충분합니다. 결국 C를 더 알아갈수록 Go가 좋아지는 이유도 자연스럽게 이해하게 됩니다. 디버거에 한 줄씩 넣고 결과를 확인하는 작은 실험이 가장 빠른 학습 경로입니다. 그래서 우리도 따라 해볼 만합니다.
'AI 뉴스' 카테고리의 다른 글
| DeepSeek V4 Pro, 정밀도에서 GPT-5.5 Pro를 앞서다 (0) | 2026.06.09 |
|---|---|
| Tokenomics: 에이전트형 소프트웨어 엔지니어링에서 토큰이 어디로 새는지 정량화 (0) | 2026.06.09 |
| Shortcat - 마우스없이 키보드로 맥 전체 제어하기 완벽 가이드 (0) | 2026.06.09 |
| Claude Desktop의 공식 Linux 빌드 요청 — 개발자가 알아야 할 핵심 정리 (0) | 2026.06.09 |
| Claude Code 답변 완료 오버레이 플러그인 — 기다림 끝, 알림 한 번에 (0) | 2026.06.09 |