DangerC  /** 
*「本当は怖いC言語」サポートページ
*/ 

本当は怖いC言語
「C言語?やさしくないし...それどころかちょっと『怖い』です!」
C言語を知り尽くした著者がソフトな語り口でやさしく解説した、C言語を本当に理解できる入門書です。
C言語はシンプルな言語のため、言語以外にもコンピュータやOSの仕組みを理解する必要があります。
そこで本書では、C言語プログラムのみならず、その背景となるコンピュータの仕組みについても詳しく解説。
あなたが知らないC言語の真の姿がわかります!

Menu

本の目次

Part 1 心と体の準備をしよう

Chapter 1 C言語の誕生[C言語はなぜ生まれ出でたか]

1.1 UNIXのために生まれたC言語

1.2 システム記述言語としてのC言語

1.3 高級アセンブラとしてのC言語

1.4 まとめ

Part 1 心と体の準備をしよう

Chapter 2 C言語の成長[C言語はどのように発展し使われているか]

21 C言語はどのように変わってきたか

2.2 C言語が使われ続けるわけ

2.3 まとめ

Part 1 心と体の準備をしよう

Chapter 3 C言語の性格[はたしてC言語は気難しいのか]

3.1 なぜC言語でつまずく人が多い?

3.2 C言語をマスターするのに必要なこと

3.3 まとめ

Part 1 心と体の準備をしよう

Chapter 4 学習環境の構築[学習に必要なアプリケーションを準備する]

4.1 Windowsで環境を作る(MinGW)

4.2 Mac OS Xで環境を作る(gcc)

4.3 Linuxで環境を作る(gcc)

4.4 番外編(LSI C-86)

4.5 エディタを準備する

4.6 まとめ

Part 2 C言語の世界を俯瞰しよう

Chapter 5 最初は空のプログラム[何もしないプログラムで流れを掴む]

5.1 コンパイルはコンパイルをするだけ

5.2 プリプロセッサはコンパイルの前に処理をする

5.3 リンカはコンパイル後に処理をする

5.4 .プログラムが実行されるとはどういうこと?

5.5 まとめ

Part 2 C言語の世界を俯瞰しよう

Chapter 6 C言語の全体像[とにかく全部眺めてみる]

6.1 C言語の基本の基本を押さえる

6.2 C言語マップ

Part 3 基本としてのC言語を学ぼう

Chapter 7 データ型と変数[データを識別して保持する]

7.1 データ型

7.2 変数

7.3 文字と文字列

7.4 記憶クラス

7.5 まとめ

Part 3 基本としてのC言語を学ぼう

Chapter 8 式と演算子[データを加工して評価する]

8.1 式と演算子は結果を求める

8.2 条件式は判定する

8.3 単項演算子と三項演算子

8.4 少し変わった演算子

8.5 ビット演算子

8.6 優先順位表

8.7 まとめ

Part 3 基本としてのC言語を学ぼう

Chapter 9 制御構造[プログラムの流れを記述する]

9.1 プログラムの動きは3つの構造が決める

9.2 真っ直ぐ進む逐次実行

9.3 条件で分ける分岐(if, else)

9.4 基本の繰り返し(while)

9.5 もうひとつの繰り返し(for, do~while)

9.6 複数の条件で振り分ける(switch)

9.7 どこへでもジャンプする(goto)

9.8 まとめ

Part 3 基本としてのC言語を学ぼう

Chapter 10 関数[プログラムを機能でまとめる]

10.1 関数の基本

10.2 標準関数になじむ

10.3 まとめ

Part 4 C言語ならではの仕様を学ぼう

Chapter 11 プリプロセッサ[さまざまな前処理を行う]

11.1 ファイルの内容で置き換える(include)

11.2 1対1で置き換える(define)

11.3 defineしたものを無効にする(undef)

11.4 条件でコンパイルする(if)

11.5 関数のようなマクロ関数

11.6 まとめ

Part 4 C言語ならではの仕様を学ぼう

