新・闘わないプログラマ No.320

C99あれこれ 〜_Bool編〜


「ISO/IEC 9899:1999」、通称「C99」、要するにCの新しい規格が、いつのまにやら「JIS X 3010:2003」として規格化されていることに、いまさらながら気づきました。この規格自体は、日本工業標準調査会(JISC)のサイトからPDF版を読むことができます(見るだけならタダ)。ただしこれは保存も印刷出来ないので、紙で見たい場合には、別途規格書を購入しないといけません。
しかし、このPDF版の規格書、相変わらず印刷物をスキャンしただけのものなんですね。なもんで内容を検索する事もできない、という不便なものだったりして、いいかげん何とかして欲しいものです(新しく採択された規格等では、検索可能なPDFになっている規格もあるようですが)。まあ、いずれにしても、買っていない(高くて買えない)のに文句を言うのは筋違いかも知れません。

そういう話はともかく、そのC99です。規格ができてもう4年以上経つのですが、私自身、いままでほとんど調べていませんでした。が、ここにきて仕事上ちょっとばかり調べる必要が出てきたので、ようやく規格に目を通すようになったところです。
で、いままでのC、C89(C90?)とかC95などといったいどこが違っているのか、ウェブ上になにかまとまった資料が無いかな、と調べてみたのですが、日本語で書かれている目ぼしいページでは、結局、私も以前言及した「プログラミング言語Cの新機能」というページしか見つけられませんでした(このページは非常によくまとまっています)。やっぱり、まだまだ普及してないのでしょうか、C99。
そんなわけで、その「プログラミング言語Cの新機能」とJISの規格書(印刷も検索も保存もできないPDF版なのでかなり不便 ←タダで読んでるくせに文句ばかり言っている奴)を見比べながら、いろいろと調査しているところです。
で、いままで私が調べた範囲内でのC99の感想ですけど、「こんな機能いるんかいな」というように思える機能が結構あったりします。いやもちろん「この機能が昔からあったらなあ」と思わせるものも無いではないですが、いまさらそれをCに追加する必要があるんだろうか、と思ってしまいます。そんなわけで、今回の駄文は、このC99に対する「いちゃもん」です。もちろん「いちゃもん」ですから異論もあるでしょうし、私の認識不足による誤りがあったりする可能性も高いです。

というわけで、まず最初の「いちゃもん」として「_Bool」を取り上げます。
C99では新しい型がいくつか導入されました。「long long int」型のように今後のことを考えると必要な型が規格化されたことは有益であろうとは思います。また、複素数を扱う型も新設されているみたいですが、これの必要性については…よくわかりません。私自身、大学を出てから複素数は扱ったことなかったりしますし、そもそもCで複素数を扱うような計算をする需要というのがどれだけあるのか、それとも無いのか、よく知りません。ですのでこれについてはノーコメントとしておきます。
さて、Cの場合、他の多くのプログラミング言語と違って、「真」と「偽」という二値を取る「論理型」という型はありませんでした。その替わりに整数型の値を使い、値がゼロだったら「偽」、ゼロ以外だったら「真」ということにするのが決まり(習慣?)です。
たとえば、

    a > 10

という式を評価すると、その値は、aの値が10より大きければ真という意味で1(整数値)、aの値が10以下なら偽という意味で0(整数値)になります。また、

    if ( 式 )
        文1
    else
        文2

というif文は、式の値が0(整数値)以外の場合には文1を実行、式の値が0(整数値)の場合には文2を実行します。このように、論理型の無かったCでは真偽を表す値に整数値を使ってきたわけです。Cのことを「高級アセンブリ言語」などと呼ぶと異論、反論、語弊がありまくりなのであまりこういう表現はしたくないのですが、まあ、整数値を使って真偽を表現するあたりはアセンブリ言語的である、とも言えるとは思います。
そんな中、C99では「_Bool」という型が新設されました。規格書「JIS X 3010:2003」の6.2.5の項に、

型_Boolとして宣言されたオブジェクトは, 値0及び1を格納するのに十分な大きさをもつ。
(中略)
型_Bool, 及び標準符号付き整数型に対応する符号無し整数型は, 標準符号無し整数型(standard unsigned integer type)とする。

というわけで、_Bool型なるものが、0と1を入れるための符号無し整数型として新たに追加されました。型名を「bool」とかじゃなくて、この変な型名(_Bool)にしたのは、既にあるプログラムが、たとえば、

    #define bool  unsigned int
    #define true  1
    #define false 0

とかやっていて名前がぶつかってしまう可能性を低くするためでしょうけど(いかにも後から取って付けたような命名 ←いや、本当に後から取って付けたわけですが)、いまいちですね。
などと思っていたら、「stdbool.h」というヘッダファイルが新たに規格化されて、これをincludeすれば「bool」「true」「false」というのが使えるようになるようです。

さて、この_Bool型、いまさらこういうのを追加してどれだけ利点があるものなのでしょうか。整数型を論理値を表すために使う従来のCプログラムと比較して、論理値を入れたい変数に0と1以外が入る可能性が無くなってバグが減るかも、とか、_Bool型はビットフィールドに使えるとか、あと何かありますでしょうか。
そもそも、この_Bool型、あくまで符号無し整数型の一種でしかなく、論理型というわけでもないので、他の整数型等と自由に演算できてしまうようです。これはどうにも中途半端に見えます。もし仮に「論理型」というのを導入して、

くらいの制限を文法に加えるならば、まだわからないでもないのですが…って、そんなことをしたら今までCで書いたプログラムはみんな書き直しになってしまいますから、今更そんなことはできないでしょうね。
というわけで、_Bool型に対する、私の現在の認識は、
「今までだってさほど困ってなかったんだし、わざわざ中途半端な型を導入して文法を複雑にすること無いじゃん。どうしても論理値を表すための標準を決めたいというのなら、ヘッダファイルだけ規格化して、そこで『bool』とか『true』とか『false』とかを定義しとけばよかったんじゃない?」
ということで…あ、でも、私がとんでもない勘違いや見落しをしている可能性はあるかも……_Bool型の素晴らしい利点というのがもしあるのなら、どなたかこっそり教えてください(←手抜き)。

[前へ] [次へ]

[Home] [戻る]


mailto:lepton@amy.hi-ho.ne.jp