概要
本稿では,C#におけるnull合体演算子の優先順位と結合規則について,例とともに簡単に述べる.また,結合規則については演習問題を用意した.
詳細
null合体演算子とは
??
のことである.
a ?? b
は,a
がnullのときに b
,そうでないときに a
となる:
a\ ??\ b=
\begin{cases}
a & (a\neq\text{null}) \\
b & (a=\text{null})
\end{cases}
int? a = null;
int b = a ?? 0;
Console.WriteLine(b); // output: 0
null合体演算子の優先順位
確認:演算子の優先順位とは
演算子による演算が行われる順序のことを,演算子の優先順位という.
例えば,掛け算 *
は足し算 +
よりも優先順位が高い.従って,以下に示す例の a
の値は,16ではなく10である.
var a = 2 + 2 * 4;
Console.WriteLine(a); // output: 10
null合体演算子の優先順位
??
の優先順位は低い.
??
より優先順位の低い演算子は,条件演算子 ?:
,代入演算子とラムダ宣言 =>
のみである.
以下に示す例では,null合体演算子 ??
が掛け算 *
より左にある.しかし,優先順位は *
の方が高いため,b
の値は100ではなく1となる.
int? a = 1;
int b = a ?? 0 * 100;
Console.WriteLine(b); // output: 1
null合体演算子の結合規則
確認:演算子の結合規則とは
演算子の優先順位が同じである場合に,演算を行う順序を決めるための規則を結合規則という.
例えば,足し算 +
と引き算 -
の優先順位は同じである.そして,a + b - c
という式は (a + b) - c
という順序で計算される.このように,左から右へ順番に演算を行う演算子は左結合であるという.逆に,右から左へ順番に演算を行う演算子は右結合であるという.
null合体演算子の結合規則
??
は右結合である.従って,a ?? b ?? c
という式は a ?? (b ?? c)
という順序で演算が行われる.
null合体演算子の他に右結合である演算子は,条件演算子 ?:
,代入演算子とラムダ宣言 =>
である.
演習問題
(a ?? b) ?? c
と a ?? (b ?? c)
の演算結果は同じか.同じであれば証明し,そうでなければ反例を挙げよ.
※解答は別の限定共有記事に記載している.
あとがき
null合体演算子は便利なものですが,演算子の優先順位に注意しないと,思わぬバグが生じる可能性があります.実際,筆者はそのようなバグに遭遇したため,今回の記事を書くに至りました.記事の分量からもお分かりいただける通り,内容は至って簡素なことですが,こういう小さな知識の積み重ねが大事だと思います.
結合規則のことは,優先順位について調べているときにたまたま知り,せっかくならと思い一緒に書きました.null合体演算子は右結合なんですね.もし,まだ演習問題を解いていなければ,是非挑戦してみてください.
以上です.最後までお読みいただき,ありがとうございました.