C# 演算子C# Operators

C# には、多くの演算子が用意されています。演算子とは、式で実行する演算 (数値演算、インデックス作成、関数呼び出しなど) を指定する記号のことです。C# provides many operators, which are symbols that specify which operations (math, indexing, function call, etc.) to perform in an expression. 多くの演算子は、ユーザー定義型に適用する際にオーバーロードして、その意味を変更できます。You can overload many operators to change their meaning when applied to a user-defined type.

整数型に対する演算 (==!=<>&|) は、通常、列挙型 (enum) で使用できます。Operations on integral types (such as ==, !=, <, >, &, |) are generally allowed on enumeration (enum) types.

ここでは、C# の演算子を優先順位の高い順に示します。The sections below list the C# operators starting with the highest precedence to the lowest. 各セクションの演算子の優先順位は同じです。The operators within each section share the same precedence level.

主な演算子Primary Operators

優先順位が最も高い演算子です。These are the highest precedence operators.

x.y – メンバー アクセス。x.y – member access.

x?.y – null 条件付きのメンバー アクセス。x?.y – null conditional member access. 左側のオペランドが null に評価される場合に null を返します。Returns null if the left-hand operand evaluates to null.

x?[y] - null 条件付きのインデックス アクセス。x?[y] - null conditional index access. 左側のオペランドが null に評価される場合に null を返します。Returns null if the left-hand operand evaluates to null.

f(x) – 関数の呼び出し。f(x) – function invocation.

a[x] – 集約オブジェクトのインデックス作成。a[x] – aggregate object indexing.

x++ – 後置インクリメント。x++ – postfix increment. x の値を返した後、1 大きくなった (通常は整数 1 が加算された) x の値で格納場所を更新します。Returns the value of x and then updates the storage location with the value of x that is one greater (typically adds the integer 1).

x-- – 後置デクリメント。x-- – postfix decrement. x の値を返した後、1 小さくなった (通常は整数 1 が減算された) x の値で格納場所を更新します。Returns the value of x and then updates the storage location with the value of x that is one less (typically subtracts the integer 1).

new – 型のインスタンス化。new – type instantiation.

typeof – オペランドを表す Type オブジェクトを返します。typeof – returns the Type object representing the operand.

checked – 整数演算のオーバーフロー チェックを有効にします。checked – enables overflow checking for integer operations.

unchecked – 整数演算のオーバーフロー チェックを無効にします。unchecked – disables overflow checking for integer operations. これがコンパイラの既定の動作です。This is the default compiler behavior.

default(T) – 型 T の既定の値を生成します。default(T) – produces the default value of type T.

Delegate – delegate インスタンスを宣言して返します。delegate – declares and returns a delegate instance.

sizeof – 型オペランドのサイズをバイト単位で返します。sizeof – returns the size in bytes of the type operand.

-> – メンバー アクセスと組み合わせてポインターを逆参照します。-> – pointer dereferencing combined with member access.

単項演算子Unary Operators

これらの演算子は、前のセクションより優先順位が低く、次のセクションより優先順位が高くなります。These operators have higher precedence than the next section and lower precedence than the previous section.

+x – x の値を返します。+x – returns the value of x.

-x – 数値の否定。-x – numeric negation.

!x – 論理否定。!x – logical negation.

~x – ビットごとの補数。~x – bitwise complement.

++x – 前置インクリメント。++x – prefix increment. 1 大きくなった (通常は整数 1 が加算された) x の値で格納場所を更新した後に x の値を返します。Returns the value of x after updating the storage location with the value of x that is one greater (typically adds the integer 1).

--x – 前置デクリメント。--x – prefix decrement. 1 小さくなった (通常は整数 1 が減算された) x の値で格納場所を更新した後に x の値を返します。Returns the value of x after updating the storage location with the value of x that is one less (typically subtracts the integer 1).

(T)x – 型キャスト。(T)x – type casting.

