かつてマイコン雑誌で有名で、今でも積極的にそれ界隈の雑誌や書籍を出版している所から、今でもC言語は役立つ部分がある、との趣旨の新刊書が出ています。「ベテランプログラマー」と編集者がキャッチを表題に加えたみたいで、その昔、C言語やLinuxの解説で鳴らした方のようです。私の指向と少し異なる分野のためか、名前は覚えていませんでした。
何でも大手電機企業のハード部門で基本的なプログラムをやっていたみたいで、定年の少し前に独立して社長になられたみたいです。その思い出話。
私よりずっと若く、PC-9801やMSXが広く普及している時代に少年期を迎えた世代です。私は勝手にMSX世代と呼んでいて、おそらくBASICでパソコンに入門し、機械語の威力に触れて、そのままC言語とUNIXに向かった感じです。
本書はですから、どちらかというと組み込み系のプログラム時にC言語プログラマが突き当たる問題を解説している感じです。さすがにわかりやすい解説で感心しました。
私のような古い世代から見ると、やはりFORTRANとかLISPとか、せめてPASCALの経験があったらなあ、と言う感じです。ポインタは出てくるのに「参照」という言葉はついに出てきませんでした。C言語以外の、その時代に流行のインタプリタ言語の話題がいくつか出てくるにもかかわらず。
C言語にアロー演算子と呼ばれるものがあって、構造体のメンバーを選択する時に使います。構造体のデータ、例えばxにaと名付けられた要素がある場合に、aを参照するには、
x.a
と書きます。pがxへのポインタとなっている場合は、同じ事を、
p->a
と書きます。pを宣言するには、
struct Cx0 x, *p;
局所変数ではpが不定(アドレス)になってしまうので、初期化するには、
p = &x;
のような式となります。
これがなぜか、構造体の時には要素を参照するのにアロー演算子を使う、と解説されていて、しかもこれが初めてでは無く、最近、他の著者も同じような表現をしていました。
おそらく中身は理解していると思えるので、単にいわゆる舌足らずの説明と思います。
というのも、上述のp->aは、
(*p).a
と全く同じ意味だからです。今のところ私の感触が唯一の根拠ですが、アロー演算子が用意された理由は、
pp->s->a
みたいな書き方が(特にOS周りで)まれとは言えないほどに出てきて、これをいちいち、
(*((*pp).s)).a
と書くと目がチラチラして何のことか把握するのに時間がかかるからだ、と思います。
つまり文法上のショートカットを用意しただけ、と思います。
もう一つはsizeof演算子で、これは当初のC言語では演算子と言うよりもマクロの感じです(本来の意味のコンパイル前に解決される)が、その後の幾度かの改訂の際になぜか本当に演算子みたいな動き(動作時に動作する)をするようになったので迷う原因になります。これにも少し触れられていて、しかし要するに注意しろとしか言ってないような感じです。
こういうのは、たとえばLISPで簡単なコンパイラみたいなのを作ると割と簡単に理解できる場所と思います。会社に入ってしまって、現場の作業に追われてしまうと、ついつい幾分離れた分野の勉強の機会を逸してしまうのかな、と想像しました。