記者は日経ソフトウエアでここ4年半ほどC言語を使ったプログラミングの連載記事を担当している。「C言語好き」を自認してもいる。プログラムを書くことを直接の生業としていないので,プロのエンジニアに比べればずいぶんお気楽な「好き」には違いないが。

 最初に連載を手がけたころはJavaの台頭がめざましい時期で,日経ソフトウエアでCプログラミングを連載するのもそろそろ最後かという空気すらあった。ならばということで,思い切り基礎に立ち返った内容で有終の美を飾ろうとしたところ,その連載がかなりの好評をいただいた。「やっぱりC言語の連載は必要だね」ということになり,現在に至るまで何らかの形でCプログラミングの連載が載り続けている。

 C言語好きとしてはC言語の記事が載り続けるのは喜ばしいのだが,担当するようになって1年たち2年たつうちに,これでいいのかという問題意識が頭をもたげてきた。月刊誌の連載記事は長くても半年から1年で完結となることが多い。その1年が「C言語を使える」と言えるレベルまで書き尽くすには短すぎるのだ。C言語を学び始めてある程度理解が進んでくると,あまりの奥深さに「自分は半可通に過ぎない」という自覚が芽生えてくる。40年近くも第一線で使われているC言語には膨大なコード資産とノウハウの蓄積がある。不文律のようなものに行き当たったとき,「慣習的なもの」と考えて従っておけばとりあえずそれでなんとかなりそうな場合もあるのだが,その知識が標準Cとして正しいとは限らなかったりもする。ゼロから始める内容の1年間の連載ではそのような領域にはほとんど踏み込めない。

 そこで,ここ1年半ほど続けてきた4本目の連載では,中級,上級へのステップアップの足がかりとなることを狙って,基礎講座ものの連載とは趣を変えてみた。ジャンルも難易度も様々なトピックを短くまとめて,毎月数本ずつ紹介するスタイルにしたのだ。1年間の基礎講座では取り上げようもなかった高度なネタも取り上げた。執筆者から届く原稿を最初に読む喜びを味わいつつ,自分はこんなことも知らなかったのかと冷や汗をかいたりもした。

 この連載は通常より長めの1年半にわたって続き,先ごろ,いったん完結したのでそれを「よくわかる!実践Cプログラミング」というムックにまとめた。標準ライブラリ関数の解説,ちょっとしたクイズなども盛り込み,合計108個のトピックで構成している。担当編集者として何度も何度もゲラを読み直して,やっぱりC言語は面白いと自信を深め,宣伝も兼ねてつぶやきにきた次第だ。

標準Cトリビア3題

 ムックの宣伝はここまで。件の連載/ムックを通じて記者が「へぇ」と思ったもののうち特に印象深かったものをクイズ形式で三つ紹介したい。いずれもC言語の標準規格C99(JISなら「JIS X 3010:2003プログラム言語C」。C99はその通称)に関するものだ。C言語をちょっとでもかじったことがある人は「マル」か「バツ」かを考えてみてほしい。Cやプログラミングに興味がない人には何がなにやらわからないかもしれないが,このような細かい規格をみんなが意識することがソフトウエアの世界では結構重要なのだというムードだけでも感じ取ってもらえればと思う。

 Q1:main関数の返却値の型はintである。
 Q2:int型は少なくとも-3万2768~3万2767を扱えなければならない。
 Q3:\0はナル文字と定義されている。

 いかがだろう。main関数,int型,ナル文字とどれもC言語の基本中の基本である。順に解説しよう。

 まずQ1。これはバツである。「mainは一般にint型だ」と理解している人はたくさんいるだろう。たいていはそれで正しいのだが,実は必ずそうとは決まっていない。C99は,main関数の定義として4個の選択肢を規定している。そのうち3個はよく知られているようにint型またはintと同等の型としているが,4個目として「処理系定義の方法」でのmain関数の定義を許している。つまりint型でないmain関数を持つ標準Cの処理系もあり得る。

 次にQ2。これもバツである。ただし「int型は完全に処理系依存だから」という理由でのバツは不正解。C99ではint型で最小限扱えなければならない範囲を規定していて,それを満たすには最低16ビット必要になる。ここまで聞いて「では『マル』ではないのか?」と思う人もいるかもしれない。16ビットの符号付き整数は,負数を「2の補数」と呼ぶ形式で表現する場合,-3万2768~3万2767を扱えるからだ。しかし,C99ではint型で表現できる最小値を-3万2767以下と規定している(ただし規格上の表現はもう少し込み入っている)。つまり「-3万2767~3万2767」が正解。ちなみにC99では「2の補数」表現のほかに「1の補数」「符号と絶対値」による負数の表現を採用した実装も「あり」としている。これらの負数表現を採用すると16ビットの符号付き整数は-3万2767~3万2767となる。

 最後にQ3。ちょっとした引っかけなのだがこれもバツである。\0はもちろんナル文字を表すが,C99に直接\0をナル文字と定義する規定はない。\0は\記号に1~3けたの8進数を続けて書くことでその8進数値を持つ1個の文字を記述する「8進逆斜線表記」による文字表記で,「すべてのビットが0であるバイトをナル文字(null character)という」とする規定と合わせて結果的に\0がナル文字を意味することになる。

 三つとも正しい理由を付けて正解できた人には,記者は何も言うことはない。きっとC言語の正確な知識が既に身に付いているか,これからでも着実に身に付けていける人だろう。一方,全く訳もわからずここまで読んでくださった方がいたら,これも何かの縁と思ってプログラミングを始めてみてほしい。少ないながらも専門の雑誌も出ている。そして,自信たっぷりに答えて間違えた人,「そんな細かいこと」と思った人,一緒にがんばりましょう。間違ったC言語の知識は危険をはらみがちだし,Q2に見られるような微妙な落とし穴の中にはコンピュータ/ソフトウエアの仕組みや歴史的経緯による何らかの合理的な理由がよく隠されている。たとえ教養言語としてでも,学ぶからにはそこまで理解してこそ,なのがC言語である。

■変更履歴
C99を念頭に置いたことが明確になるように本文を修正しました。[2009/12/24]