awaitTask を待機します。await – awaits a Task.

&x – アドレス。&x – address of.

*x – 逆参照。*x – dereferencing.

乗算演算子Multiplicative Operators

これらの演算子は、前のセクションより優先順位が低く、次のセクションより優先順位が高くなります。These operators have higher precedence than the next section and lower precedence than the previous section.

x * y – 乗算。x * y – multiplication.

x / y – 除算。x / y – division. オペランドが整数の場合、結果は 0 に近い整数になるように切り捨てられます (例: -7 / 2 is -3)。If the operands are integers, the result is an integer truncated toward zero (for example, -7 / 2 is -3).

x % y – 剰余。x % y – remainder. オペランドが整数の場合、x を y で除算した剰余を返します。If the operands are integers, this returns the remainder of dividing x by y. q = x / yr = x % y の場合、x = q * y + r になります。If q = x / y and r = x % y, then x = q * y + r.

加法演算子Additive Operators

これらの演算子は、前のセクションより優先順位が低く、次のセクションより優先順位が高くなります。These operators have higher precedence than the next section and lower precedence than the previous section.

x + y – 加算。x + y – addition.

x – y – 減算。x – y – subtraction.

シフト演算子Shift Operators

これらの演算子は、前のセクションより優先順位が低く、次のセクションより優先順位が高くなります。These operators have higher precedence than the next section and lower precedence than the previous section.

x << y – ビットを左へシフトし、右側には 0 を格納します。x << y – shift bits left and fill with zero on the right.

x >> y – ビットを右へシフトします。x >> y – shift bits right. 左側のオペランドが int または long の場合、左側のビットには符号ビットが格納されます。If the left operand is int or long, then left bits are filled with the sign bit. 左側のオペランドが uint または ulong の場合、左側のビットには 0 が格納されます。If the left operand is uint or ulong, then left bits are filled with zero.

関係演算子と型検査演算子Relational and Type-testing Operators

これらの演算子は、前のセクションより優先順位が低く、次のセクションより優先順位が高くなります。These operators have higher precedence than the next section and lower precedence than the previous section.

x < y – より小さい (x が y より小さい場合は true)。x < y – less than (true if x is less than y).

x > y – より大きい (x が y より大きい場合は true)。x > y – greater than (true if x is greater than y).

x <= y – 以下。x <= y – less than or equal to.

x >= y – 以上。x >= y – greater than or equal to.

is – 型の互換性。is – type compatibility. 評価される左側のオペランドを右側のオペランドで指定された型 (静的な型) にキャストできる場合は、true を返します。Returns true if the evaluated left operand can be cast to the type specified in the right operand (a static type).

as – 型変換。as – type conversion. 左側のオペランドを右側のオペランドで指定された型 (静的な型) にキャストして返します。ただし、(T)x が例外をスローした場合、asnull を返します。Returns the left operand cast to the type specified by the right operand (a static type), but as returns null where (T)x would throw an exception.

等値演算子Equality Operators

これらの演算子は、前のセクションより優先順位が低く、次のセクションより優先順位が高くなります。These operators have higher precedence than the next section and lower precedence than the previous section.

x == y – 等価比較。x == y – equality. 既定では、string 以外の参照型の場合、参照の等価性を返します (等価テスト)。By default, for reference types other than string, this returns reference equality (identity test). ただし、型は == をオーバーロードできるため、同一性のテストが目的の場合は objectReferenceEquals メソッドを使用することをお勧めします。However, types can overload ==, so if your intent is to test identity, it is best to use the ReferenceEquals method on object.

x != y – 等しくない。x != y – not equal. == のコメントを参照してください。See comment for ==. 型が == をオーバーロードする場合は、!= をオーバーロードする必要があります。If a type overloads ==, then it must overload !=.

論理 AND 演算子Logical AND Operator

この演算子は、前のセクションより優先順位が低く、次のセクションより優先順位が高くなります。This operator has higher precedence than the next section and lower precedence than the previous section.