Chapter 12 ポインタと配列[データをまとめて場所を指し示す]

12.1 配列とは

12.2 ポインタとは

12.3 ポインタと関数

12.4 ポインタとキャスト

12.5 明示的な型変換

12.6 ダブルポインタ、トリプルポインタ

12.7 多次元配列

12.8 関数を指すポインタ

12.9 voidポインタ

12.10 まとめ

Part 4 C言語ならではの仕様を学ぼう

Chapter 13 構造体と共用体[異なるデータ型をまとめてしまう]

13.1 変数をまとめた構造体

13.2 記憶イメージがわからないと使えない共用体

13.3 ビット単位の変数が扱えるビットフィールド

13.4 値に名前を付けられる列挙型

13.5 .データ型に別名を付ける(typedef)

13.6 まとめ

Part 5 C言語の定番コーディングを学ぼう

Chapter 14 文字列操作[文字列を操作し使いこなす]

14.1 文字列についておさらい

14.2 文字列をコピーする

14.3 文字列の長さを求める

14.4 文字列を連結する

14.5 文字列を比較する

14.6 文字列を検索する

14.7 文字列を切り出す

14.8 文字関数

14.9 複雑な文字列操作を簡単に

14.10 まとめ

Part 5 C言語の定番コーディングを学ぼう

Chapter 15 動的メモリ[データの置き場所を自ら作る]

15.1 メモリはヒープからもらって必ず返す

15.2 メモリを確保する(malloc)

15.3 メモリを解放する(free)

15.4 メモリ確保のもうひとつの方法(calloc)

15.5 メモリの拡張と縮小

15.6 コピーオンライトとは

15.7 確保したメモリの使い方

15.8 メモリ領域を操作する標準関数

15.9 動的メモリの応用例:リスト構造

15.10 まとめ

Part 5 C言語の定番コーディングを学ぼう

Chapter 16 ファイル入出力[データを保存し読み出す]

16.1 ファイル入出力の基本

16.2 標準ファイル関数(f*系)

16.3 ファイルの読み書きを実験する

16.4 その他の標準ファイル関数

16.5 低水準入出力関数

16.6 まとめ

▲上に戻る

正誤表

出版後に気がついたり、読者の方からメールでご指摘いただいた点を掲載しております。 ミスが多くて大変申し訳ありません。

P.74の「浮動小数点を表示する場合」の部分でタイトルの「浮動小数点を」は「浮動小数点数」の方が正しいと思われます。また、下のprintf()のカッコ内の「整数が格納された変数」は、「浮動小数点数が格納された変数」が正しいと思われます。

わかりやすい表現にしようと思い、「浮動小数点」と記してしますが、これでは「点そのもの」を指してしまうので、「浮動小数点数」が正しいです。

P.75 プログラムリストreturn(price * tax)→return(price + price * tax)

P.93の4行目の「浮動小数点ならfloat(floating...)」の部分の「浮動小数点」は「浮動小数点数」の方が正しいと思われます。

「浮動小数点数」が正しいです。

P.96 Makefile.variable→Makefile.limits

P.96の実行例の「long_min = 0, long_max = 4294967295」となっていますが、このように出力するのであれば、long_minとlong_maxをunsigned longで宣言し、printfで「%lu」で指定しないと実行例のようにはならないように思われます。

%luで指定が正しいです。

P.171のリストのprintfの%zuがエラーになり、%uでエラーがなくなりました。

MinGWは、LIBCの機能の一部を、マイクロソフトのランタイムを使って実装しているため、完全にC99に対応できておらず、エラーとなってしまう場合があります。

P.238のリストの下から6行目のprintfのコメント文の「関数実行前」は「関数実行後」の誤りだと思われます。

関数実行後が正しいです。

P.245の表の「表示」列の2行目は「 10 」となっていますが、実際にprintfで確かめてみると「 10」と表示されます。プリントミスのように思われます。

前に2つあるはずの空白が見た目に詰まってしまっています。本来は「 10」が正しいです。

