C# 演算子と式 (C# リファレンス)
C# には多数の演算子が用意されています。 これらの多くは組み込み型によってサポートされており、これらの型の値を使用して基本的な操作を実行できます。 これらの演算子には、次のグループが含まれます。
- 算術演算子では、数値オペランドを使用して算術演算が実行されます
- 比較演算子では、数値オペランドが比較されます
- ブール論理演算子では、
bool
オペランドに対して論理演算が実行されます - ビットごとおよびシフト演算子では、整数型のオペランドに対してビットごとまたはシフト演算が実行されます
- 等値演算子では、そのオペランドが等しいかどうかが確認されます
通常は、これらの演算子をオーバーロードできます。つまり、ユーザー定義型のオペランドに対して演算子の動作を指定できます。
最も単純な C# 式は、変数のリテラル (たとえば、整数と実数の数) と名前です。 演算子を使用すると、これらを複雑な式に組み合わせることができます。 演算子の優先順位と結合規則によって、式の中の操作の実行順序が決まります。 かっこを使用すれば、演算子の優先順位と結合規則によって定められた評価の順序を変更することができます。
次のコードでは、式の例が代入の右側にあります。
int a, b, c;
a = 7;
b = a;
c = b++;
b = a + b * c;
c = a >= 100 ? b : c / 10;
a = (int)Math.Sqrt(b * b + c * c);
string s = "String literal";
char l = s[s.Length - 1];
var numbers = new List<int>(new[] { 1, 2, 3 });
b = numbers.FindLast(n => n > 1);
通常、式によって結果が生成され、別の式に含めることができます。 void
メソッド呼び出しは、結果を生成しない式の例です。 次の例に示すように、これはステートメントとしてのみ使用できます。
Console.WriteLine("Hello, world!");
C# に用意されている他の種類の式を次に示します。
補間された文字列式では、書式設定された文字列を作成するための便利な構文が提供されます。
var r = 2.3; var message = $"The area of a circle with radius {r} is {Math.PI * r * r:F3}."; Console.WriteLine(message); // Output: // The area of a circle with radius 2.3 is 16.619.
ラムダ式を使用すると、匿名関数を作成できます。
int[] numbers = { 2, 3, 4, 5 }; var maximumSquare = numbers.Max(x => x * x); Console.WriteLine(maximumSquare); // Output: // 25
クエリ式を使用すると、C# でクエリ機能を直接使用できるようになります。
var scores = new[] { 90, 97, 78, 68, 85 }; IEnumerable<int> highScoresQuery = from score in scores where score > 80 orderby score descending select score; Console.WriteLine(string.Join(" ", highScoresQuery)); // Output: // 97 90 85
式本体の定義を使用すると、メソッド、コンストラクター、プロパティ、インデクサー、またはファイナライザーの簡潔な定義を提供できます。
演算子の優先順位
複数の演算子を含む式では、優先順位の高い方の演算子が優先順位の低い方の演算子よりも先に評価されます。 次の例では、乗算は加算より優先順位が高いため、最初に乗算が実行されます。
var a = 2 + 2 * 2;
Console.WriteLine(a); // output: 6
演算子の優先順位によって定められた評価の順序を変更するには、かっこを使用します。
var a = (2 + 2) * 2;
Console.WriteLine(a); // output: 8
次の表は、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 |
プライマリ |
+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 | Shift |
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 ?? ○ | 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、=> | 代入とラムダ宣言 |
演算子の結合規則
演算子の優先順位が同じ場合は、演算子の結合規則によって、操作の実行順序が決まります。
- 結合規則が左から右の演算子は、左から右に順番に評価されます。 代入演算子と null 合体演算子を除き、2 項演算子はすべて左からの結合です。 たとえば、
a + b - c
は(a + b) - c
と評価されます。 - 結合規則が右から左の演算子は、右から左に評価されます。 代入演算子、null 合体演算子、ラムダ、および条件演算子
?:
は、右からの結合です。 たとえば、x = y = z
はx = (y = z)
と評価されます。
演算子の結合規則によって定められた評価の順序を変更するには、かっこを使用します。
int a = 13 / 5 / 2;
int b = 13 / (5 / 2);
Console.WriteLine($"a = {a}, b = {b}"); // output: a = 1, b = 6
オペランドの評価
式内のオペランドは、演算子の優先順位と結合規則に関係なく、左から右に評価されます。 次の例では、演算子とオペランドが評価される順序を示しています。
正規表現 | 評価の順序 |
---|---|
a + b |
a、b、+ |
a + b * c |
a、b、c、*、+ |
a / b + c * d |
a、b、/、c、d、*、+ |
a / (b + c) * d |
a、b、c、+、/、d、* |
通常、演算子のオペランドはすべて評価されます。 ただし、一部の演算子では、条件付きでオペランドが評価されます。 つまり、このような演算子では、左端のオペランドの値によって、他の (または、どの) オペランドを評価するかどうかが定義されます。 これらの演算子は、条件付き論理 AND (&&
) および OR (||
) 演算子、null 合体演算子 ??
と ??=
、null 条件演算子 ?.
と ?[]
、および条件演算子 ?:
です。 詳細については、演算子ごとの説明を参照してください。
C# 言語仕様
詳細については、「C# 言語仕様」の次のセクションを参照してください。