空白文字の問題
画面上やテキストファイルでは空白も「文字」として扱われています。つまり文字コードが割り当てられています。プログラムファイル内で空白として扱われる文字(White-space characters)はASCIIコードでは以下の5文字があります。 0x20 ' ' : 空白(space) 最も一般的なスペース。日本語環境では英字1字と同じ幅の空白を表す(いわゆる半角スペース)。
0x09 '\t': 水平タブ(horizontal tabulation) 右向きに次のタブ位置(伝統的には左端から8の倍数の文字数分で区切られた位置)までの間を空白にして次からの文字を表示する。エディタ等ではTab↹キーを押すと入力される文字。
0x0b '\v': 垂直タブ(vertical tabulation) 下向きに次のタブ位置(伝統的には6の倍数の行数分で区切られた位置)までの間を空白にしてから次の文字を表示する。現在では使われることは滅多にない。
0x0f '\f': (form feed) 下向きに次のページまで送る。これも現在では使われることは滅多にない。
0x00 '\0': (null) ナル文字。Cでは文字列の終端を意味するが、ソースプログラム自体にナル文字が含まれている時は単に空白として扱う。
さらに以下の2種類の文字はいずれも改行(new-line)を表します(なぜ2種類あるのか、どう扱われるのかは改行文字の問題で解説します)。 0x0a '\n': 行送り(line feed) 最も一般的な改行。元来の意味は「1行分下に移動する」こと。
0x0d '\r': 復帰(carriage return) 元来の意味は「行頭に復帰して次の文字を表示する」こと。Windowsでは0x0dと0x0aの2文字で1つの改行を表すが、古いmacOS等では単独で改行を表すこともあった。
これらの文字もCプログラムファイルでは空白として扱われますが、通常の空白との違いとして以下の2点があります。
//によるコメントではこれらの改行文字の直前までをコメントと扱います
プリプロセッサでは#で始まる行は改行文字までをマクロなどで扱います。ただし改行文字の直前にバックスラッシュ\があれば次の行も引き続き同じ行として扱います。
近年ではプログラムファイルに漢字などを使うために、文字コードとしてUnicodeを用いることが主流になりました。UnicodeをUTF-8エンコーディングで利用することで、Cプログラム自身はASCIIコードで記述しつつ、文字列やコメントなどをUnicodeを使って日本語で表すことができるので、プログラムの記述性を高めることができます。Unicodeは空白文字として多種多様なものを定義していますが、Cを含むプログラミング言語の多くはこれらを空白として扱うことができません。コンパイラにより、エラーになるか、Warningが出力されます。特にUnicode名でNO-BREAK SPACEと呼ばれるU+00A0で表せる文字は、Webページ等で多用されており、Webサイトからコピペしたプログラム中に紛れ込んでいることが時々あります。また、私たち日本人がよく使う、かな漢字モードでの空白文字' '、俗に全角スペース、Unicode名ではIDEOGRAPHIC SPACEと呼ばれるこの文字も空白文字として認識されません。この文字はJIS X 0208では16進法で0x2121の2バイトで表されます。Unicodeではこの文字はU+3000(16進法で0x3000)で表せる文字です。ASCIIコードはその実質的日本語版であるJIS X 0201ではこれらの文字が表現できませんが、WindowsのテキストファイルではShift JISと呼ばれる方式でJIS X 0201とJIS X 0208を混在させており、全角スペースは0x81 0x40の2バイトで表現されます。またLinuxやmacOSのテキストファイルではUnicodeをUTF-8形式で表すので全角スペースは0xe3 0x80 0x80の3バイトで表現されます。いずれもプログラム文中で""で囲まれる場所以外にあるとコンパイラは不正な文字としてエラーを出力します。 このような事故を防ぐため、一部のテキストエディタは全角スペースを可視化してくれます。Visual Source Codeの場合は、zenkakuという拡張機能を導入すると全角スペースがハイライト表示されるので便利です。
また、プログラマ向けにデザインされたフォントの中には全角スペースを可視化するデザインを持つものがありますので、これを利用するようにエディタを設定するのも良いでしょう。全角スペースを可視化してくれるフォントとして以下のようなものがあります。