「空文字列」の版間の差分

削除された内容 追加された内容
編集の要約なし
8行目:
 
空文字列の持つ性質を以下に挙げる。
* <math>| \lambda \, | = 0</math>: 空文字列の長さは0となる。.
* <math>\lambda \, + s = s + \lambda \, = s</math>: ある文字列に空文字列を連結しても、元の文字列と同じものになる。空文字列は、文字列連結における[[単位元]]である(ある文字集合Σにおいて[[自由モノイド]]を構成する)。
* <math>{ \lambda \, }^R = \lambda \,</math>: 空文字列は反転しても空文字列のままとなる。
14行目:
 
== プログラミング言語における利用 ==
多くのプログラミング言語において、各文字列はそれぞれ個別のメモリ領域に格納される。そのため、同じ内容の文字列(例えば空文字列)がメモリ上の複数箇所に格納されることがある(長さ0の文字列でも格納にはメモリが必要なことに注意。使用するメモリの量は文字列の格納形式により異なる)。この場合、形式言語の定義と異なり、複数の空文字列がメモリ上に同時に存在することになる。しかし、文字列比較[[サブルーチン|ルーチン]](関数や[[メソッド (計算機科学)|メソッド]])を使えば、これらの空文字列は全て同じであることを示すことができる。
 
空文字列は[[ヌルポインタ]]や[[ヌル参照]]とは別物である。ヌルポインタやヌル参照の指す先には何も存在しない(空文字列すら存在しない)。たいていの言語で、ヌルポインタやヌル参照に対して何らかの処理を実行しようとした場合は多くの場合通例不正な操作であるとみなされてエラーが発生するが、空文字列に対する処理でエラーが発生すること比較的少正当文字列のひとつとして扱われる。たとえば[[Java]]においてヌル<code>null</code>を参照する文字列クラス変数の長さを求めようとすると[[NullPointerException]]などの[[例外]]が発生するが、空文字列の長さを求めれば0が返される。また、空文字列とヌル<code>null</code>を比較すると偽が返される。これは、オブジェクト指向言語においてヌルは型情報を持たないためである。
 
<source lang="java">
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
</source>
 
[[C言語]]および[[C++]]の標準ライブラリにおける文字列操作関数および文字列クラスでは、引数にヌルポインタ (<code>NULL</code>あるいは<code>nullptr</code>) が渡された場合の動作は未定義となっており、通例不正な操作とみなされてプログラムが異常終了する原因となる。
 
一方、[[Objective-C]]では<code>NULL</code>を参照する文字列オブジェクトに対する操作は正当なものとして扱われるが、空文字列と等価ではない。
<source lang="objective-c">
NSString* str1 = NULL;
NSLog(@"%u", [str1 length]); // 0
NSLog(@"%@", ([str1 isEqualToString: @""] ? @"YES" : @"NO")); // NO
</source>
 
<!-- 文字列操作の多くは空文字列に対しても正常に動作する。という意味で、空文字列も正当な文字列の1つである。
-->
プログラミング言語によっては、エラーの発生を低減するため以下の値を同じものとして扱うことがある。
* 空文字列
41 ⟶ 61行目:
|-
| <code>""</code>
| [[C言語|C]], [[C++]], [[PerlJava]], [[PythonPerl]], [[C Sharp|C#]], [[GoPHP (プログラミング言語)|GoPHP]], [[PHPPython]], (プログラミング言語)[[JavaScript]], [[C Sharp|PHPC#]], [[Visual Basic .NET]], [[JavaGo (プログラミング言語)|Go]], [[Turing]], [[JavaScript]], [[Haskell]], [[Objective-C]] (C言語形式の文字列の場合), [[OCaml]], [[Standard ML]], [[Scala]], [[Seed7]], [[Tcl]]
|-
| <code>&#39;&#39;</code>
50 ⟶ 70行目:
|-
| <code>std::string()</code><br/><code>""s</code>
| [[C++]](後者のサフィックス<code>s</code>によるリテラル記法を利用するには、[[C++14]]以降に対応した処理系と、あらかじめ<code>using namespace std::literals::string_literals;</code>が必要)
|-
| <code>@""</code>
67 ⟶ 87行目:
| [[Python]]
|-
| <code>stringSystem.String.Empty</code>
| [[.NET Framework|.NET]]言語全般(C#の<code>string</code>およびVB.NETの<code>String</code>は<code>System.String</code>へのエイリアス)
| [[C Sharp|C#]], [[VB.NET|Visual Basic .NET]]
|-
| <code>String.make 0 '-'</code>