x & y – 論理またはビットごとの AND。x & y – logical or bitwise AND. 通常、整数型と enum 型で使用できます。You can generally use this with integer types and enum types.

論理 XOR 演算子Logical XOR Operator

この演算子は、前のセクションより優先順位が低く、次のセクションより優先順位が高くなります。This operator has higher precedence than the next section and lower precedence than the previous section.

x ^ y – 論理またはビットごとの XOR。x ^ y – logical or bitwise XOR. 通常、整数型と enum 型で使用できます。You can generally use this with integer types and enum types.

論理 OR 演算子Logical OR Operator

この演算子は、前のセクションより優先順位が低く、次のセクションより優先順位が高くなります。This operator has higher precedence than the next section and lower precedence than the previous section.

x | y – 論理またはビットごとの OR。x | y – logical or bitwise OR. 通常、整数型と enum 型で使用できます。You can generally use this with integer types and enum types.

条件 AND 演算子Conditional AND Operator

この演算子は、前のセクションより優先順位が低く、次のセクションより優先順位が高くなります。This operator has higher precedence than the next section and lower precedence than the previous section.

x && y – 論理 AND。x && y – logical AND. 最初のオペランドが false に評価される場合、C# では 2 番目のオペランドが評価されません。If the first operand evaluates to false, then C# does not evaluate the second operand.

条件 OR 演算子Conditional OR Operator

この演算子は、前のセクションより優先順位が低く、次のセクションより優先順位が高くなります。This operator has higher precedence than the next section and lower precedence than the previous section.

x || y – 論理 OR。x || y – logical OR. 最初のオペランドが true に評価される場合、C# では 2 番目のオペランドが評価されません。If the first operand evaluates to true, then C# does not evaluate the second operand.

Null 合体演算子Null-coalescing Operator

この演算子は、前のセクションより優先順位が低く、次のセクションより優先順位が高くなります。This operator has higher precedence than the next section and lower precedence than the previous section.

x ?? yxnull 以外の場合は x を返します。null の場合は y を返します。x ?? y – returns x if it is non-null; otherwise, returns y.

条件演算子Conditional Operator

この演算子は、前のセクションより優先順位が低く、次のセクションより優先順位が高くなります。This operator has higher precedence than the next section and lower precedence than the previous section.

t ? x : y – テスト t が true に評価される場合は x を評価して返します。それ以外の場合は y を評価して返します。t ? x : y – if test t evaluates to true, then evaluate and return x; otherwise, evaluate and return y.

代入演算子とラムダ演算子Assignment and Lambda Operators

これらの演算子は、前のセクションより優先順位が低く、次のセクションより優先順位が高くなります。These operators have higher precedence than the next section and lower precedence than the previous section.

x = y – 代入。x = y – assignment.

x += y – インクリメント。x += y – increment. y の値を x の値に加算した結果を x に格納し、新しい値を返します。Add the value of y to the value of x, store the result in x, and return the new value. xevent を指定した場合、y は、C# によってイベント ハンドラーとして追加される適切な関数である必要があります。If x designates an event, then y must be an appropriate function that C# adds as an event handler.

x -= y – デクリメント。x -= y – decrement. y の値を x の値から減算した結果を x に格納し、新しい値を返します。Subtract the value of y from the value of x, store the result in x, and return the new value. xevent を指定した場合、y は、C# によってイベント ハンドラーとして削除される適切な関数である必要があります。If x designates an event, then y must be an appropriate function that C# removes as an event handler

x *= y – 乗算代入。x *= y – multiplication assignment. y の値を x の値に乗算した結果を x に格納し、新しい値を返します。Multiply the value of y to the value of x, store the result in x, and return the new value.

x /= y – 除算代入。x /= y – division assignment. x の値を y の値で除算した結果を x に格納し、新しい値を返します。Divide the value of x by the value of y, store the result in x, and return the new value.

