MMGamesロゴ  MMGames
Twitterシェアボタン  Facebookシェアボタン   
 English 

しんで覚えるC言語
しんで覚えるC言語

K&R

C言語の聖書?
C言語を志す人ならば、おそらく、K&Rという書籍の名前を聞いたことがあるでしょう。
K&Rとは、世界初のまともなC言語の解説書です。
この本は、C言語の開発者自身が執筆していたこともあり、業界では大ヒットとなります。
K&Rは、コンピュータ業界最大のベストセラーとも言われます。

この本は、C言語のとても細かい部分まで踏み込んで説明してあり、
当時は、C言語のマトモな規格なんてものはなかったので、
このK&Rを元にしてC言語のコンパイラが作られていたほどです。

しかし、筆者は、皆さんがK&Rを読むことはオススメしません。
というか、むしろ、読んではいけません

1つ目の理由は、説明がわかりにくすぎることです。
この本を読むには、C言語にかなり精通していないと読めないと思います。
そもそも、書籍自体、初心者が読むことは考えられていないようです。

2つ目の理由は、サンプルプログラムの中で、ポインタを乱用していることです。
たとえば、strcpy(文字列コピー)の実装例として、

sum.c
/* 配列版 */
void strcpy(char* s, char* t)
{
    int i;

    i = 0;
    while ((s[i] = t[i]) != '\0') i++;
}

という、(次に示すサンプルよりは)わかりやすい例が紹介されているのにもかかわらず、

sum.c
/* ポインタ版 */
void strcpy(char* s, char* t)
{
    while (*s++ = *t++);
}

という、とてもわかりにくい例が紹介されており、しかも、

プログラミング言語C 第2版 より引用
これは一見してわかりにくいように見えるが、この記法はかなり便利なものであり、
Cプログラムでよく見かけるという理由から、こうした慣用法はマスターすべきである。

などと、わざわざわかりにくい書き方をすることを奨励している場面が目につきます。

3つ目の理由は、上のようなプログラムは、便利で高速なので是非覚えましょうなどと、
あまりにも時代遅れすぎる説明がなされていることです。

こういうプログラムが高速だったのは、はるか昔の話です。
現在は、コンパイラの最適化によって、この程度のループプログラムなど、
よほど変則的な書き方をしないかぎり速度差はほとんどありません。


アセンブラで検証した結果
この記事をはじめて書いたときは、ポインタ版と配列版で速度差がないかどうか、
独自にベンチマークプログラムを実装して測定して確認しました。

しかし、アセンブラレベルで同等なのか、最新のVC(VC2005)で試したところ、
ポインタ版はコード量が約半分で、ジャンプ命令も1つだけに抑えられており、
配列版よりもコンパクトなコードになっていることが判明しました。

つまり、現在でも後者の書き方で高速化できる余地はあるようです。
しかし、特別高速化したい部分以外は配列で問題ないと思います。
現代のCPUは、命令を変換し、並び替え、先読みするなど複雑な動作をしており、
アセンブラレベルでのカスタマイズが速度差として現れにくくなっています。


K&Rは、他にC言語の解説書がなかった時代には、たしかに優秀な解説書でしたが、
K&Rを読むと、その内容に毒されて、トリッキーなプログラムを作りがちです。
しかも、変に細かいところまで説明してあるので、余計な誤解を生みやすいのです。

筆者は、K&Rを解説書として読むより、簡易リファレンスとして読むと良いと思います。
K&Rは、薄い書籍ですが、それでもC言語の全機能が説明されているので、
携帯リファレンスとして持ち歩くなら悪くありません。

また、K&Rのわかりにくい解説を逆手に取れば、自らの実力チェックにも使用できます。
K&Rを理解出来れば、C言語の実力がある程度あると言っても良いでしょう。


本サイトについて

苦しんで覚えるC言語(苦C)は
C言語入門サイトの決定版です。
C言語の基本機能を体系立てて解説しており、
市販書籍と同等以上の完成度です。

第0部:プログラム概要編
  1. プログラムとは何か?
2章:プログラムの書き方
  1. 書き方のルール
  2. 書き方の慣習
  3. 練習問題2
3章:画面への表示
  1. 文字列の表示
  2. 改行文字
  3. 練習問題3
6章:キーボードからの入力
  1. 入力用の関数
  2. 入力の恐怖
  3. 練習問題6
9章:回数が決まっている繰り返し
  1. 繰り返しを行う文
  2. ループ動作の仕組み
  3. 練習問題9
10章:回数がわからない繰り返し
  1. 回数不明ループ
  2. 入力チェック
  3. 練習問題10
13章:複数の変数を一括して扱う
  1. 複数の変数をまとめて扱う
  2. 配列の使い方
  3. 練習問題13
20章:複数のソースファイル
  1. 最小限の分割
  2. 分割の定石
  3. 練習問題20

コメント
COMMENT

💬 コメント投稿欄を開く