概要
本稿では,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合体演算子は右結合なんですね.もし,まだ演習問題を解いていなければ,是非挑戦してみてください.
以上です.最後までお読みいただき,ありがとうございました.