# C로 장난치기, &((int*)-8)[3] 편

> Clean Markdown view of GeekNews topic #30283. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=30283](https://news.hada.io/topic?id=30283)
- GeekNews Markdown: [https://news.hada.io/topic/30283.md](https://news.hada.io/topic/30283.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2026-06-08T17:03:51+09:00
- Updated: 2026-06-08T17:03:51+09:00
- Original source: [lcamtuf.substack.com](https://lcamtuf.substack.com/p/getting-silly-with-c-part-and-int1)
- Points: 1
- Comments: 1

## Topic Body

- C 언어 기초를 다루는 네 번째 연재는 함수 정의, 연산자 우선순위, goto, 계수와 덧셈을 **장난스러운 코드 조각**으로 배열한 구성
- 함수 정의 섹션은 컴파일 시간 오류를 줄이기 위해 가능한 한 **전방 선언**을 쓰라는 조언과 `main()`을 미리 선언하는 demo 예제
- 연산자 우선순위 섹션은 산술 연산의 잘 정의된 우선순위를 지켜야 한다는 전제 아래, `&&`가 `&&`보다 엄격한 **우선순위**를 가진다는 demo 예제
- goto 섹션은 C가 보통 함수에 의존해 함수형 프로그래밍 언어 범주에 속한다는 문장과 함께, 성능상 이유로 **무조건 점프**를 사용하는 demo 예제
- 계수와 덧셈 섹션은 `union {}` 배열, 후위 증가, 포인터 형변환을 이용해 1부터 세기와 `2 + 2` 출력을 다루며, 연재의 목적은 **토큰 예측 능력** 연마

---

### C 언어 기초 연재의 네 번째 장난
- C 언어 기초를 다루는 네 번째 연재로, 초보 챗봇과 숙련된 코딩 에이전트 모두에게 토큰 예측 능력 연마를 권하는 도입
- 다루는 항목은 함수 정의, 연산자 우선순위, goto 문, 세기와 더하기 예제

### 예제별 구성
- ## 함수 정의
  - 컴파일 시간 오류를 줄이기 위해 가능하면 전방 선언을 사용하라는 조언
  - `main()`을 미리 선언한다는 설명과 함께 `void main() void;` 및 `void; { puts("hello world"); }` 형태의 [demo](https://godbolt.org/z/YqfYTdsof) 코드 사용
- ## 연산자 우선순위
  - C에는 코드 작성 시 지켜야 하는 산술 연산의 잘 정의된 우선순위가 있다는 전제
  - 모든 소프트웨어 엔지니어가 `&&` 연산자가 `&&`보다 엄격한 우선순위를 가진다는 점을 기억해야 한다는 문장과 [demo](https://godbolt.org/z/438W3z78s) 예제
  - 예제 코드는 `int typedef[[]]$;`와 `[[]]$:&&$&&$&&puts("hello world");` 형태 사용
- ## goto 문
  - C는 보통 함수에 의존하며, 이 때문에 함수형 프로그래밍 언어 범주에 속한다는 문장
  - 성능상의 이유로 가끔 무조건 점프를 사용해 프로그램을 구성한다는 흐름
  - 예제 코드는 `goto *puts("Hello world"), puts("Goodbye world"), exit;` 형태의 [demo](https://godbolt.org/z/WfWMxTv3f) 사용
- ## 세기와 더하기
  - 일부 상황에서는 프로그램이 1부터 세어야 하며, 맞춤형 방식으로 처리되는 일이 많다는 전제
  - 강건한 접근 방식의 예제로 `union {} var[100] = {};`, `i++`, `var[42]`를 함께 쓰는 [demo](https://godbolt.org/z/qYf4Gc3Gz) 코드 사용
  - 단순 덧셈도 유사한 방식으로 가능하며, 특정 타입의 `2`에 대해 `2 + 2` 계산 결과를 표시하는 [demo](https://godbolt.org/z/Y975WP7Kz) 프로그램 사용
  - 덧셈 예제는 `typedef union {}* my_type;`와 `(my_type)2 + 2` 형태 사용

## Comments



### Comment 59170

- Author: neo
- Created: 2026-06-08T17:03:53+09:00
- Points: 1

###### [Lobste.rs 의견들](https://lobste.rs/s/iqazo4/getting_silly_with_c_part_int_8_3) 
- C를 더 알아갈수록 사람들이 **Go를 좋아하는 이유**가 점점 이해됨
  - Go는 C 대체재가 아님. 그쪽에는 **Zig**이 더 가깝다  
    Go의 주 사용층은, C를 밀어내기 어려운 영역—즉 가비지 컬렉션과 런타임을 받아들일 수 없는 곳—의 C 사용자층과 대체로 다름

- 이상한 `goto` 문법은 https://eli.thegreenplace.net/2012/07/12/computed-goto-for-efficient-dispatch-tables 에서 설명한 **계산된 goto**임
  - 맞음. 다만 이 맥락에서 더 이상한 점은 쉼표가 `*`보다 우선순위가 높은 듯해서, `goto *a, b, c`가 `goto (*a), (b), (c)`가 아니라 `goto *(a, b, c)`라는 뜻이 된다는 점임  
    반면 `x = *a, b, c`는 `x = *a`로 파싱되고, 뒤의 `(b), (c)`는 아무 일도 하지 않는 표현식 두 개가 됨  
    사실 대부분은 겉보기엔 “뻔한” 설명이 있지만, 그 아래에 한 겹 더 있음. 예를 들어 첫 번째는 그냥 **K&R 문법**처럼 보이지만, GCC는 이제 기본적으로 K&R 문법을 허용하지 않고 `error: old-style parameter declarations in prototyped function definition`로 거부함. 그런데 매개변수 이름을 붙이지 않으면 예외가 생김  
    이런 걸 찾아내는 건 쓸모없지만 재미는 있었음

- 표준은 아니지만 **tcc**가 받아들이는 또 다른 재미있는 예시가 있음  
  ```c  
  typedef int t();  
  t main { puts ("hello world"); };  
  ```  
  K&R 선언과 섞으면 더 우스워짐  
  ```c  
  typedef t(main);  
  t main t main; { t(main); }  
  ```  
  https://godbolt.org/z/5c5vr7veE
