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];
List<int> numbers = [..collection];
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 # でクエリ機能を直接使用できるクエリ式:
int[] scores = { 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、false | 単項演算子 |
x..y | 範囲 |
スイッチ、 ⿇ |
switch および with 式 |
x * y, 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, x ??= y、=> | 代入とラムダ宣言 |
論理パターンコンバイネーターの優先順位については、「パターン」の記事の「論理パターンの優先順位とチェック順序」セクションを参照してください。
演算子の結合規則
演算子の優先順位が同じである場合、演算子の結合性によって、操作が実行される順序が決まります。
-
左連想 演算子は、左から右の順に評価されます。
代入演算子と null 結合演算子を除き、すべての二項演算子は左結合です。 たとえば、
a + b - c
は(a + b) - c
として評価されます。 -
右連想 演算子は、右から左の順に評価されます。 代入演算子、null 結合演算子、ラムダ、および 条件付き演算子
?:
は、右連想です。 たとえば、x = y = z
はx = (y = z)
として評価されます。
Von Bedeutung
フォーム P?.A0?.A1
の式では、 P
が null
されている場合、 A0
も A1
も評価されません。 同様に、フォーム P?.A0.A1
の式では、P
が null の場合、A0
は評価されないため、どちらもA0.A1
されません。 詳細については、 C# 言語の仕様 を参照してください。
演算子の結合性によって課される評価の順序を変更するには、かっこを使用します。
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# 言語仕様」の次のセクションを参照してください。
こちらも参照ください
.NET