出典(authority):フリー百科事典『ウィキペディア(Wikipedia)』「2016/02/17 22:38:27」(JST)
ウィクショナリーにnullの項目があります。 |
null(ヌル、ナル)は、何もない、という意味で、プログラミング言語などコンピュータ関係では、「何も示さないもの」を表すのに使われる。同様のものに、nilが使われることもある。他の名前のこともある。
英語では/nʌl/と読むが、日本では「ヌル」が定着している。
プログラミング言語などにおいて、null
やnil
といった予約語や定数名のものなどの意味がどういったものかは言語により、場合によっては実装ごとに違う。ポインタや参照のある言語では、ヌルポインタなどと呼ばれる何も指さない特別なポインタであることもあるし、Pythonのようにオブジェクトの[1]こともある。古典的なLISPのように真理値の偽(の代表)や空リスト「()
」を兼ねたもの(それらと同じもの)だったりすることもある。
この節の出典はWikipedia:信頼できる情報源に合致していないおそれがあります。そのガイドラインに合致しているか確認し、必要であれば改善して下さい。(2013年11月) |
ドイツ語などで0を意味する Null(ヌル)に由来し、さらには、ラテン語で「無」を意味する nullus に由来する。英語読みに近い「ナル」と呼ばれる場合もある(専門書、国家試験[2]など)。nilはラテン語の古語"nihil"の変化したものである[3]。
英語では null はコンピュータに限らず使われ、しばしば zero または empty と交換可能である。例えば、null matrix は zero matrix(零行列)、null set は empty set(空集合)と同義である。
ヌルポインタとは、何のオブジェクトも指していないことを表す特別なポインタである。ヌルポインタの値や型がいかなるものかという詳細は言語によって異なる。実際的にはいかなるオブジェクトも参照しないという言語もあり、参照先を求めようとするとJava(NullPointerException)のように例外が発生するものもある。
ヌルポインタはほとんどの処理系(この場合、言語処理系プログラムだけではなく、ハードウェアまでを含めて)で、内部的に0で表現されるが、ごく希に、0でない処理系もある。言語仕様上の意味としては普通「アドレス0(あるいは他のアドレス)を指し示すポインタ」ではなく、どこも指し示さないものとされる。
C言語では、ポインタを書くべき文脈で現れた NULL
がヌルポインタ(空ポインタ)を表す。
近年はほとんど無いが、歴史的には、ヌルポインタを 0 以外で表現することもあった[4]。C89 (ISO/IEC 9899:1990) や C99 (ISO/IEC 9899:1999) では、NULL
はヌルポインタ定数を表現する物として定義され、ヌルポインタ定数は整数定数の 0 もしくは 0 を void *
に型キャストしたものとして定義されている。POSIX.1-2008 では整数定数の 0 ではなく、0 を void *
に型キャストした物、(void *) 0
でなければならないと定義していて、rationale にて、整数の 0 ではあってはならないと、その定義の差を明記している[5]。よって、ほぼ全ての標準Cライブラリは NULL
を (void *) 0
としている。そして、C89, C99 では、ヌルポインタ定数を、(void *
以外を含めた)ポイント型に型キャストした物をヌルポインタと定義している。ほとんどの実装はそのまま変換するが、C89, C99 の仕様では、整数からポインタ、ポインタから整数への型キャストがどのような結果になるかは実装依存と明記されていて、ポインタに 0 や NULL
を代入したときに、ほとんどのコンパイラは数値の 0 を代入したというコンパイル結果を生成するが、数値の 0 以外を代入するというコンパイル結果を生成しても良いという仕様になっている[6]。ただし、ヌルポインタを整数に型キャストしたら 0 にならないといけない、存在するオブジェクトや関数へのポインタはヌルポインタであってはならないと規定されている。
Pascalでは綴り記号(word symbol、すなわち予約語。『PASCAL 原書第4版』§1.2)nil
である。nil
は、空の値を表す(『PASCAL 原書第4版』§8.1)。
そのほかにも参照型の概念を持つ言語には、言葉こそ違えど同様なものが存在する。JavaやC#ではnull
、C++/CLI及びC++11ではnullptr
、Visual Basic、Visual Basic .NETではNothing
、Objective-Cではnil
、REALbasicではNil
がヌルポインタに相当するキーワードである。
PythonではNone
という名前で、その値は組込みオブジェクトである。バージョン2.4からNone
には代入できなくなった。Rubyではnil
というキーワードで、意味は組込みオブジェクトである。LISPではNIL
で、どれでも同じようなものだが実体の詳細は様々で、carやcdrをとるとそれぞれでまたnilが返ってくる実装もあればエラーになる実装もある(普通はnilかどうかをまずテストして、carやcdrしないようにする)。
Java・JavaScript・PHPなどではnullのための型「null型」(またはNULL型)が存在する。null型の値はnullのみが許される(これらの型について、他の型と同じような、"Null"のように名前があって普通に使える言語もあれば、名前がないという特別な型で他の型のようには使えない言語もある)。
nullデバイスは、存在しない架空のデバイスを表す。不要なデータストリームは、nullデバイスに出力すると、実際はどこにも出力されず廃棄される。
UNIXやLinuxでは/dev/null、MS-DOSやMS WindowsではNULで表される。
データベースのNULLは、欄が空欄であることを示す。これは人が読む用の表(ひょう)のNAにあたり、C言語のNULLよりは浮動小数点演算のNaN(非数)に近い。
具体的にはNULLには、未知・不明 (Unknown) の場合と適用不能・非存在 (Not Applicable, Inapplicable) の場合がある。例えば、名前がNULLの場合、未知のNULLは「名前はあるが分からない」ということを、適用不能のNULLは「名前が存在しない」(例えば、独身者の配偶者の名前)ことを示す。これはエドガー・F・コッドによる分類だが、彼はさらに詳細な分類をしている。
なおそれらに対し、名前欄が空文字列の場合は、(事前の取り決めがなければ)名前はあり、知っていて、欄に書かれている通り「」であることを示す。未知や適用不能のために、空文字列、文字列 'UNKNOWN'、0、-1、9999年12月31日、未使用のコードなど特定のありえない値を例外値として使うことがしばしばあるが、それらは実際の値であるとして処理されてしまう危険がある。
NULLはNULL値(あるいは空値)と呼ばれることもあるが、コッドによると値ではない(特殊な値や例外的な値ではない)。値ではないので型もない。整数型の列にあるNULLも文字列型の列にあるNULLも同じNULLであり、NULL整数・NULL文字列などの区別はない。内部的にはNULLは、(NaNやヌルポインタのような)特定のビット列ではなく、値とは別個の「NULLかどうか」を表すメモリ領域で管理されていることが多い。
NULLを含む演算の多くは結果がNULLとなる。例えば
NULL + 1 NULL / 0 NOT NULL NULL AND TRUE LENGTH(NULL)
はいずれもNULLである(0で割っても0除算は発生しない)。これは浮動小数点演算でNaNを含む式の結果がNaNになるのと似た規定である。この規定によりNULLを許容する演算は煩雑になりやすくなることから、データーベース・ベンダーによる拡張が行われている場合がある。この問題は、WHERE句でNULLでありうる列を診断しようとしたとき、特にDELETEやUPDATEで悲惨な結果を呼ぶことがある。回避方法は、NULLが混入する可能性を充分に検討し、IS NULL 演算子を駆使して式を慎重に組み立てる以外にない。
ただし少なからず場合に、NULLを含む演算で結果がNULL以外になる。このためNULLは無制限には伝播しない。ただししばしば、NULLの絡んだ演算の実装は不完全で、処理系依存が多い。
比較・IN述語など論理値を返すべき場面では、NULLを含む結果は UNKNOWN となる。UNKNOWN は、値ではないNULL(あるいは「不明 Unknown のNULL」)とは異なり TRUE(真)・FALSE(偽)に並ぶ第3の論理値である。例えば
NULL = NULL NULL <> NULL NULL = 1 NULL <> 1 NULL < 1 NULL IN (1, 2, 3) NULL IN (1, 2, NULL)
などはいずれもUNKNOWNになる。ただし、UNKNOWNの扱いにもNULLに似た難しさがある。
論理式でNULLとならない場合がある。
NULL AND FALSE NULL OR TRUE
はそれぞれFALSE、TRUEである(NULL AND TRUE、NULL OR FALSE がNULLになるのとの違いに注意)。
Oracleは空文字列とNULLを区別しないため、NULL あるいは空文字列を含む演算で非標準な結果となることがある。例えば、文字列と NULL を連結すると本来は NULL になるが、Oracleでは文字列の値を変えない(ただし NULL 同士の連結は NULL になる)。
'A' || NULL -- IS NULL, ただし Oracle では = 'A' NULL || NULL -- IS NULL
テーブルの各列には、NULLを保持できないと指定することができる。例えば、全ての行で必ず異なる値が含まれなければならないと指定されている列であっても、複数の行がNULLを保持できてしまう。そこで、この列にNULLを保持できないと指定すればこの問題が回避できる。
ソートでは、NULLはいかなる値よりも小さいとして扱われる(ただしOracleは逆にいかなる値よりも大きいとして扱われるが、オプションで変更できる)。しかし論理値でのソートが実装されていれば、以下のように IS (NOT) NULL を第1のソートキーに使ってNULLを先または後に変更できる。
ORDER BY col IS NOT NULL, col -- NULLは最初 ORDER BY col IS NULL, col -- NULLは最後
また、CASE式やCOALESCE関数(あるいはOracleならNVL関数も可)を使って、NULLに任意の値を割り当ててソートすることができる。以下の句はいずれも、colがNULLならば0を割り当ててソートする。
ORDER BY CASE WHEN col IS NULL THEN 0 ELSE col END ORDER BY COALESCE(col, 0) ORDER BY NVL(col, 0) -- Oracleのみ
None.__str__()
のように参照できる。
|
この項目は、コンピュータに関連した書きかけの項目です。この項目を加筆・訂正などしてくださる協力者を求めています(PJ:コンピュータ/P:コンピュータ)。 |
Look up Null, null, or núll in Wiktionary, the free dictionary. |
Null may refer to:
NULL
, nil
, or None
), used in computer programming for an uninitialized, undefined, empty, or meaningless valueThis disambiguation page lists articles associated with the title Null. If an internal link led you here, you may wish to change the link to point directly to the intended article. |
全文を閲覧するには購読必要です。 To read the full text you will need to subscribe.
リンク元 | 「無」「un」「zero」「nothing」「ゼロ」 |
拡張検索 | 「nulliparity」「null-cell leukemia」「nullify」「null method」 |
.