形式言語理論における
空文字列(empty string)とは、長さが0の
文字列であり、記号を全く含まない、
文字列における
空集合のことです。主に
コンピュータ、特に
プログラミング言語において重要な概念として用いられます。空
文字列は「
ヌル文字列(null string)」とも呼ばれますが、プログラミングの世界では、ヌルポインタやヌル参照とは異なる概念として扱われます。例えば
Javaでは、null stringは無効な参照値であるnullを指し、String型の有効な参照値である空
文字列`""`とは明確に区別されます。
形式言語では、
文字列は記号の有限列として表現されます。空
文字列は、この有限列の特殊なケースであり、長さがゼロで、どの記号も含まない唯一の
文字列です。異なる
文字列が存在する場合、長さか含まれる記号が必ず異なるため、空
文字列はただ一つしか存在しません。
形式言語では、空
文字列は通常`λ`で表されます(`
Λ`や`ε`が使われることもあります)。
空文字列と空言語の区別
空
文字列と混同しやすい概念に「空言語」があります。空言語は、
文字列の集合である
形式言語において、空
文字列すらも含まない
空集合を指します。
以下に、空
文字列の重要な性質をまとめます。
長さ: 空
文字列の長さは0です (`|λ| = 0`)。
連結: 任意の
文字列に空
文字列を連結しても、元の
文字列と同一になります (`λ + s = s + λ = s`)。これは、空
文字列が
文字列連結における
単位元であることを示しています。
反転: 空
文字列を反転しても、空
文字列のままです (`λ^R = λ`)。
辞書式順序: 辞書式順序において、空
文字列は他のすべての
文字列よりも前に配置されます。これは、空
文字列が最も短い
文字列であるためです。
多くの
プログラミング言語では、
文字列はメモリ上の個別の領域に格納されます。そのため、同じ内容の
文字列(例えば空
文字列)が複数箇所に存在することがあります。ただし、
文字列比較ルーチンを使えば、これらの空
文字列は全て同じものとして扱われます。
空
文字列は、ヌルポインタやヌル参照とは明確に区別されます。ヌルポインタやヌル参照は何も指し示さないのに対し、空
文字列は正当な
文字列として扱われます。例えば
Javaでは、nullを参照する
文字列クラス変数の長さを求めようとするとNullPointerExceptionが発生しますが、空
文字列の長さを求めると0が返ります。また、空
文字列とnullを比較すると偽が返ります。
C/
C++では、標準ライブラリの
文字列操作関数にヌルポインタが渡されると、動作が未定義となり、プログラムが異常終了する可能性があります。一方、
Objective-Cではnilに対する操作は正当とみなされますが、空
文字列とは異なります。
プログラミング言語によっては、エラーを減らすために、以下の値を同じものとして扱う場合があります。
空
文字列
ヌル参照
整数の0
浮動小数点数の0
ブーリアン型のfalse
ASCIIの
ヌル文字
また、変数が最初に使われる際に、初期値として空
文字列が設定されることもあります。
通常、空
文字列は他の
文字列と同様に表現されます。例えば、
ヌル終端文字列として実装されている場合、空
文字列は単一の
ヌル文字で表現されます。
プログラミング言語によっては、数値などの
文字列でない値と空
文字列を連結すると、変数の型が
文字列に変換されることがあります。
Oracle Databaseでは、空
文字列とNULLが区別されません。
多くの
プログラミング言語において、空
文字列は最小のクワインとなります。
位取り記数法: 位取り記数法では、空
文字列はどの基数においても0を表します(先行ゼロがない場合)。ただし、通常は数字の0で表現されます。
C言語: C言語では、空
文字列は
ヌル文字を指すポインタで表現されます。ゼロで埋められたメモリ領域を
ヌル終端文字列として解釈すると、空
文字列になります。
テキストファイル: テキストファイルでは、連続する改行コード(例:`
`)によって空行が生成され、段落の区切りなどに利用されます(例:
Markdown)。
関連項目
空集合
*
ヌル終端文字列