この章のテーマ §
演算子の優先順位について学びます。計算には順番があり、それは制御可能です。
前提知識 §
Console.WriteLineメソッド, +演算子, *演算子,
解説 §
数学には、同じ数式に足し算とかけ算が含まれていた場合、あとに書かれていてもかけ算を先に計算するルールがあります。
C#にも同じような【計算の優先順位】のルールがあります。
これは演算子ごとに優先度が存在しており、これを理解しないと先に計算して欲しかったものがあとから計算されるようなことも起こります。
全演算子の優先順位は以下の通りです。上の方が先に計算されます。
演算子 | カテゴリまたは名前 |
---|
x.y、f(x)、a[i]、x?.y、x?[y]、x++、x--、x!、new、typeof、checked、unchecked、default、nameof、delegate、sizeof、stackalloc、x->y | 1 次式 |
+x、-x、!x、~x、++x、--x、^x、(T)x、await、&x、*x、true and false | 単項 |
x..y | 範囲 |
switch、with | switch および with 式 |
x * y、x / y、x % y | 乗法 |
x + y、x – y | 加法 |
x << y、x >> y | シフト |
x < y、x > y、x <= y、x >= y、is、as | 関係式と型検査 |
x == y、x != y | 等価比較 |
x & y | ブール演算の論理 AND またはビット演算の論理 AND |
x ^ y | ブール演算の論理 XOR またはビット演算の論理 XOR |
x | y | ブール演算の論理 OR またはビット演算の論理 OR |
x && y | 条件 AND |
x || y | 条件 OR |
x ?? y | Null 合体演算子 |
c ? t : f | 条件演算子 |
x = y、x += y、x -= y、x *= y、x /= y、x %= y、x &= y、x |= y、x ^= y、x <<= y、x >>= y、x ??= y、=> | 代入とラムダ宣言 |
この優先順位が不適切な場合は、先に計算させたい部分を括弧()で囲うと、そこを先に計算してくれます。
罠の数々 §
- 一見、計算に関係ないように見える&&演算子や||演算子なども演算子の一種であり、優先順位が定義されている
- 計算式を書き直している途中で、書き足した演算子が全体の計算順序を変えてしまうこともある。注意しよう。たとえばあとからかけ算を書き足すと足し算よりそちらが先に計算され、全体の計算順が変わってしまうことがある
参考リンク §
演算子の優先順位
サンプルソース: operatorPrecedence §
Console.WriteLine($"1 + 2 * 3 = {1 + 2 * 3}");
Console.WriteLine($"(1 + 2) * 3 = {(1 + 2) * 3}");
実行結果 §
1 + 2 * 3 = 7
(1 + 2) * 3 = 9
リポジトリ §
https://github.com/autumn009/CSharpPrimer2
練習問題 §
以下のプログラムで101という結果を期待したが、実際は100だった。
xが0のとき、x == 0 ? 100 : 200の結果は100になり、これに+1すれば101になるはずだ。
xが0以外のとき、x == 0 ? 100 : 200の結果は200になり、これに+1すれば201になるはずだ。
どう直せば思い通りの101/201という結果を得られるだろうか?
int x = 0;
int a = x == 0 ? 100 : 200 + 1;
Console.WriteLine(a);
- int a = x == 0 ? 101 : 200 + 1;
- int a = x == 0 ? 101 : 201 + 1;
- int a = (x == 0 ? 100 : 200) + 1;
- int a = 101;
- int a = 201;
[[解答]]