C
에 대한 독자들의 환상을 완전히 깨버릴 퀴즈를 준비해보았다. 개인적으로 이번 퀴즈는 C
를 잘 모르는 독자 뿐 아니라, C
에 대한 자부심을 가지고 있는 독자 역시 꼭 읽어 보았으면 좋겠다.
C 란 무엇인지 육하원칙
으로 설명하라. 이 질문이 시사하는 바가 정말 크다. C 의 역사를 모르는 개발자는 절대 C 를 잘 할 수 없다. 왜냐하면 역사를 모른다는 것은 => C 표준안에 대한 이해가 부족함을 의미하기 때문이다.
특히 개발자 이름 (누가), 년도 (언제), 그리고 장소 (어디서), 개발 목적 (왜) 이 네 가지 항목은 설명할 수 있어야 한다!
ISO/IEC 9899
란 무엇인가? ISO/IEC 9899
가 무엇인지 알고 있는가? 1 번 문제의 연장선이다. 만일 1 번 정답을 맞췄다면 2 번은 따라 들어온다.
여기에 더해, C89
와 C99
사이의 큰 변곡에 대해서는 반드시 설명할 수 있어야 한다.
int
의 크기는?쉬운 문제라고 생각할 수 있겠지만, 의외로 많이 틀리는 문제이다.
한가지 힌트를 주자면 int
의 크기를 설명하기 위해 byte
라는 개념을 도입해야 한다면 그건 잘못된 설명이다. TCPL
에선 심지어 int
의 크기를 설명하기 위해 수(數)조차 얘기치 않는다. (바로 다음에 다시 나오긴 하지만)
절대 바이트
라는 용어를 사용해선 안된다. 그것은 100% 잘못된 설명
이다. 필자가 보증하겠다.
Sequence Point
와 Side Effect
는 무엇인가? 시퀀스 포인트(Side Effect
)와 사이드 이펙트(Side Effect
) 란 무엇인가? 처음 듣는 용어인가? 여기서부터 무너지면 그 다음부턴 쉽지 않을 것이다 ㅎㅎ
C
에는 Call-by-reference
가 있는가? 정답부터 말하면 없다. 생각보다 많은 사람들이 C
에 Call-by-reference
가 존재한다고 생각한다. 책 이름까진 말하지 않겠지만, 요즈음 초심자들 사이에서 유행하는 책에서 설명한 오개념 때문이다.
그렇다면, 왜 C
에는 Call-by-value
만 존재하는지, 그 출처를 들어 설명할 수 있어야 할 것이다. 그 누구도 반박할 수 없는 명증적 증거
를 가져와야 한다.
volatile
, extern
, static
, auto
, restrict
, signed
, register
키워드가 무엇인지 그리고 왜 필요한지 설명할 수 있어야 한다.
+ 특히 signed
키워드가 왜 필요한지 설명할 수 있어야 한다: 이 질문이 관통하는 하나의 이유가 나와야 한다.
C 의 세 가지 승격(Promotion
)
integral promotion
,integer promotion
,default argument promotion
에 대해 서술하라.
Undefined Behavior
란? Undefined Behavior
, Implementation-defined behavior
, Unspecific behavior
다음의 세 가지 개념에 대해, 그리고 각각에 해당하는 경우를 하나 이상 설명할 수 있어야 한다.
Pointer
)는 언제나 주소(Address
)와 같은가? Generic Pointer
와 char *
의 차이를 묻는 것이다. 이를 통해 char *
를 다른 포인터 변수에 대입하거나, 반대로 대입해선 안되는 이유를 설명할 수 있어야 한다. 그렇지만 char *
to void *
그리고 vice versa 는 당연히 가능하다.
expression
과 statement
란? C
언어의 꽃은 Function
(함수) 혹은 Pointer
(포인터) 다. 라고 얘기를 하는데 필자는 절대 그렇게 생각하지 않는다.
C
에서 고수와 하수를 나누는 기준은 expression
을 얼마나 아름답게 잘 다루느냐에 달려있다고 생각한다.
따라서 표현식(expression
) 과 구문(statement
) 에 대해서는 당연히 설명할 수 있어야 하며, 하위 표현식의 평가 순서 (ordering of subexpression
) 에 대해서도 알고 있어야 한다.
C
가 지원하는 문자 형식은?단일 바이트 문자 (Singlebyte character
), 멀티 바이트(Multibyte character
) 문자, 와이드 문자 (Wide character
) 가 무엇인지 설명할 수 있어야 한다. 이 역시 C
의 한 부분이다. 관련된 헤더 역시 존재한다.
C99
에 추가된 수학적 지원에는 무엇이 있는가?<stdint.h>
, <complex.h>
, <tgmath.h>
, <fenv.h>
위에서 열거한 헤더에는 무엇이 담겨있고, 이들이 어떤 용도로 사용되는지 설명할 수 있다.
2년전(2019), 대학에 막 입학(19 학번)하여 동아리 선배님에게 위 질문을 받았다. (물론 똑같진 않고, 필자가 살짝 리메이크했다) 당시 C
에 대해서는 정말 큰 자부심을 가지고 있었기에, 단 하나도 대답하지 못했다는 사실이 필자에겐 큰 충격이었다.
그 충격을 여러분들에게도 전해주고 싶었다. 누군가는 이 충격으로 무너지고 좌절하겠지만, 일부는 다시 일어나 도전할 것이다. 필자가 그랬던 것처럼.
갈 길을 아는 것과 모르는 것에는 큰 차이가 있다고 생각한다. C
를 공부하여 임베디드 개발자
, 운영체제 개발자
, 서버 개발자
, 시스템 개발자
가 되기를 희망한다면 위 문제와 아래의 책들을 이정표로 삼아 공부하기를 추천한다.
필자는 아래의 책으로 위 문제에 대한 답을 내렸다:
1. The C Programming Language 2/E
2. C Programming: A Modern Approach 2/E
3. C: A Reference Manual 5/E
4. C Traps and Pitfalls
5. The C Puzzle Book
1 ~ 3
까지는 필독서이므로 꼭 읽어보길 바란다.
2 > 1 > 3(4) > 4(3) > 5
순서로 읽는 것을 추천한다.
선생님 문제가 너무 어려워요