7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

C#Advent Calendar 2022

Day 4

C#におけるnull合体演算子 ?? の優先順位と結合規則

Last updated at Posted at 2022-12-03

概要

本稿では,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) ?? ca ?? (b ?? c) の演算結果は同じか.同じであれば証明し,そうでなければ反例を挙げよ.

※解答は別の限定共有記事に記載している.

あとがき

null合体演算子は便利なものですが,演算子の優先順位に注意しないと,思わぬバグが生じる可能性があります.実際,筆者はそのようなバグに遭遇したため,今回の記事を書くに至りました.記事の分量からもお分かりいただける通り,内容は至って簡素なことですが,こういう小さな知識の積み重ねが大事だと思います.

結合規則のことは,優先順位について調べているときにたまたま知り,せっかくならと思い一緒に書きました.null合体演算子は右結合なんですね.もし,まだ演習問題を解いていなければ,是非挑戦してみてください.

以上です.最後までお読みいただき,ありがとうございました.

参考

7
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?