• ベストアンサー

ヌル文字とは一体何でしょうか

はじめまして。  私はC言語というか、プログラムの超初心者なのですが、参考書を読んでいる途中で「C言語では¥0を整数に変換すると、0という値になります」という記述があったのですが、これは一体どういう意味なのでしょか?どなたか分かりやすく教えていただければ非常に幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLK314
  • ベストアンサー率55% (84/152)
回答No.2

C言語にはchar, int, float等、組み込みの型が幾つかあります。 しかし、文字列型というのは存在しません。 しかし、コンピュータも人間が扱う以上、 文字列の扱いを避けては通れないのも事実です。 そこで、char型配列を文字列の代用として扱います。 文字列の終わりには'\0'という特殊な文字を付加する規則になっています。 文字列の長さを戻すstrlen()等はこの規則に準じて'\0'を探すことで 文字列の長さを計測します。 ところで、コンピュータは、そもそも、非常に”おバカ"なので、 "文字列"はおろか、その前提となる"文字"すらも知りません。 コンピュータが扱えるのは"数値"のみです。 まさに、電子"計算機"そのものです。 (計算しかできないので、文字は知りません) あまりに不便で仕方ないので 文字と数値との対応関係を定めることにしました。 この対応関係を文字コードと言います。 文字コードは1種類ではなく、何種類もあります。 代表的なものは ASCIIコード、JISコード, SHIFT-JISコード、ユニコードなどです (他にもたくさんあります) たとえば ASCIIコードでは 文字の'A'は数値の65に対応すると定められています。 これを 'A'のコードは65である。 と表現したりします。 "文字を数値に変換する"とは 文字のコードを求めることにほかなりません。 ちなみに'Z'は90です。 90-65+1=26 なので、 ASCIIコードではアルファベット大文字が26文字隙間なく並んでいることが わかります。 だから、char変数cがアルファベット大文字かどうか調べる際に if (c == 'A' || c == 'B' || .......|| c =='Z') と長々しく記述しなくても if (c >= 'A' && c <= 'Z') とシンプルに書けるのです。 このとき コンピュータは, (文字を直接扱えないので) if (c >= 65 && c <= 90) と翻訳して実行します。 (この話はASCIIコード前提であることに注意が必要です。 すべての文字コードがASCIIと同様、アルファベットを隙間なく並べているとは 限りません。また文字のコードも異なる可能性があります) C言語では、特に文字コードを定めているわけではありません。 しかし、文字列の終端を表す'\0'のコードだけはしっかり定めています。 '\0'のコードは0です。 これで C言語では¥0を整数に変換すると、0という値になります となるのです。

elkmarchan
質問者

お礼

初心者の私にコンピューターに関する初歩から教えてくださり 大変感謝しております。何度も読み直して理解させていただきました。 本当にありがとうございました。

その他の回答 (5)

回答No.6

違う角度から。。 ヌル文字「\0」は NUL文字といって、文字列の終端を示す制御文字です。 ASCIIコード上では、NULは0x00に相当しています。 これが、NUL == 0 といわれる理由です。 \t(HT文字)とか\n(LF文字)とか使われることもあると思いますがこれと同じレベルですね。 printfで変換してくれています。 制御コードについてはASCIIコードについて、調べてもらえれば出てくると思います。 まぁ。普段使っているもの以上に覚える必要はないでしょうけど^^;; ちなみにCでは、 似たようなもので、NULL というのがありますが、これはNUL文字と別なので注意してください。 NULLはあくまで無効なポインタを表す単語です。 NUL文字(「\0」)のように、何かの値を示すものではありません。

参考URL:
http://ja.wikipedia.org/wiki/ASCII
elkmarchan
質問者

お礼

非常に参考になりました。 大変感謝しております。 ASCIIコードと制御文字についてこれを機会に勉強してみます。 ほんとうにありがとうございます。

  • myun2
  • ベストアンサー率0% (0/2)
回答No.5

他の人が大体言っていますが、もう少し要約して説明してみます。 コンピュータの中ではご存知の通り、何もかもが数値で表現されています。 例えば「A」と言う文字もコンピュータの中では数値で、「65」と言う数値として扱われています。 「\~」(←ほにゃららの部分は数字) と言うのは、「コンピュータの中の数値で~に対応する文字」の意味です。 ・・・実際には「~」は8進数(8進数が何かについてはGoogle等で調べてみてください)で書かなければならないので、例えば「A」と言う文字を表現したければ、65を8進数に変換し「\101」としなければなりませんが。 「\0」は「コンピュータの中で”0”として扱っている文字」の事ですから、そのまんまそれは「0」である、と言うことです。

elkmarchan
質問者

お礼

非常に分かりやすい説明で、とても参考になりました。 ありがとうございました!

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

文字を表す '~' の中で \ に続いて高々 3桁の 8進数を書いた場合, それは「その 8進数をコードに持つ文字」を意味します. だから, '\0' は「コード 0 の文字」です. で, C において文字リテラルは「その文字コードを値とする int 型の定数」ですから, '\0' は int の 0 です.

elkmarchan
質問者

お礼

8進数の理解が自分は曖昧なのでこれも勉強してみようと思います。 ありがとうございます。

  • oldman50
  • ベストアンサー率29% (8/27)
回答No.3

 参考書の中の 「C言語では¥0を整数に変換すると、0という値になります」 という記述は、正確な表現ではありません。 特に 「変換」 しなくても、'\0' は整数0を表しています。  '\0' の 「定義」 について、K&Rには以下のように記述されています。 「 2.3 Constants ・・・ A character constant is an integer, written as one character within single quotes, such as 'x'. 文字定数は整数です。 The value of a character contant is the numeric value of the character in the machine's character set. 文字定数の値は数値です(その数値は、文字集合として機械が持つ数値の集合の元です)。 ・・・ Character constants participate in numeric operations just as any other integers, although they are most often used in comparisons with other characters. 文字定数は、普通の整数と全く同様に使えます。 ・・・ The character constant '\0' represents the character with value zero, the null character. 文字定数 '\0' は、整数値のゼロを表します(機械の中の文字集合では、元「ヌル文字」を表します)。 '\0' is often written instead of 0 to emphasize the characer nature of some expression, but the numeric value is just zero. '\0' という表記が、或る 「式(expression)」 の文字としての性質を強調するために、数値のゼロの代わりに頻繁に使われますが、その値はただの整数値ゼロです。 」 (K&R、p.37~p.38)

elkmarchan
質問者

お礼

大変参考になりました。 大変感謝しております。

  • info22
  • ベストアンサー率55% (2225/4034)
回答No.1
elkmarchan
質問者

お礼

これを機会に勉強してみます。ありがとうございます。

関連するQ&A