スッキリわかるC言語入門

「unsignedへの冷遇度」では負ける気がしない

あ....あんしぐねど!!

こんにちは、スッキリC著者の中山です。

今月は、発売されたばかりの「スッキリPython」の絶賛キャンペーン中ですが、C言語も地味に地道に頑張りますよー!

前回の「このポスト」では、2018年生まれのスッキリCが「伝統的なC入門書の様式美」とズレている秘密をご紹介しました1

その記念すべき第二弾として、今回は、みんな読み方に迷ったことがあるはず2のunsignedについて、スッキリCの恐るべき冷遇っぷりをご紹介しましょう。

型の紹介で、boolがレギュラー顔してでてくる

C言語の入門書に限らず、プログラミング言語入門書ではわりと序盤の1章か2章で「変数と型」を扱います。スッキリCの場合も2章で型を紹介するわけなんですが、代表的な型としては次の表のようにして紹介しています。

まず、C言語に精通した方は気づかれた人もいると思いますが、しれっとbool型の紹介をしています。この型はC99以降で標準化された型であり、非標準のオプションとして紹介する入門書もあるのですが、スッキリCでは「当然のようにして使うべき型」と感じて貰えるよう紹介しています。なぜかといえば、

  • 前回の記事で記載したように、この型が標準化されてもう20年が経っている
  • 制御構文の条件式の考え方は、真偽値の概念で考えることほうが自然で理解がスムーズ
  • 現代のCの学び手はC++やC#等の他言語に進んでいく人が多い(それらではbool活用必須)

だからです。

もちろん、C言語では伝統的にintでboolを代用することや、TRUE,FALSEなどのマクロ定数宣言での利用が多いこと等にもしっかり触れています。また、「戻り値が真偽を意味するint型の場合に、その戻り値をtrueやfalseと比較すると危険」などの、やや実務寄りの注意喚起も含めているのもスッキリシリーズならではかなと思います。

「なにそれ?」補足


たとえばisalpha()関数は、引数で与えられた文字がアルファベットかを判定し、その判定結果の真偽を返します。しかし、この結果はint型であり、必ずしも0または1とは限らない(-2や300が返ってくることもある)ため、例えば、if(isalpha(x) == true)のようなコードを書くと正しく判定できない(trueやTRUEは1であるため)、というC言語現場あるあるトラップが発動します。

そのくせunsignedがでてこない

そして肝心のunsignedですが、型の紹介のところでは、ほとんど出てきません。後の章でコード中に登場してしまうため、やむをえず「unsignedっていうのがあるけど、気になる人は付録Dみてね」というコラム(p54)が挟んでありますが、本当はそれも削除したかったのが本心です。

そうすべきと確信できるのは、毎年数百人の方のプログラム学習を直接お手伝いさせていただいていて、次のような「学び手が理解しやすいアプローチの変化」を感じるからです。

低水準から積上げるより、高水準から降りてく方がスムーズ

例えばネットワークの仕組みを解説する場合でいうと、一昔前、まだネットが今ほど普及していなかった15〜20年ほど前は、学び手に「コンピュータやネットに関する知識や経験」あまりないケースが大多数でした。そのため、いわゆる「2進数とは」「物理層とは(Layer1)」「IPとは(Layer3)」「HTTPとは(Layer7)」と積み上げていく解説が学び手にとってスムーズに理解できるアプローチでした。

一方の2019年。今年の春もありがたいことに、600人近い方の前に立たせていただき、プログラミング学習のお手伝いをさせていただきました。そして、スマホやWebシステムなど毎日当然のようにネットを使っている彼らにとっては、

2進数だハードウェアだなどと解説されるほうが、よっぽどわかりにくい

ようなのです。彼らにとっては、最も身近なLayer7(つまりHTTP)をまず理解したく、その後、少しずつLayer4、Layer3、Layer1と舞台裏を紹介していくほうが、すんなり理解が進みます。

スッキリCでunsignedの解説を付録にまわしたのも同様の理由からでした。2019年にC言語を学ぶ人にとってみれば、

  • 「unsignedとsignedの違いでバイナリ表現が違うこと」なんて縁遠すぎる
  • 組み込みでさえそこそこメモリを搭載する現代、「節約のためにunsigned」という発想に共感しにくい
  • ただでさえ不安で大変な「学びはじめ」の第2章で、なんでこんなややこしい話して心を折りにくるの?

っていう感じだと思うんです。うん、俺だったら絶対そう思う。

でも、ただ冷遇してるってわけじゃないんです

ということで、入門書にあるまじき冷遇っぷりでunsignedを表舞台から引きずりおろしているスッキリCなわけですが、もちろん単に冷たくしているわけではありませんから安心してください。

入門学習を進める上では存在を消した方がスムーズなunsignedですが、現場コードでは非常によく出てきますし、標準ライブラリ関数などでも使います。ですから、本文からは切り出して、付録Dにて腰を据えて紹介させていただきました3

この付録Dには、unsignedの他にも、本編で解説するには「大事だけど、今じゃない。」という技術トピックが盛りだくさんです。本編でC言語の基礎やポインタなどをしっかり理解して掴んだ後だからこそ、むしろ楽しんで戴けるのではないかと思います。

(スッキリC 付録Dで紹介する+αなトピックたち)

  • unsigned
  • ビット演算
  • 関数ポインタ
  • ワイド文字
  • リンケージ
  • コンパイラによる最適化(register等)

上記に限らず、それぞれの技術トピックが、一番受け入れられやすく、一番愛してもらえるタイミングを見計らって、学び手にお引き合わせするのも我々の大事な仕事かなって思います。いっけん「冷遇」にみえますが、著者としては実は「礼遇」しているつもりなのでございます。

「なんでこんな順番で紹介しているのか?」という裏読みも楽しい、「スッキリわかるC言語入門」を、今後ともぜひよろしくお願いします!

  1. 物語に例えると、「ご老公一行が偶然、事件に巻き込まれる → 犯人はおまえだ → えぇい、であえい! → ちゃんちゃんバラバラ → もういいでしょう&印籠コンボ → ははぁ」というのを長年見てきた人が、女子高生のゆるふわな日常を描くアニメみて「何コレ」っていう感覚かしら...ちと違うか。
  2. Kubernatesほどではないか
  3. たとえば、規格上char型だけは「signed charとcharが同一である保証がない」点などにも触れさせていただいています

-スッキリわかるC言語入門
-,