Proven C Book
프로븐 C 라이브러리와 함께하는 현대적 C 입문
초안(draft)
rubidus@gmail.comgithub.com/rubidus-api/proven_c_book
이 책은 C 언어 입문서와 proven C 라이브러리 소개를 겸하고 있습니다.
대상 독자는 C 언어에 막 입문하려는 초보자부터,
입문서를 막 뗀 중급자까지입니다.
이 판은 초안(draft)이다. 쪽 번호가 붙은 찾아보기와 정확한 조판은 PDF를 보라.
책 내용에 궁금한 것이 있으면 질문 게시판에 남겨 주세요. 시간이 되는 대로 아는 범위 안에서 답하겠습니다. 한국어와 영어 어느 쪽이든 괜찮습니다. 오탈자나 틀린 내용은 이슈 쪽이 낫습니다.
목차
제1부 — 바탕: 기계와 기억
제2부 — 기계의 진짜 모습: 표현과 실행
6 정수의 표현 — 부호, 오버플로, 시프트7 수의 표현 — IEEE 754라는 계약8 문자와 텍스트 — 표준 속의 흉터9 스트림의 기원 — 펀치카드, 라인프린터, 프린터 터미널10 프로그램과 프로세스 — 실행된다는 것11 멀티태스킹과 인터럽트 — 번갈아 도는 기계12 기억의 분화 — 레지스터, 캐시, 다층의 사다리13 속도의 기계장치 — 표준의 탄생14 컴파일러 최적화 — 추상 기계15 그래서 C는 추상적인 언어다
제3부 — 첫 프로그램
제4부 — 최소한의 도구 상자
제5부 — 선언: 이름을 만드는 법
제6부 — 값과 흐름
27 타입의 갈래 — 표준이 가른 것들28 정수 — 유한한 수의 세계29 정수의 연산 — 나눗셈, 비트30 암묵적 변환(implicit conversion) — 승격과 통상 산술 변환31 불리언과 비교32 결정 — if와 switch33 반복 — 루프와 불변식34 함수의 의미 — 값 복사와 부수효과35 대입과 부수효과
제7부 — 기억
36 객체, 주소, 포인터37 널 — 삼형제의 정식 취급38 포인터의 규칙 — 정렬과 프로버넌스39 배열40 다차원 배열41 배열과 포인터 — 언제 같고 언제 다른가42 반복의 기법 — 중첩, 탈출, 그리고 블록 만들기43 문자열44 안전한 입력 — 넘침을 막고, 실패를 다루기45 수명과 저장 기간46 동적 메모리
제8부 — 자료의 모양
제9부 — 깊은 구석들
제10부 — 구성
55 main의 세 얼굴 — 진입점과 종료 상태56 여러 파일로 나누어 짓기 — 번역 단위와 연결57 링크와 ABI — 이진 수준의 약속58 이름이 쓰일 수 있는 범위 — 스코프59 이름의 세계 — 네 이름 공간과 세 축60 이름 충돌을 다루는 법 — 접두어에서 namespace까지61 전처리기와 번역 단계62 함수 선언과 호출식 — 부르는 일의 안쪽63 가변 인자 함수64 함수를 값으로 — 함수 포인터65 선언을 읽는 법 — 두 가지 독법과 typedef66 표준 라이브러리의 지형
제11부 — 표준 라이브러리 정독
67 표준 라이브러리 한눈에 보기68 스트림의 실제 — <stdio.h> ①69 읽고 쓰기의 함정 — <stdio.h> ②70 문자열과 기억 — <string.h>71 잡동사니 서랍 — <stdlib.h>72 문자 분류 — <ctype.h>73 로케일 ① — 프로그램의 지역 설정74 로케일 ② — 숫자·통화·시간·정렬75 와이드 문자 ① — wchar_t와 멀티바이트 변환76 와이드 문자 ② — 플랫폼의 현실과 와이드 입출력77 실무 — 유니코드와 멀티바이트를 다루는 법78 수 — <math.h>·<fenv.h>·<tgmath.h>79 시간 — <time.h>80 진단과 제어 — <errno.h>·<assert.h>·<signal.h>·<setjmp.h>81 신호 — <signal.h>82 비지역 점프 — <setjmp.h>83 새 표준이 보탠 것과 *_s 논쟁84 갈래를 나누어 돌리기 — <threads.h>85 쪼개지지 않는 연산 — <stdatomic.h>86 넘침을 묻는 법 — <stdckdint.h>87 매크로에서 키워드로 — bool·nullptr과 그 동료들88 프로그램의 기억 배치 — 운영체제와 임베디드89 할당자의 속 — 힙, 대안 할당자, 대안 표준 라이브러리
제12부 — proven — 새로운 안정적인 기반
90 50년째 출하되는 다섯 가지 버그91 proven이란 무엇인가 — 그리고 시작하기92 에러는 값이다93 기반 — 바이트, 뷰, 그리고 넘치지 않는 산술94 할당은 매개변수다95 문자열과 텍스트96 형식화와 파싱 — 타입을 두 번 적지 않기97 컨테이너와 알고리즘98 바깥 세계 — 파일, 스트림, 시간, 난수99 경계 — 겹쳐 돌리기, 그리고 OS가 없을 때100 세 판으로 짜 보기 — 간이 JSON
제13부 — 닫으며
101 실전의 C — 도구, 프로젝트, 그리고 영역102 빌드와 시험 — 여럿이 짓는 프로젝트의 구조103 일이 굴러가는 방식 — 어휘와 절차104 임베디드의 도구 상자 — 컴파일러와 그 곁의 연장들105 모던 C 총정리
부록과 찾아보기
부록 A — 연산자 조회표부록 B — printf·scanf 서식 완전 정리부록 C — 암묵 변환 요약부록 D — 더 읽을거리와 도구, 그리고 표준 문서부록 E — 문법을 적는 법(EBNF)과 C 문법 전문부록 F — 표준 라이브러리 요람부록 G — C23이 보탠 것과 이 책에서의 자리부록 H — 다 배웠는데 못 만들겠다면부록 I — 프로그램이 죽은 뒤에: 덤프를 읽는 법부록 J — 실행 파일의 형식들부록 K — OS 없이 도는 C: 인터럽트와 그 기계부록 L — 기계가 깨어나는 순서: 부팅과 부트로더부록 M — 기계는 어떻게 이야기하는가: 선, 버스, 그리고 끼어들기부록 N — 디스크는 어떻게 나뉘어 있는가부록 O — 재어 보는 기계: 수로 만나는 캐시, 분기, 코어부록 P — 기억을 다스리는 장치들부록 Q — 표와 그림 목록참고 문헌과 출처찾아보기
저작권과 연락처
본문 — 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스(CC BY-NC-SA 4.0). 출처를 밝히면 자유롭게 공유하고 고칠 수 있으나, 영리 목적 이용은 허용되지 않으며, 고친 결과물에는 같은 라이선스를 적용해야 합니다.
creativecommons.org/licenses/by-nc-sa/4.0/
예제 코드 — MIT 라이선스. 자유롭게 가져다 쓰실 수 있습니다. 예제에서 사용한 proven 라이브러리는 그 자체의 라이선스(현재는 MIT 라이선스)를 따릅니다.
이 책의 모든 코드 시연은 실제로 컴파일·실행해 얻은 출력을 그대로 인쇄한 것입니다. 조판은 Typst로 했습니다.
이 책은 계속 고쳐집니다. 지금 읽고 계신 것은 위 번호의 판이고, 그 뒤로도 오류 수정과 내용 보강이 이어집니다. 오류 신고와 수정 제안은 저장소에서 받습니다.