P.224 プログラムリストunknwon→unknown

P.248のリストのビルドではprintfの%hhuで警告メッセージが出て「255」以外は実行例のようになりません。実行例のように表示するためには長さ修飾子をどのように変えればいいのですか。

MinGWで本書と同様の表示にするためには、printf("%u\n",(char)257);とする必要があります。

P.257の6行目で「つまり、このサンプルプログラムは実質14文字まで...」と書かれていますが、実行例を見ますと「this is very lo」と15文字が表示されていますし、実際そうなります。これは、どういう理由なのでしょうか。

実質14文字についてですが、バッファサイズが16で、入力の最後を[Enter]=\nで確定するため、16 - 1 - 1で、正規の方法では14文字が限度ということです。しかし、今回はオーバーフローしているので、そもそも\nが入っていないので、15文字表示されています。

P.258の実行例の後の5行目で「63文字も入力したため、...」と書かれていますが、「this is extremely very very long long string !!!」だと48文字だと思われます。

48文字が正しいです。

P.272 Makefile.pi→Makefile.pi_2

P.281のリストのwhile文の最後に「;」がありますが、これは必要ないと思われます。

必要ありません。

P.298 #define TEST と #define TEST 1 は同じ意味ではないのでしょうか。

著者の勘違いでした。#define TESTの場合、#ifdef TESTにて真となりますが、値はNULL Stringで、1という値にはなりません。

P.324のリストの最後のprintf文に使っているone_string[14]は配列の要素数が14なのに15番目であってエラーになるはずなのにエラーにならないのはなぜですか。

one_string[14]の、15番目の要素に間接参照でアクセスした場合は、エラーとなる場合もありますが、本サンプルはそのアドレスを表示しているだけなのでエラーとはならないのです。

P.335 7行目の*pnumber_2 + 1→*pnumber_2

P.342のリストstring_cpy.cのstring_2[i] = string_1[i]の前に-------------- と長い--が記されていますが、これは何か意味があるのでしょうか。

ミスプリントです。

P.351の実行例の[Enter]の後の4行はarray_addr_3の実行例で不要だと思われます。

不要です。

P.357の最後の行とP.358の1行目は、順番が逆のように思えます。

順番が逆なのではなく、P.357の最後の行が不要です。

P.361のプログラムについて

if (sum(&num_1, &num_2, &ans) は if (sum(&num_1, &num_2, &answer) です

P.385の2次元配列の図は、文中中ほどの「int tuple[4][5]」だとすると4番目の列が足りないようです。

          0  1  2  3  4 
        +--+--+--+--+--+
      0 |  |  |  |  |  |
        +--+--+--+--+--+
      1 |  |  |  |  |  |
        +--+--+--+--+--+
      2 |  |  |  |★|  |
        +--+--+--+--+--+
      3 |  |  |  |  |  |
        +--+--+--+--+--+
	

P.392「くれくらいまでなら、」→「これくらいまでなら、」

P.366の「(1)代入元 ≦ 代入元」→「(1)代入元 ≦ 代入先」

P.496のリストで「%hhu」が警告となります。

MinGW は、 C99 への対応が出来ていない部分があるため、このような現象が起きています。

P.458 プログラムリストchar string_2[16];→char string_2[16]="";

P.465 プログラムリストfilename[sizeof(filename)] = '\0';→filename[sizeof(filename) - 1] = '\0';

P.466 説明文char filename[256]="";→char filename[256]="strcat_test";

P.534のリストに「#define MAX_CHARACTER (256)」とありますが、この(256)の括弧は必要ですか。

defineは文字列置換なので、計算式を書いている場合など、思わぬ結果となることがあるため、書いています。必須ではありません。

P.540 プログラムリスト""ptr_now->no,→ptr_now->no,

P.548 ファイルバス→ファイルパスには

P.551 size_t fread(...→size_t fwrite(...

P.559 ファイル名 souce→source

▲上に戻る

mailto: mail

Copyright © 2012-2015 Motoki Taneda. All rights reserved.