[C Language] C 언어 퀴즈

문연수·2021년 8월 17일
6

C

목록 보기
1/2
post-thumbnail

C 에 대한 독자들의 환상을 완전히 깨버릴 퀴즈를 준비해보았다. 개인적으로 이번 퀴즈는 C 를 잘 모르는 독자 뿐 아니라, C 에 대한 자부심을 가지고 있는 독자 역시 읽어 보았으면 좋겠다.


1. C 언어란 무엇인가?

C 란 무엇인지 육하원칙으로 설명하라. 이 질문이 시사하는 바가 정말 크다. C 의 역사를 모르는 개발자는 절대 C 를 잘 할 수 없다. 왜냐하면 역사를 모른다는 것은 => C 표준안에 대한 이해가 부족함을 의미하기 때문이다.

특히 개발자 이름 (누가), 년도 (언제), 그리고 장소 (어디서), 개발 목적 (왜) 이 네 가지 항목은 설명할 수 있어야 한다!

2. ISO/IEC 9899 란 무엇인가?

ISO/IEC 9899 가 무엇인지 알고 있는가? 1 번 문제의 연장선이다. 만일 1 번 정답을 맞췄다면 2 번은 따라 들어온다.

여기에 더해, C89C99 사이의 큰 변곡에 대해서는 반드시 설명할 수 있어야 한다.

3. int 의 크기는?

쉬운 문제라고 생각할 수 있겠지만, 의외로 많이 틀리는 문제이다.

한가지 힌트를 주자면 int 의 크기를 설명하기 위해 byte라는 개념을 도입해야 한다면 그건 잘못된 설명이다. TCPL 에선 심지어 int 의 크기를 설명하기 위해 수(數)조차 얘기치 않는다. (바로 다음에 다시 나오긴 하지만)

절대 바이트라는 용어를 사용해선 안된다. 그것은 100% 잘못된 설명이다. 필자가 보증하겠다.

4. Sequence PointSide Effect 는 무엇인가?

시퀀스 포인트(Side Effect)와 사이드 이펙트(Side Effect) 란 무엇인가? 처음 듣는 용어인가? 여기서부터 무너지면 그 다음부턴 쉽지 않을 것이다 ㅎㅎ

5. C 에는 Call-by-reference 가 있는가?

정답부터 말하면 없다. 생각보다 많은 사람들이 CCall-by-reference 가 존재한다고 생각한다. 책 이름까진 말하지 않겠지만, 요즈음 초심자들 사이에서 유행하는 책에서 설명한 오개념 때문이다.

그렇다면, 왜 C 에는 Call-by-value 만 존재하는지, 그 출처를 들어 설명할 수 있어야 할 것이다. 그 누구도 반박할 수 없는 명증적 증거를 가져와야 한다.

6. C 의 키워드

volatile, extern, static, auto, restrict, signed, register 키워드가 무엇인지 그리고 왜 필요한지 설명할 수 있어야 한다.

+ 특히 signed 키워드가 왜 필요한지 설명할 수 있어야 한다: 이 질문이 관통하는 하나의 이유가 나와야 한다.

7. C 의 세 가지 승격

C 의 세 가지 승격(Promotion)

  • integral promotion,
  • integer promotion,
  • default argument promotion

에 대해 서술하라.

8. Undefined Behavior 란?

Undefined Behavior, Implementation-defined behavior, Unspecific behavior 다음의 세 가지 개념에 대해, 그리고 각각에 해당하는 경우를 하나 이상 설명할 수 있어야 한다.

9. 포인터(Pointer)는 언제나 주소(Address)와 같은가?

Generic Pointerchar * 의 차이를 묻는 것이다. 이를 통해 char * 를 다른 포인터 변수에 대입하거나, 반대로 대입해선 안되는 이유를 설명할 수 있어야 한다. 그렇지만 char * to void * 그리고 vice versa 는 당연히 가능하다.

10. expressionstatement 란?

C 언어의 꽃은 Function (함수) 혹은 Pointer (포인터) 다. 라고 얘기를 하는데 필자는 절대 그렇게 생각하지 않는다.
C 에서 고수와 하수를 나누는 기준은 expression 을 얼마나 아름답게 잘 다루느냐에 달려있다고 생각한다.

따라서 표현식(expression) 과 구문(statement) 에 대해서는 당연히 설명할 수 있어야 하며, 하위 표현식의 평가 순서 (ordering of subexpression) 에 대해서도 알고 있어야 한다.

11. C 가 지원하는 문자 형식은?

단일 바이트 문자 (Singlebyte character), 멀티 바이트(Multibyte character) 문자, 와이드 문자 (Wide character) 가 무엇인지 설명할 수 있어야 한다. 이 역시 C 의 한 부분이다. 관련된 헤더 역시 존재한다.

12. 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 순서로 읽는 것을 추천한다.

profile
2000.11.30

13개의 댓글

comment-user-thumbnail
2021년 8월 20일

선생님 문제가 너무 어려워요

2개의 답글
comment-user-thumbnail
2021년 10월 19일

잘 봤습니다! 근데,
ordering of subexpression 은 undefined 아닌가요
혹시 이런댓글 달면 안되면 지울깨요

1개의 답글
comment-user-thumbnail
2021년 11월 10일

근데 그 답 공개할 계획은 없으신가영 크흠

1개의 답글
comment-user-thumbnail
2021년 11월 29일

굉장히 좋은 선배님을 좋은 타이밍에 만나셨네요!

답글 달기
comment-user-thumbnail
2023년 11월 20일

완벽하게 맞출 때까지 댓글 계속 수정해봐도 될까요?

2개의 답글