null

null みたいな類の各プログラミング言語での取り扱いの比較。

C言語

NULL というのがある。0と同じで、ポインタに0を代入するのと NULL を代入するのはたぶん同じで、ポインタがなにも指していないことを意味するのに使われる。

Java

null というのがあり、任意の参照型になりえる。参照型なので、intなどのプリミティブ型にnullを使うことはできない。

一度も代入されていないローカル変数を参照しようとすると、 variable x might not have been initialized というようなコンパイルエラーになり、デフォルトでnullになることはない。

一方、一度も代入されていないクラスのフィールドや配列の要素を参照しようとすると、参照型は null になり、 intなどの数値のプリミティブ型は 0booleanfalse になり、コンパイルエラーにはならない。

Scala

Javaとの互換性のためにJavaと同じnullがあるが、ScalaではnullはJavaのライブラリを使用するときに現れてしまうのみで、通常の利用は推奨されない。 nullを使いたくなる場面ではScalaではOption型の Some, None を使う。

一度も代入されていないローカル変数というのはScalaでは文法上ありえない。 valvar での変数宣言と同時に代入が必要。

変数宣言時に _ で代入すると、Int などでは 0Booleanfalse になり、それ以外は null になる。

Nil というものもあるが、これは要素が1つもない空のList型のオブジェクトであり、ぜんぜん違う。

PHP

NULL というのがある。TRUE / FALSEと同じく大文字小文字が区別されない。

一度も代入されていない変数や、unset関数が呼び出された変数を参照しようとすると、未定義の変数として PHP Notice: Undefined variable が発生し、NULL という値が返される。

変数が定義済みかどうかをチェックするには isset で調べれば良い。 isset は引数に与えた変数が定義済みかどうかを TRUEFALSE で返す。 NULL を明示的に代入した変数に対しても FALSE が返される。 isset は通常の関数ではなく、言語構造である。

if (isset($a)) {
    # 定義済みの場合
} else {
    # 未定義の場合
}

isset は変数だけでなく連想配列の要素が存在するかどうかにも使われる。 -> 連想配列に特定のキーが含まれているかどうかを判定するには

NULL はいろいろな値を一致してしまうので注意。

var_export(NULL    == NULL); // => true
var_export(''      == NULL); // => true
var_export(0       == NULL); // => true
var_export(array() == NULL); // => true
var_export(FALSE   == NULL); // => true
var_export(NULL    === NULL); // => true
var_export(''      === NULL); // => false
var_export(0       === NULL); // => false
var_export(array() === NULL); // => false
var_export(FALSE   === NULL); // => false

NULL | PHP Manual
http://php.net/manual/ja/language.types.null.php

isset | PHP Manual
http://php.net/manual/ja/function.isset.php

Python

None というのがある。関数にreturn文がないときに、Noneが返されるものとみなされる。

Ruby

nil というのがある。Rubyでは nil もオブジェクトであるので、メソッドを呼ぶ出すことができる。 nilNilClass というクラスの唯一のインスタンスである。Scalaの Nil とはぜんぜん意味が違う。

print nil.nil?
# => true

Perl

undef という値がある。

変数を宣言だけして一度も代入しないと undef になる。または、宣言もなにもせずにいきなり初めての変数を参照しようとしても undef になる。

定義済みの変数を未定義の状態に戻すには、以下のようにする。

$a = undef;

または以下のようにもできる。

undef $a;

defined を使うと、定義済みかどうかを判定することができる。

if (defined $a) {
    # 定義済みの場合
} else {
    # 未定義の場合
}

undef''eq で比較すると Use of uninitialized value という警告が出るが、等値との判定はされる。

JavaScript

nullundefined というのがある。

null かどうかを判定するには

a === null

undefined かどうかを判定するには

typeof a === 'undefined'

外部リンク

このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。