苦しんで覚えるC言語



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言語の実力がある程度あると言っても良いでしょう。

目次に戻る