* char型について考える
-(by [[K]], 2018.05.21)
** (1)
-C言語においては、char型が符号付きであるか符号なしであるかは、処理系に依存することになっている。それが困るならsigned/unsignedを明示することになっている。
-私はこれがとても迷惑な仕様だと思っている。だってテキストファイルの中に全角文字などがあったら、それは0x80以上の値を含んでいるわけで、だから当然charは符号なしだよねと思ったら、なんとgccのcharは符号付きなのだ・・・。
** (2)
-それならば、毎回unsigned charと書けばよいではないかと思うだろう。実は私もそう思った。しかしこれをやると、<string.h>の型と合わなくなって、そっちで悩まされる。
-むう、どうしたらいいんだ。もう半角文字だけで暮らせ!ということなのか・・・。
** (3)
-現時点の結論としては、標準関数をありがたく利用させてもらうには、やはりcharで行くしかない気がする。そして0x80以上かどうかを判定したいときだけ、 (unsigned char) でキャストすればいいのだろう。めんどくさいけどしょうがない。
** (4)
-そもそも「符号の有無なんて大小比較する時しか関係ないだろ。文字コードは大小とか関係ないんだよ。==と!=だけあればいいんだよ。だからC言語の仕様は問題ないんだよ。アルファベットかどうかを'A'~'Z'の範囲にあるかどうかで判定するとか、そんなのはASCIIコード依存なんだよ。EBCDICだとアルファベットは連続していないんだよ。だからそういう判定の仕方はクズで、<ctype.h>を使うのが正しいやり方なんだよ」という主張があるのは十分に理解しております。
-しかしですね、Windows/MacOS/Linuxで良く使われるテキストファイルでは、アルファベットは連続する文字コードを採用しているわけですし、なぜそんな文字コード体系なのかといえば、文字コードを作った人は文字種判定をやりやすくするためだったのだろうと私は思うのです。せっかくそうしてくれているのに、それを活用しないで<ctype.h>でやってしまったら、文字種テーブルがリンクされて実行ファイルがむやみに大きくなり、結局文字コードを考えてくれた人の想いを踏みにじることになります。
-だから私は必要に応じてキャストして頑張ります。
-gccには「-funsigned-char」があるじゃん・・・いやまあそうなんですが、コンパイラオプションに頼るのはちょっと事故になりやすいかな・・・と。
* こめんと欄
#comment