Null合体演算子
null合体演算子 (null coalescing operator)はC#や5.10以降のPerl、Swiftなど、いくつかのプログラミング言語にある、ある種の条件演算子で、PerlではDefined-or 演算子と呼ばれる。エルビス演算子も参照。C言語の3項 codice_1 codice_2 演算子で表現すると codice_3 というような意味のコードをより単純に書ける、一種の糖衣構文と見ることもできる。
C#ではnull合体演算子はcodice_4である。次のように用いる。
例えば、ページのタイトルが存在しない場合にデフォルトとして"Default Title"を設定したい場合には、以下の文を用いることが出来る。
これは次のようなより冗長な表現の代わりとして用いることが出来る。
これら3つの表現は等価である。
この演算子は同じ表現内で複数回用いることが出来る。 
一度、非nullな値が設定されるか、最終値(nullであるかもしれないしnullでないかもしれない)にたどり着くと完了する。
ColdFusion 11もしくは 4.1ではCFMLはnull合体演算子を三項演算子codice_5の一種としてサポートする。上述のC#の同様のものと機能的にも文法的にも等価である。以下がそのコード例である。
Perl(5.10以降)においてnull合体演算子はcodice_6であり、以下のようなPerlのコードで用いることが出来る。
"possibly_null_value"は"null"か"非null"か(もしくは、 Perlにおいては"未定義"か"定義済み"か)評価される。評価に基づき、"possibly_null_value"がnullの場合には"value_if_null"が返され、そうでない場合は"possibly_null_value"が返される。三項演算子(codice_7)がサポートされる言語における三項演算子と同様に動作する。上述のPerlのコードは三項演算子の以下の用法と等価である。
この演算子の最も一般的に利用法は単なるnullチェックのためのコードを最小限にするためである。
ある種の非nullの値(Perlの場合、0と空文字列)を偽として取り扱う他の言語と同様に、論理和演算子"||"はnull合体演算子ではない。
Perlはさらにcodice_8代入演算子を有し、はとおおむね等価である。
Swiftではnil合体演算子はcodice_4である。のアンラップの際のデフォルトを提供するために用いられている。
例えば、ページのタイトルが存在しない場合にデフォルトとして"Default Title"を設定するSwiftのコードを実装したい場合には、以下の文を用いることが出来る。
これは以下の冗長な文の代わりとなる。
OracleのPL/SQLでは()関数が同じ役割を提供する。
NVL(possibly_null_value, 'value if null');
SQL Server/Transact-SQLでは同じパターンのISNULL関数が存在する。
ISNULL(possibly_null_value, 'value if null');
"ISNULL"と"IS NULL"を混同しないように注意が必要である。後者は何かが"NULL"として宣言されているか否かを評価するために存在する。
ANSI SQL-92標準規格はOracle、SQL Server、PostgreSQL、SQLite、そしてMySQLに実装されているCOALESCE関数を含む。COALESCE関数はnullでない最初の引数を返し、すべての引数がnullの場合はnullを返す。
COALESCE(possibly_null_value[, possibly_null_value, ...]);
PHPではPHP 7以降でnull合体演算子codice_4を利用できる。
PHP 7でnull合体演算子codice_4が追加される以前から、三項演算子として用いられるcodice_5条件演算子の真ん中の部分を二項演算子を作るために除外することができた(PHP 5.3以降)。最初は関連した言語に登場したので、顔文字と似ていることからエルビス演算子としても知られている。
しかし、PHPの文法上の不幸なエラーにより、三項の条件演算子はPHPにおいては期待される動作と違い左結合性であるため、 複数の条件演算子を組み合わせると極めて直感的でない結果となる。エルビス演算子は(三項演算子の場合と同様に)チェーン表記した際にこの文法上の制約にさらされる。
codice_5演算子は、(他のいくつかのプログラミング言語でのnull合体演算子と同様に)最初の項がcodice_14と評価されるときに最初の項を返す。また、最初の項に未定義の変数が与えられた場合にNOTICEレベルの警告を発生する。
一方、codice_4演算子は未定義の変数を与えることができ、また、最初の項がcodice_16または未定義の変数でなければ、整数0や空の配列などcodice_17と評価される値であっても最初の項を返す。この点において、演算子はPHPのcodice_18疑似関数と同様に振る舞う。
これらの演算子は、PHPにおける三項演算子の(通常の)用法と同様に、結果を変数に代入する代わりにechoやreturnにも用いることができる。
条件演算子やOR演算子などを用いることでnull合体演算子と同様の働きを再現させることができる言語も多い。
Pythonの"or"演算子は以下に示されるようにnull合体演算子ではない。
»> 0 or 1
1
もしもorがnull合体演算子であれば、最初のnullでない値である0を返すはずである。(0とPythonではNoneと呼ばれるnullは異なった概念である。)しかしながら、実際には、or演算子は左項が0やFalseや"(空文字列)でないことを保証するために(もしくはそれらをNoneと区別する必要性がない場合に)用いられることがある。
Schemeでは"偽"と"null"はcodice_19と表記される同じ値で代表される。その上、0や空文字列や空リストが偽として振る舞う他の一部の言語と異なり、codice_19はSchemeの論理演算子で偽として評価される唯一の値である。codice_21と表記される論理codice_22演算子は、codice_23が偽でない場合にはcodice_23を返し、そうでない場合にはcodice_25を返す。これにより、Schemeでは独立した「null合体演算子」を設ける必要性がなく、codice_22がその目的を達成する。
JavaScriptではnull合体演算子の役割は論理codice_22演算子を用いることで達成される。
function setTitle(suppliedTitle) {
これはJavascriptの真偽判定のコンセプト上の問題により、null合体の正しい例ではないことに注意が必要である。このため、JavaScriptが偽であると評価する値(例えば0や偽)も同様に文の評価において合体され、望ましくない結果をもたらす可能性がある。
Kotlinはエルビス演算子codice_5を用いる。
val title = suppliedTitle ?: "Default title"
GroovyでもKotlinと同様にエルビス演算子を使用することができる。
エルビス演算子は本来はnullではなくfalseのチェックを行うものだが、これらの言語ではnullはfalseとみなされる。
Objective-Cにおいてはnull合体演算子の役割はcodice_5演算子におけるcodice_1の後の重複した値を単純に省略することによって達成される。
注意：JavascriptやPythonの場合と同様に、codice_31やcodice_32のようなプリミティブと用いた場合には偽として評価され、続く値が返されるため、これは「真の」null合体演算子ではない。さらに、この表記はLLVMコンパイラに追加されたCのGNU拡張であることにも注意が必要である。
nullはF#においては値や変数として通常用いられない。しかしながら、例えばF#のコードがC#から呼ばれるような場合にnullが登場する。
F#は組み込みのnull合体演算子を持っていないが、必要に応じてカスタムの演算子として定義することが出来る。
このカスタムの演算子はC#の組み込みのnull合体演算子と同様に用いることが出来る。