C言語を志す人ならば、おそらく、
K&Rという書籍の名前を聞いたことがあるでしょう。
K&Rとは、世界初のまともなC言語の解説書です。
この本は、C言語の開発者自身が執筆していたこともあり、業界では大ヒットとなります。
K&Rは、
コンピュータ業界最大のベストセラーとも言われます。
この本は、C言語のとても細かい部分まで踏み込んで説明してあり、
当時は、C言語のマトモな規格なんてものはなかったので、
このK&Rを元にしてC言語のコンパイラが作られていたほどです。
しかし、筆者は、皆さんがK&Rを読むことはオススメしません。
というか、むしろ、
読んではいけません。
1つ目の理由は、説明がわかりにくすぎることです。
この本を読むには、C言語にかなり精通していないと読めないと思います。
そもそも、書籍自体、初心者が読むことは考えられていないようです。
2つ目の理由は、サンプルプログラムの中で、ポインタを乱用していることです。
たとえば、strcpy(文字列コピー)の実装例として、
/* 配列版 */
void strcpy(char* s, char* t)
{
int i;
i = 0;
while ((s[i] = t[i]) != '\0') i++;
}
という、(次に示すサンプルよりは)わかりやすい例が紹介されているのにもかかわらず、
/* ポインタ版 */
void strcpy(char* s, char* t)
{
while (*s++ = *t++);
}
という、とてもわかりにくい例が紹介されており、しかも、
これは一見してわかりにくいように見えるが、この記法はかなり便利なものであり、
Cプログラムでよく見かけるという理由から、こうした慣用法はマスターすべきである。
などと、わざわざわかりにくい書き方をすることを奨励している場面が目につきます。
3つ目の理由は、上のようなプログラムは、便利で高速なので是非覚えましょうなどと、
あまりにも
時代遅れすぎる説明がなされていることです。
こういうプログラムが高速だったのは、はるか昔の話です。
現在は、コンパイラの最適化によって、この程度のループプログラムなど、
よほど変則的な書き方をしないかぎり速度差はほとんどありません。
この記事をはじめて書いたときは、ポインタ版と配列版で速度差がないかどうか、
独自にベンチマークプログラムを実装して測定して確認しました。
しかし、アセンブラレベルで同等なのか、最新のVC(VC2005)で試したところ、
ポインタ版はコード量が約半分で、ジャンプ命令も1つだけに抑えられており、
配列版よりもコンパクトなコードになっていることが判明しました。
つまり、現在でも後者の書き方で高速化できる余地はあるようです。
しかし、特別高速化したい部分以外は配列で問題ないと思います。
現代のCPUは、命令を変換し、並び替え、先読みするなど複雑な動作をしており、
アセンブラレベルでのカスタマイズが速度差として現れにくくなっています。
K&Rは、他にC言語の解説書がなかった時代には、たしかに優秀な解説書でしたが、
K&Rを読むと、その内容に毒されて、トリッキーなプログラムを作りがちです。
しかも、変に細かいところまで説明してあるので、余計な誤解を生みやすいのです。
筆者は、K&Rを解説書として読むより、簡易リファレンスとして読むと良いと思います。
K&Rは、薄い書籍ですが、それでもC言語の全機能が説明されているので、
携帯リファレンスとして持ち歩くなら悪くありません。
また、K&Rのわかりにくい解説を逆手に取れば、自らの実力チェックにも使用できます。
K&Rを理解出来れば、C言語の実力がある程度あると言っても良いでしょう。