空文字列のソースを表示
←
空文字列
ナビゲーションに移動
検索に移動
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループに属する利用者のみが実行できます:
登録利用者
。
このページのソースの閲覧やコピーができます。
{{Refimprove|date=October 2013}} [[形式言語理論]]における'''空文字列'''(くうもじれつ・からもじれつ、{{lang-en-short|'''empty string'''}})とは、長さが0の一意な[[文字列]]であり、文字列における[[空集合]]である。主に[[コンピュータ]]、特に[[プログラミング言語]]において用いられる用語である。'''ヌル文字列'''({{lang-en-short|'''null string'''}}<ref>[https://e-words.jp/w/%E7%A9%BA%E6%96%87%E5%AD%97%E5%88%97.html 空文字列(ヌル文字列)とは - 意味をわかりやすく - IT用語辞典 e-Words]</ref><ref name="Kernighan and Ritchie, C, p.38">{{要検証範囲|date=2024-05|Kernighan and Ritchie, ''C'', p.38}}<!-- 「The C Programming Language, 2nd Edition」には該当する記述が見当たらない。「ISO/IEC 9899:1999」でも「null string」という語は使われていないはず。 --></ref>)とも呼ばれ、空文字列と同一視されることもあるが、[[ヌルポインタ]]やヌル参照と紛らわしい。[[Java]]ではnull stringと言えば無効な参照値である{{code|null|java}}を指し、{{Javadoc:SE|java/lang|String}}型の有効な参照値である空文字列{{code|""|java}}とは明確に区別する<ref>[https://docs.oracle.com/javaee/7/tutorial/bean-validation002.htm 21.2 Validating Null and Empty Strings - Java Platform, Enterprise Edition: The Java EE Tutorial (Release 7)]</ref>。 == 形式言語における空文字列 == 形式的には、文字列は文字や数字といったシンボルの有限列として表現されるが、空文字列はこの有限列の特殊なケースである。空文字列は長さがゼロであり、何のシンボルも含まない。また、空文字列は必ず一つしか存在しない。これは、2つの異なる文字列が存在する場合、文字列の長さか、文字列に含まれるシンボルのいずれかが必ず異なっているためである。[[形式言語]]では、空文字列は[[λ]]で表される(λの大文字である[[Λ]]や、[[ε]]を使う場合もある)。 空文字列を'''空言語'''[[∅]]と混同しないこと。空言語は、形式言語(文字列の集合)において、空文字列すらも含まない空集合のことを意味する。 空文字列の持つ性質を以下に挙げる。 * <math>| \lambda \, | = 0</math>: 空文字列の長さは0となる。 * <math>\lambda \, + s = s + \lambda \, = s</math>: ある文字列に空文字列を連結しても、元の文字列と同じものになる。空文字列は、文字列連結における[[単位元]]である(ある文字集合Σにおいて[[自由モノイド]]を構成する)。 * <math>{ \lambda \, }^R = \lambda \,</math>: 空文字列は反転しても空文字列のままとなる。 * [[辞書式順序]]では、空文字列はいかなる文字列よりも前に配置される。これは空文字列が最も短い文字列であるためである。<ref>[http://cs.fit.edu/~ryan/cse1002/lectures/lexicographic.pdf CSE1002 Lecture Notes - Lexicographic]</ref> == プログラミング言語における利用 == 多くのプログラミング言語において、各文字列はそれぞれ個別のメモリ領域に格納される。そのため、同じ内容の文字列(例えば空文字列)がメモリ上の複数箇所に格納されることがある(長さ0の文字列でも格納にはメモリが必要なことに注意。使用するメモリの量は文字列の格納形式により異なる)。この場合、形式言語の定義と異なり、複数の空文字列がメモリ上に同時に存在することになる。しかし、文字列比較[[サブルーチン|ルーチン]](関数や[[メソッド (計算機科学)|メソッド]])を使えば、これらの空文字列は全て同じであることを示すことができる。 空文字列は[[ヌルポインタ]]や[[ヌル参照]]とは別物である。ヌルポインタやヌル参照の指す先には何も存在しない(空文字列すら存在しない)。たいていの言語で、ヌルポインタやヌル参照に対して何らかの処理を実行しようとした場合は通例不正な操作であるとみなされてエラーが発生するが、空文字列は正当な文字列のひとつとして扱われる。たとえば[[Java]]において<code>null</code>を参照する文字列クラス変数の長さを求めようとすると[[NullPointerException]][[例外]]が発生するが、空文字列の長さを求めれば0が返される。また、空文字列と<code>null</code>を比較すると偽が返される。 <syntaxhighlight 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 </syntaxhighlight> [[C言語]]および[[C++]]の標準ライブラリにおける文字列操作関数および文字列クラスでは、引数にヌルポインタ (<code>NULL</code>あるいは<code>nullptr</code>) が渡された場合の動作は未定義となっており、通例不正な操作とみなされてプログラムが異常終了する原因となる。 一方、[[Objective-C]]では<code>nil</code>を参照する文字列オブジェクトに対する操作(メッセージ送信)は正当なものとして扱われるが、空文字列と等価ではない。 <syntaxhighlight lang="objective-c"> NSString* str1 = nil; NSLog(@"%lu", (unsigned long)[str1 length]); // 0 NSLog(@"%lu", (unsigned long)str1.length); // 0 NSLog(@"%@", ([str1 isEqualToString: @""] ? @"YES" : @"NO")); // NO </syntaxhighlight><!-- NSString.length プロパティは NSUInteger 型であり、実装は環境によって異なるので、書式に合わせて明示的にキャストする。 https://developer.apple.com/documentation/foundation/nsstring/1414212-length?language=objc https://developer.apple.com/documentation/objectivec/nsuinteger?language=objc --> プログラミング言語によっては、エラーの発生を低減するため以下の値を同じものとして扱うことがある。 * 空文字列 * ヌル参照 * 整数の0 * 浮動小数点数の0 * [[ブーリアン型]]のfalse * [[ASCII]]の[[ヌル文字]] また、プログラミング言語によっては、変数が最初に使われるとき、あらかじめ空文字列が入っているものとするものもある。 通常、空文字列は他の文字列と同じように表現される。文字列を、文字列終端文字を使用して([[ヌル終端文字列]]または改行区切りのプレインテキストとして)実装している場合、空文字列は単一の文字列終端文字で表現される。 * プログラミング言語によっては、数値など文字列でないものと空文字列を連結すると、変数の型を文字列に[[型変換]]する。 * [[Oracle Database]]では空文字列と[[ヌル値|ヌル (SQL)]]が区別されない。 * 多くのプログラミング言語において、空文字列は最小の[[クワイン (プログラミング)|クワイン]]である。 {| class="wikitable" |- ! 空文字列の表現 ! プログラミング言語 |- | <code>""</code> | [[C言語|C]], [[C++]], [[Java]], [[Perl]], [[PHP (プログラミング言語)|PHP]], [[Python]], [[JavaScript]], [[C Sharp|C#]], [[Visual Basic .NET]], [[Go (プログラミング言語)|Go]], [[Turing]], [[Haskell]], [[Objective-C]] (C言語形式の文字列の場合), [[OCaml]], [[Standard ML]], [[Scala]], [[Tcl]] |- | <code>''</code> | [[Perl]], [[PHP (プログラミング言語)|PHP]], [[Python]], [[JavaScript]], [[Object Pascal|Delphi]], [[Pascal]] |- | <code>{'\0'}</code> | [[C言語|C]], [[C++]], [[Objective-C]] (C言語形式の文字列の場合) |- | <code>std::string()</code><br/><code>""s</code> | [[C++]](後者のサフィックス<code>s</code>によるリテラル記法を利用するには、[[C++14]]以降に対応した処理系と、あらかじめ<code>using namespace std::literals::string_literals;</code>が必要) |- | <code>@""</code> | [[Objective-C]] (<code>NSString</code>型定数オブジェクトの場合) |- | <code>[NSString string]</code> | [[Objective-C]] (<code>NSString</code>オブジェクトを新規に作成する場合) |- | <code>q()</code> | [[Perl]] |- | <code>%{}</code> | [[Ruby]] |- | <code>""""""</code><br/><code>str()</code> | [[Python]] |- | <code>System.String.Empty</code> | [[.NET Framework|.NET]]言語全般(C#の<code>string</code>およびVB.NETの<code>String</code>は<code>System.String</code>へのエイリアス) |- | <code>String.make 0 '-'</code> | [[OCaml]] |- | <code>{}</code> | [[Tcl]] |- |} === 空文字列の例 === {{Expand section|date=October 2013}} * [[位取り記数法]]では、空文字列はいかなる基数においても0を表す([[先行ゼロ]]がない場合においても)。ただし形式言語理論以外の領域では、空文字列は視覚的に表現ができないため、ゼロという数は伝統的に数字'''0'''の形で表現される。 * 文字列が文字への[[ポインタ (プログラミング)|ポインタ]]で表される[[C言語]]などでは、ヌル文字へのポインタで表される[[文字列]]となる。ゼロで埋められたメモリ領域を[[ヌル終端文字列]]として解釈すると空文字列となる。 * 空文字列はテキスト中の空行という形でも現れる。テキストファイルでよく見られるように、改行コードを2つ連続させることで空行が発生する。空行の用途として、テキスト処理で[[段落]]の区切りを表現するのに使われる場合がある(例:[[Markdown]]<ref>{{Cite web2 |title=Basic Syntax |url=https://www.markdownguide.org/basic-syntax/#paragraphs-1 |url-status=live |archive-url=https://web.archive.org/web/20240509145449/https://www.markdownguide.org/basic-syntax/#paragraphs-1 |archive-date=2024-05-09 |access-date=2024-05-09 |website=Markdown Guide}}</ref>)。 == 関連項目== * [[空集合]] * [[ヌル終端文字列]] == 参考文献 == {{Reflist}} {{ヌル}} {{デフォルトソート:からもしれつ}} [[Category:プログラミング言語の構文]] [[Category:文字列]] [[Category:無]]
このページで使用されているテンプレート:
テンプレート:Cite web2
(
ソースを閲覧
)
テンプレート:Code
(
ソースを閲覧
)
テンプレート:Expand section
(
ソースを閲覧
)
テンプレート:Javadoc:SE
(
ソースを閲覧
)
テンプレート:Lang-en-short
(
ソースを閲覧
)
テンプレート:Refimprove
(
ソースを閲覧
)
テンプレート:Reflist
(
ソースを閲覧
)
テンプレート:ヌル
(
ソースを閲覧
)
テンプレート:要検証範囲
(
ソースを閲覧
)
空文字列
に戻る。
ナビゲーション メニュー
個人用ツール
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
ソースを閲覧
履歴表示
その他
検索
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
特別ページ
ツール
リンク元
関連ページの更新状況
ページ情報