x %= y – 剰余代入。x %= y – remainder assignment. x の値を y の値で除算した剰余を x に格納し、新しい値を返します。Divide the value of x by the value of y, store the remainder in x, and return the new value.

x &= y – AND 代入。x &= y – AND assignment. y の値と x の値の AND 演算を行った結果を x に格納し、新しい値を返します。AND the value of y with the value of x, store the result in x, and return the new value.

x |= y – OR 代入。x |= y – OR assignment. y の値と x の値の OR 演算を行った結果を x に格納し、新しい値を返します。OR the value of y with the value of x, store the result in x, and return the new value.

x ^= y – XOR 代入。x ^= y – XOR assignment. y の値と x の値の XOR 演算を行った結果を x に格納し、新しい値を返します。XOR the value of y with the value of x, store the result in x, and return the new value.

x <<= y – 左シフト代入。x <<= y – left-shift assignment. x の値を y で指定した分だけ左へシフトした結果を x に格納し、新しい値を返します。Shift the value of x left by y places, store the result in x, and return the new value.

x >>= y – 右シフト代入。x >>= y – right-shift assignment. x の値を y で指定した分だけ右へシフトした結果を x に格納し、新しい値を返します。Shift the value of x right by y places, store the result in x, and return the new value.

=> – ラムダ宣言。=> – lambda declaration.

算術オーバーフローArithmetic Overflow

算術演算子 (+-*/) を実行すると、結果が数値型の有効な値の範囲を超えることがあります。The arithmetic operators (+, -, *, /) can produce results that are outside the range of possible values for the numeric type involved. 詳細については、各演算子に関するセクションを参照してください。概要は、以下のとおりです。You should refer to the section on a particular operator for details, but in general:

  • 整数の算術オーバーフローでは、OverflowException がスローされるか、または結果の最上位ビットが破棄されます。Integer arithmetic overflow either throws an OverflowException or discards the most significant bits of the result. 0 による整数除算では、常に DivideByZeroException がスローされます。Integer division by zero always throws a DivideByZeroException.

    整数のオーバーフローが発生したときの対処方法は、実行コンテキスト (checked または unchecked) によって異なります。When integer overflow occurs, what happens depends on the execution context, which can be checked or unchecked. checked コンテキストの場合は、OverflowException がスローされます。In a checked context, an OverflowException is thrown. unchecked コンテキストの場合は、結果の最上位ビットが破棄され、実行が続行されます。In an unchecked context, the most significant bits of the result are discarded and execution continues. このように、C# ではオーバーフローを処理するのか、それとも無視するのかをユーザーが選択できます。Thus, C# gives you the choice of handling or ignoring overflow. 既定では、算術演算は unchecked コンテキストで発生します。By default, arithmetic operations occur in an unchecked context.

    算術演算の場合だけでなく、整数型から整数型へのキャスト (long から int へのキャストなど) でもオーバーフローは発生し、その場合も実行が checked または unchecked のいずれかによって対処が異なります。In addition to the arithmetic operations, integral-type to integral-type casts can cause overflow (such as when you cast a long to an int), and are subject to checked or unchecked execution. ただし、ビット処理演算子とシフト演算子ではオーバーフローは発生しません。However, bitwise operators and shift operators never cause overflow.

  • 浮動小数点数の算術オーバーフローまたは 0 による浮動小数点除算では、例外はスローされません。これは、浮動小数点型が IEEE 754 に基づいており、無限大および NaN (Not a Number) を表現できるためです。Floating-point arithmetic overflow or division by zero never throws an exception, because floating-point types are based on IEEE 754 and so have provisions for representing infinity and NaN (Not a Number).

  • 小数の算術オーバーフローでは、常に OverflowException がスローされます。Decimal arithmetic overflow always throws an OverflowException. 0 による小数除算では、常に DivideByZeroException がスローされます。Decimal division by zero always throws a DivideByZeroException.

参照See Also