「空文字列」の版間の差分
編集の要約なし |
|||
18行目: | 18行目: | ||
空文字列は[[ヌルポインタ]]や[[ヌル参照]]とは別物である。ヌルポインタやヌル参照の指す先には何も存在しない(空文字列すら存在しない)。たいていの言語で、ヌルポインタやヌル参照に対して何らかの処理を実行しようとした場合は通例不正な操作であるとみなされてエラーが発生するが、空文字列は正当な文字列のひとつとして扱われる。たとえば[[Java]]において<code>null</code>を参照する文字列クラス変数の長さを求めようとすると[[NullPointerException]][[例外]]が発生するが、空文字列の長さを求めれば0が返される。また、空文字列と<code>null</code>を比較すると偽が返される。 |
空文字列は[[ヌルポインタ]]や[[ヌル参照]]とは別物である。ヌルポインタやヌル参照の指す先には何も存在しない(空文字列すら存在しない)。たいていの言語で、ヌルポインタやヌル参照に対して何らかの処理を実行しようとした場合は通例不正な操作であるとみなされてエラーが発生するが、空文字列は正当な文字列のひとつとして扱われる。たとえば[[Java]]において<code>null</code>を参照する文字列クラス変数の長さを求めようとすると[[NullPointerException]][[例外]]が発生するが、空文字列の長さを求めれば0が返される。また、空文字列と<code>null</code>を比較すると偽が返される。 |
||
< |
<syntaxhighlight lang="java"> |
||
try { |
try { |
||
String str1 = null; |
String str1 = null; |
||
29行目: | 29行目: | ||
System.out.println("" == null); // false |
System.out.println("" == null); // false |
||
System.out.println("".equals(null)); // false |
System.out.println("".equals(null)); // false |
||
</syntaxhighlight> |
|||
</source> |
|||
[[C言語]]および[[C++]]の標準ライブラリにおける文字列操作関数および文字列クラスでは、引数にヌルポインタ (<code>NULL</code>あるいは<code>nullptr</code>) が渡された場合の動作は未定義となっており、通例不正な操作とみなされてプログラムが異常終了する原因となる。 |
[[C言語]]および[[C++]]の標準ライブラリにおける文字列操作関数および文字列クラスでは、引数にヌルポインタ (<code>NULL</code>あるいは<code>nullptr</code>) が渡された場合の動作は未定義となっており、通例不正な操作とみなされてプログラムが異常終了する原因となる。 |
||
一方、[[Objective-C]]では<code>NULL</code>を参照する文字列オブジェクトに対する操作は正当なものとして扱われるが、空文字列と等価ではない。 |
一方、[[Objective-C]]では<code>NULL</code>を参照する文字列オブジェクトに対する操作は正当なものとして扱われるが、空文字列と等価ではない。 |
||
< |
<syntaxhighlight lang="objective-c"> |
||
NSString* str1 = NULL; |
NSString* str1 = NULL; |
||
NSLog(@"%u", [str1 length]); // 0 |
NSLog(@"%u", [str1 length]); // 0 |
||
NSLog(@"%@", ([str1 isEqualToString: @""] ? @"YES" : @"NO")); // NO |
NSLog(@"%@", ([str1 isEqualToString: @""] ? @"YES" : @"NO")); // NO |
||
</syntaxhighlight> |
|||
</source> |
|||
プログラミング言語によっては、エラーの発生を低減するため以下の値を同じものとして扱うことがある。 |
プログラミング言語によっては、エラーの発生を低減するため以下の値を同じものとして扱うことがある。 |
2020年7月5日 (日) 22:47時点における版
形式言語理論における空文字列(くうもじれつ・からもじれつ、empty string)またはヌル文字列(null string[1])とは、長さが0の一意な文字列であり、文字列における空集合である。主にコンピュータ、特にプログラミング言語において用いられる用語である。
形式言語における空文字列
形式的には、文字列は文字や数字といったシンボルの有限列として表現されるが、空文字列はこの有限列の特殊なケースである。空文字列は長さがゼロであり、何のシンボルも含まない。また、空文字列は必ず一つしか存在しない。これは、2つの異なる文字列が存在する場合、文字列の長さか、文字列に含まれるシンボルのいずれかが必ず異なっているためである。形式言語では、空文字列はλで表される(λの大文字であるΛや、εを使う場合もある)。
空文字列を空言語∅と混同しないこと。空言語は、形式言語(文字列の集合)において、空文字列すらも含まない空集合のことを意味する。
空文字列の持つ性質を以下に挙げる。
- : 空文字列の長さは0となる。
- : ある文字列に空文字列を連結しても、元の文字列と同じものになる。空文字列は、文字列連結における単位元である(ある文字集合Σにおいて自由モノイドを構成する)。
- : 空文字列は反転しても空文字列のままとなる。
- 辞書式順序では、空文字列はいかなる文字列よりも前に配置される。これは空文字列が最も短い文字列であるためである。[2]
プログラミング言語における利用
多くのプログラミング言語において、各文字列はそれぞれ個別のメモリ領域に格納される。そのため、同じ内容の文字列(例えば空文字列)がメモリ上の複数箇所に格納されることがある(長さ0の文字列でも格納にはメモリが必要なことに注意。使用するメモリの量は文字列の格納形式により異なる)。この場合、形式言語の定義と異なり、複数の空文字列がメモリ上に同時に存在することになる。しかし、文字列比較ルーチン(関数やメソッド)を使えば、これらの空文字列は全て同じであることを示すことができる。
空文字列はヌルポインタやヌル参照とは別物である。ヌルポインタやヌル参照の指す先には何も存在しない(空文字列すら存在しない)。たいていの言語で、ヌルポインタやヌル参照に対して何らかの処理を実行しようとした場合は通例不正な操作であるとみなされてエラーが発生するが、空文字列は正当な文字列のひとつとして扱われる。たとえばJavaにおいてnull
を参照する文字列クラス変数の長さを求めようとするとNullPointerException例外が発生するが、空文字列の長さを求めれば0が返される。また、空文字列とnull
を比較すると偽が返される。
try {
String str1 = null;
System.out.println(str1.length()); // NullPointerException
} catch (Exception e) {
System.out.println(e);
}
String str2 = "";
System.out.println(str2.length()); // 0
System.out.println("" == null); // false
System.out.println("".equals(null)); // false
C言語およびC++の標準ライブラリにおける文字列操作関数および文字列クラスでは、引数にヌルポインタ (NULL
あるいはnullptr
) が渡された場合の動作は未定義となっており、通例不正な操作とみなされてプログラムが異常終了する原因となる。
一方、Objective-CではNULL
を参照する文字列オブジェクトに対する操作は正当なものとして扱われるが、空文字列と等価ではない。
NSString* str1 = NULL;
NSLog(@"%u", [str1 length]); // 0
NSLog(@"%@", ([str1 isEqualToString: @""] ? @"YES" : @"NO")); // NO
プログラミング言語によっては、エラーの発生を低減するため以下の値を同じものとして扱うことがある。
また、プログラミング言語によっては、変数が最初に使われるとき、あらかじめ空文字列が入っているものとするものもある。
通常、空文字列は他の文字列と同じように表現される。文字列を、文字列終端文字を使用して(ヌル終端文字列または改行区切りのプレインテキストとして)実装している場合、空文字列は単一の文字列終端文字で表現される。
- プログラミング言語によっては、数値など文字列でないものと空文字列を連結すると、変数の型を文字列に型変換する。
- Oracle Databaseでは空文字列とヌル (SQL)が区別されない。
- 多くのプログラミング言語において、空文字列は最小のクワインである。
空文字列の表現 | プログラミング言語 |
---|---|
""
|
C, C++, Java, Perl, PHP, Python, JavaScript, C#, Visual Basic .NET, Go, Turing, Haskell, Objective-C (C言語形式の文字列の場合), OCaml, Standard ML, Scala, Tcl |
''
|
Perl, PHP, Python, JavaScript, Delphi, Pascal |
{'\0'}
|
C, C++, Objective-C (C言語形式の文字列の場合) |
std::string() ""s
|
C++(後者のサフィックスs によるリテラル記法を利用するには、C++14以降に対応した処理系と、あらかじめusing namespace std::literals::string_literals; が必要)
|
@""
|
Objective-C (NSString 型定数オブジェクトの場合)
|
[NSString string]
|
Objective-C (NSString オブジェクトを新規に作成する場合)
|
q()
|
Perl |
%{}
|
Ruby |
"""""" str()
|
Python |
System.String.Empty
|
.NET言語全般(C#のstring およびVB.NETのString はSystem.String へのエイリアス)
|
String.make 0 '-'
|
OCaml |
{}
|
Tcl |
空文字列の例
この節の加筆が望まれています。 |
- 位取り記数法では、空文字列はいかなる基数においても0を表す(先行ゼロがない場合においても)。ただし形式言語理論以外の領域では、空文字列は視覚的に表現ができないため、ゼロという数は伝統的に数字0の形で表現される。
- 文字列が文字へのポインタで表されるC言語などでは、ヌル文字へのポインタで表される文字列となる。ゼロで埋められたメモリ領域をヌル終端文字列として解釈すると空文字列となる。
- 空文字列はテキスト中の空行という形でも現れる。テキストファイルでよく見られるように、改行コードを2つ連続させることで空行が発生する。空行の用途として、テキスト処理で段落の区切りを表現するのに使われる場合がある(例:MediaWiki)。
関連項目
参考文献
- ^ Kernighan and Ritchie, C, p.38
- ^ CSE1002 Lecture Notes - Lexicographic