翔泳社の『開発の現場』に連載してた「Cの文法、理解していますか?」が本になりました。『Cの強化書』というタイトルです。駄洒落です。毎度のことながら、私が考えたタイトルではありません。
『開発の現場』誌での連載は、最初は3回で終わりの予定だったのですが、連載終了後に本にすることも考慮して7回連載になりました(3回では本1冊分の分量としては少ない)。そのためもあって連載時とは順番を入れ替えていますが、内容的には連載時とほとんど一緒です。
一番大きな違いは、第7章のタイトル「役に立つ(かもしれない)あれこれ」でしょうか。これ、連載時には「役に立たない(かもしれない)あれこれ」だったのですが、編集部より「『役に立たない』とかいう否定的な文言はダメ」と言われてしまいました。いいと思うんですけどねー、「役に立たない(かもしれない)あれこれ」。「多少笑いがあってもいいだろう、というつもりだったのですが、「この種の本を読む人は真面目な人が多いから……」という理由で却下されてしまいました。
本書の「はじめに」で、私はこんなことを書きました。
変数を、
int *p;のように * を付けて宣言すると p はポインタ型になるのに、式の中で、
n = *p;のように * を付けると *p はポインタで無くなる(ポインタを経由する間接参照になる)のは「変だ」と主張する人が、Cでそれなりにプログラミングしている人の中にもよくいます。
なぜ、こういう解釈になるのかは本を読んでいただくこととして(←宣伝)、その「まえがき」には、こんなことも書きました。
本書は「Cの教科書」ではありません。入門書などでCを学んで、それなりにCでプログラミングができているものの、「○○な場合には、なぜかは知らないけど、◇◇のように書く」でプログラミングしている人も多いのではないでしょうか。「なぜかは知らないけど」からの脱却の糸口になって欲しい、という思いでこの本を書きました。
本では、K&Rや規格書やRationaleという文書から引用しつつ、よく間違いやすい部分を重点的に、Cの文法はいったいどうなっているのか、を解説しています。たとえば、第1章「“型”を意識しよう」では、
int hoge[5][10];
という配列があった場合、これを引数として関数に渡したい場合、仮引数の宣言は、
void func(int hoge[][])
や、
void func(int **hoge)
ではダメで、
void func(int (*hoge)[10])
と書かなければならないのはどうしてか、といったことを「型」に注目して解説しています。
さて、今回のこの本、連載をそのまま本にしたわけですから、原稿は(一部の手直しや、各章のリード、「はじめに」「あとがき」を除けば)まったく書いていません。「原稿を書かずに本が1冊できてラッキー」などと思ったりしたのですが……でも、校正でかなり苦労しました。
「コードの部分は等幅のフォントを使って欲しい」とか「引用部分のレイアウトは引用元を合わせて欲しい」とか、なかなか思ったような紙面になりませんでした。それでも、かなりがんばって修正をお願いした(PDF上に修正箇所を赤で書き込んだのですが、もう真っ赤な状態)のですが、これがなかなか。あまりに修正をお願いして、紙面の制作を担当されたところからは嫌われているかも知れません(←妄想)。
というわけで、今年のノルマ(年に1冊本を出す)は終了しました。ので、もう今年は遊んで暮ら……すわけにはいきません。じつは、この本は予定外というか、他にもう一冊、書き下ろしの本が夏ごろに出ます。原稿はほぼ書き終えていますが、もうじき地獄の校正が始まります。