Cの本

―カーニハンはえらいひと―


いわゆるK&Rはよい『入門書』だ。(訳本は訳の質がかなりひどいが、原書のできがよい)。「あれを'入門'というのはちと酷、もっと簡単な入門書を読んでからがいいのでは?」などと言う人間はかなりヘボいと言わざるを得ない。

プログラムの書き進め方の基礎がちゃんとできていれば、Cという言語そのものに関してはK&Rの文法説明で充分なリファレンスになるし、実は単なるリファレンス用ではなく、丁寧に書いてある質のよい入門書でもある。K&Rを読んで「よく分からなかった」とか言うひとは、そもそもプログラミングに向かないと断言してもよい。

それでも「それ以外だったら、どの本を読むのがいいでしょうか?」と尋ねる初心者に、「さあ…あまりいいのはないねえ。どれがいいんだろうねえ。」などと答えた人は多いはず。日本で出版されたCの本だけでも600種類以上はあるはずだが、確かに自信を持って薦められるようなものは少ない。

私は以前、そういう人がCの入門書を選ぶときのコツ(というか判別方法)について3つか4つのポイントを学生に教えたことがある。


(1) バックスラッシュが『円記号』に化けている本はダメ

日本語版Windowsなどの一部の特殊な環境でそう見えるからといって、Cという言語でバックスラッシュなわけではない。

printf("hello\n"):

と言うコードの部分について、「helloの後ろの`えんえぬ'は…」などと言っている講師や学生を見かけて呆れたことがある。ホワイトボードにまで円記号で書くことはないだろうに…。しかも音声で「えんえぬ」! いったい何の用語かと数秒間考えてしまった。その手の本の悪影響だろう。

そもそも、本来はバックスラッシュが表示できない環境ではトライグラフを使って表すべきだ。バックスラッシュをトライグラフで「??/」と書きたい思う人はどれだけいるだろうか?

書籍などの場合は、表記などは出版社が「初心者がとまどうかもしれないので」などと 意味不明なことを言って円記号にすることを著者に薦めることがあるらしいが、それをOKしてしまう著者はかなり認識不足だろう。


(2) Cのことを『C言語』などと書いてある本は買わない

まるで『カマンベールチーズ』みたいだ。たしかにカマンベールは村の名前である。だからといってその村の名前をつけたチーズに「〜チーズ」をつけないと区別できないわけではあるまい。ポルシェ博士のつくった車も同様。

そういう人は、 Fortran言語、Basic言語、Pascal言語、C++言語、ratfor言語、PL/I言語、HTML言語、etc.には違和感はないのだろうか? (そもそもPL/IのL、HTMLのLはlanguageの意味だから重複でさえある)

それらに違和感があって、Cにだけ「言語」を付けてしまう人は「1文字などで呼びにくいから」と主張するかもしれない。でもそういう人だって料理に使う「酢」は「す」と1文字だろう。 「酢調味料」とは言わないはず。

では、「文字での表記の場合は紛れるから」だろうか? でも、そう書く人が発音上も「しーげんご」と言っているのはよく目撃する。

書籍の内容でどう表記するかは出版社の意向(売れない本だと出版社も儲からないわけで)も関係する場合もあり、それを言い訳にする人もいる。ましてや書籍のタイトルをどうするかなどは、さらに出版社の仕事である場合が多い。でも、だからといってそれを言い訳にして責任逃れするのは問題だ。『著者の意向』が通らないってことは、出版社側にもその程度にしか思われていない著者が書いた本だってことではないか?


(3) 『ANSI対応』などと謳っている本は避ける

「それはいったいいつのANSI規格のことですか」と尋ねたい。いわゆるC89のことなのか、95年の時点のものか、それともC99のことか。

そもそも、Cという言語の本に関して「ANSI対応」なんて言い方がされていたのは、C89ができた前後の、それまでの規格がなかった時代のいわゆる『Trad.なC』か『ANSI規格化以降のC』なのかを区別する意味で使われた言い方であって、その後の修正や改訂があったことを考えれば、十数年後の現在ではANSIの「どれ」かを抜きに『ANSI対応C』とだけ言うのは、認識が1989年の時点で止まっている人が書いた本か、実際にその時代の古い本かのどちらかだということになる。 仮に後者だったとして、そんな時代に書かれた古くさい本で現在でも通用する入門書がK&R以外で存在するだろうか?


その他

サンプルプログラムがやたらとscanf()を使ったものばかりだったり、1行入力にgets()が使ってあるコードを載せているような入門書も薦める気にはなれない。

同様に、最初のサンプルコードの冒頭が、

void main()
{
    …

であるような書籍も避けたほうが無難だろう。昔のC(C89でも!)では、関数定義のときに型名を書かなければ、暗黙のうちにint型だということになるというルールがあったので、それを積極的に利用して

main()
{
    …

と書いてあるコードは(その是非はともかく)現場でもよく見かけるため、入門書の最初の1つをあえてそう(型指定なしで)書いて「そういうのも見せておく」目的とかならまだ分からないでもないが、なぜmain関数を「void」と宣言したがる人がいるのだろう? そう書く人のうち数人にたずねてみた限りでは「warningがでるので、それを抑制するため」などという本末転倒の答えしかもらったことがないのだが…(だったらreturnを付けるのを教えるほうが筋だろう)。

また、

if ((fp = fopen(file, "r")) == NULL)

という定番のコードを、わざわざ分離して、

fp = fopen(file, "r");
if (fp == NULL)

と2文にして書いてあったり、そうしている理由を「初心者が理解しやすいようにするため」と公言するならましなほうで、ひどいのになると、前者の書き方を「トリッキーで技巧に走ったよくない書き方」だとまで書いている入門書さえ存在する。おそらく、他の言語の出身者で、Cのコンセプトを実感して理解できるほどはなじんでいない人だからそんなことを平気で書けるんだと思うが、そんな人が書いた入門書を薦められるだろうか?


E-Mail
void@merope.pleiades.or.jp

Made with CSS Valid XHTML 1.1! Valid CSS! AHL Very Good! JCehcker OK!

$Id: index.html,v 1.2 2003/10/26 17:46:01 void Exp $