C# 运算符
演算子は、コンパイラに特定の数学的または論理的な操作を実行するように指示する記号です。C# には豊富な組み込み演算子があり、次のように分類されます。
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 其他运算符
このチュートリアルでは、算術演算子、関係演算子、論理演算子、ビット演算子、代入演算子、およびその他の演算子について順に説明します。
算术运算符
次の表は、C# がサポートするすべての算術演算子を示しています。変数 A、B を仮定します。Aの値は10、変数Bの値は20、その場合:
| 运算符 | 描述 | 实例 |
|---|---|---|
| + | 2つのオペランドを加算する | A + B は 30 になります |
| - | 最初のオペランドから2番目のオペランドを減算します。 | A - B は -10 になります |
| * | 2つのオペランドを乗算する | A * B は 200 になります |
| / | 分子を分母で割る | B / A は 2 になります |
| % | 剰余演算子。除算後の余り | B % A は 0 になります |
| ++ | インクリメント演算子。整数値を1増加させる | A++ は 11 になります |
| -- | デクリメント演算子。整数値を1減少させる | A-- は 9 になります |
实例
次の例を見て、C# で使用可能なすべての算術演算子を理解してください:
实例
namespace OperatorsAppl
{
class Program
{
static void Main(string[] args)
{
int a = 21;
int b = 10;
int c;
c = a + b;
Console.WriteLine("Line 1 - c の値は {0}", c);
c = a - b;
Console.WriteLine("Line 2 - c の値は {0}", c);
c = a * b;
Console.WriteLine("Line 3 - c の値は {0}", c);
c = a / b;
Console.WriteLine("Line 4 - c の値は {0}", c);
c = a % b;
Console.WriteLine(Line 5 - c の値は {0}, c);
// ++a 先进行自增运算再赋值
c = ++a;
Console.WriteLine(Line 6 - c の値は {0}, c);
// このとき、aの値は22です
// --a 先进行自减运算再赋值
c = --a;
Console.WriteLine(Line 7 - c の値は {0}, c);
Console.ReadLine();
}
}
}
上記のコードがコンパイルおよび実行されると、次の結果が生成されます:
Line 1 - c 的值是 31 Line 2 - c 的值是 11 Line 3 - c 的值是 210 Line 4 - c 的值是 2 Line 5 - c 的值是 1 Line 6 - c 的值是 22 Line 7 - c 的值是 21
- c = a++: 最初に a を c に代入し、その後 a をインクリメントします。
- c = ++a: 最初に a をインクリメントし、その後 a を c に代入します。
- c = a--: 最初に a を c に代入し、その後 a をデクリメントします。
- c = --a: 最初に a をデクリメントし、その後 a を c に代入します。
实例
namespace OperatorsAppl
{
class Program
{
static void Main(string[] args)
{
int a = 1;
int b;
// a++ 先赋值再进行自增运算
b = a++;
Console.WriteLine("a = {0}", a);
Console.WriteLine("b = {0}", b);
Console.ReadLine();
// ++a 先进行自增运算再赋值
a = 1; // 重新初始化 a
b = ++a;
Console.WriteLine("a = {0}", a);
Console.WriteLine("b = {0}", b);
Console.ReadLine();
// a-- 先赋值再进行自减运算
a = 1; // 重新初始化 a
b= a--;
Console.WriteLine("a = {0}", a);
Console.WriteLine("b = {0}", b);
Console.ReadLine();
// --a 先进行自减运算再赋值
a = 1; // 重新初始化 a
b= --a;
Console.WriteLine("a = {0}", a);
Console.WriteLine("b = {0}", b);
Console.ReadLine();
}
}
}
上記のプログラムを実行すると、出力結果は次のようになります:
a = 2 b = 1 a = 2 b = 2 a = 0 b = 1 a = 0 b = 0
关系运算符
次の表は、C# がサポートするすべての関係演算子を示しています。変数 A、B を仮定します。Aの値は10、変数Bの値は20、その場合:
| 运算符 | 描述 | 实例 |
|---|---|---|
| == | 2つのオペランドの値が等しいかどうかをチェックし、等しい場合は条件が真になります。 | (A == B) は真ではありません。 |
| != | 2つのオペランドの値が等しいかどうかをチェックし、等しくない場合は条件が真になります。 | (A != B) は真です。 |
| > | 左オペランドの値が右オペランドの値より大きいかどうかをチェックし、大きい場合は条件が真になります。 | (A > B) は真ではありません。 |
| < | 左オペランドの値が右オペランドの値より小さいかどうかをチェックし、小さい場合は条件が真になります。 | (A < B) は真である。 |
| >= | 左オペランドの値が右オペランドの値以上かどうかをチェックし、そうである場合は条件が真になります。 | (A >= B) は真ではありません。 |
| <= | 左オペランドの値が右オペランドの値以下かどうかをチェックし、そうである場合は条件が真になります。 | (A <= B) は真である。 |
实例
次の例を見て、C# で使用可能なすべての関係演算子を理解してください:
实例
class Program
{
static void Main(string[] args)
{
int a = 21;
int b = 10;
if (a == b)
{
Console.WriteLine("Line 1 - a 等于 b");
}
else
{
Console.WriteLine("Line 1 - a 不等于 b");
}
if (a < b)
{
Console.WriteLine("Line 2 - a 小于 b");
}
else
{
Console.WriteLine("Line 2 - a 不小于 b");
}
if (a > b)
{
Console.WriteLine("Line 3 - a 大于 b");
}
else
{
Console.WriteLine("Line 3 - a 不大于 b");
}
/* a と b の値を変更する */
a = 5;
b = 20;
if (a <= b)
{
Console.WriteLine("Line 4 - a 小于或等于 b");
}
if (b >= a)
{
Console.WriteLine("Line 5 - b 大于或等于 a");
}
}
}
上記のコードがコンパイルおよび実行されると、次の結果が生成されます:
Line 1 - a 不等于 b Line 2 - a 不小于 b Line 3 - a 大于 b Line 4 - a 小于或等于 b Line 5 - b 大于或等于 a
逻辑运算符
次の表は、C# がサポートするすべての論理演算子を示しています。変数 A、B を仮定します。Aはブール値 true、変数Bはブール値 false、その場合:
| 运算符 | 描述 | 实例 |
|---|---|---|
| && | 論理積演算子と呼ばれます。両方のオペランドが非ゼロの場合、条件は真になります。 | (A && B) は偽である。 |
| || | 論理和演算子と呼ばれます。2つのオペランドのいずれかが非ゼロの場合、条件は真になります。 | (A || B) は真である。 |
| ! | 論理否定演算子と呼ばれます。オペランドの論理状態を逆転させるために使用します。条件が真の場合、論理否定演算子はそれを偽にします。 | !(A && B) は真です。 |
实例
次の例を見て、C# で使用可能なすべての論理演算子を理解してください:
实例
namespace OperatorsAppl
{
class Program
{
static void Main(string[] args)
{
bool a = true;
bool b = true;
if (a && b)
{
Console.WriteLine(Line 1 - 条件が真);
}
if (a || b)
{
Console.WriteLine(Line 2 - 条件が真);
}
/* a と b の値を変更する */
a = false;
b = true;
if (a && b)
{
Console.WriteLine(Line 3 - 条件が真);
}
else
{
Console.WriteLine("Line 3 - 条件が真ではありません");
}
if (!(a && b))
{
Console.WriteLine(Line 4 - 条件が真);
}
Console.ReadLine();
}
}
}
上記のコードがコンパイルおよび実行されると、次の結果が生成されます:
Line 1 - 条件为真 Line 2 - 条件为真 Line 3 - 条件不为真 Line 4 - 条件为真
位运算符
ビット演算子はビットに対して作用し、ビット単位で操作を実行します。&、|、^ の真理値表は次のとおりです。
| p | q | p & q | p | q | p ^ q |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
| 1 | 0 | 0 | 1 | 1 |
A = 60、B = 13 と仮定します。2進数形式で表すと、次のようになります。
A = 0011 1100
B = 0000 1101
-----------------
A&B = 0000 1100
A|B = 0011 1101
A^B = 0011 0001
~A = 1100 0011
次の表は、C# がサポートするビット演算子を示しています。変数 A=60、B=13 を仮定します。Aの値は60、変数Bの値は13、その場合:
| 运算符 | 描述 | 实例 |
|---|---|---|
| & | 両方のオペランドに存在する場合、バイナリ AND 演算子は1ビットを結果にコピーします。 | (A & B) は 12、すなわち 0000 1100 になります |
| | | いずれかのオペランドに存在する場合、バイナリ OR 演算子は1ビットを結果にコピーします。 | (A | B) は 61、すなわち 0011 1101 になります |
| ^ | いずれか一方のオペランドに存在するが両方には存在しない場合、バイナリ XOR 演算子は1ビットを結果にコピーします。 | (A ^ B) は 49、すなわち 0011 0001 になります |
| ~ | ビット否定演算子は単項演算子であり、ビットを「反転」させる効果があります。つまり、0 は 1 に、1 は 0 になります。符号ビットも含みます。 | (~A) は -61 になります。これは 1100 0011、つまり符号付き2進数の補数形式です。 |
| << | 2進左シフト演算子。左オペランドの値を、右オペランドで指定されたビット数だけ左にシフトします。 | A << 2 は 240、すなわち 1111 0000 になります |
| >> | 2進右シフト演算子。左オペランドの値を、右オペランドで指定されたビット数だけ右にシフトします。 | A >> 2 は 15、すなわち 0000 1111 になります |
实例
次の例を見て、C# で使用可能なすべてのビット演算子を理解してください:
实例
namespace OperatorsAppl
{
class Program
{
static void Main(string[] args)
{
int a = 60; /* 60 = 0011 1100 */
int b = 13; /* 13 = 0000 1101 */
int c = 0;
c = a & b; /* 12 = 0000 1100 */
Console.WriteLine("Line 1 - c の値は {0}", c );
c = a | b; /* 61 = 0011 1101 */
Console.WriteLine("Line 2 - c の値は {0}", c);
c = a ^ b; /* 49 = 0011 0001 */
Console.WriteLine("Line 3 - c の値は {0}", c);
c = ~a; /*-61 = 1100 0011 */
Console.WriteLine("Line 4 - c の値は {0}", c);
c = a << 2; /* 240 = 1111 0000 */
Console.WriteLine(Line 5 - c の値は {0}, c);
c = a >> 2; /* 15 = 0000 1111 */
Console.WriteLine(Line 6 - c の値は {0}, c);
Console.ReadLine();
}
}
}
上記のコードがコンパイルおよび実行されると、次の結果が生成されます:
Line 1 - c 的值是 12 Line 2 - c 的值是 61 Line 3 - c 的值是 49 Line 4 - c 的值是 -61 Line 5 - c 的值是 240 Line 6 - c 的值是 15
赋值运算符
次の表は、C# がサポートする代入演算子を示しています。
| 运算符 | 描述 | 实例 |
|---|---|---|
| = | 単純な代入演算子。右オペランドの値を左オペランドに代入します。 | C = A + B は A + B の値を C に代入します |
| += | 加算代入演算子。右のオペランドと左のオペランドを加算した結果を左のオペランドに代入します。 | C += A 相当于 C = C + A |
| -= | 減算代入演算子。左のオペランドから右のオペランドを減算した結果を左のオペランドに代入します。 | C -= A 相当于 C = C - A |
| *= | 乗算代入演算子。右のオペランドに左のオペランドを乗算した結果を左のオペランドに代入します。 | C *= A 相当于 C = C * A |
| /= | 除算代入演算子。左のオペランドを右のオペランドで除算した結果を左のオペランドに代入します。 | C /= A 相当于 C = C / A |
| %= | 剰余代入演算子。2つのオペランドの剰余を求め、左オペランドに代入します。 | C %= A 相当于 C = C % A |
| <<= | 左シフト代入演算子 | C <<= 2 等同于 C = C << 2 |
| >>= | 右シフト代入演算子 | C >>= 2 等同于 C = C >> 2 |
| &= | ビット論理積代入演算子 | C &= 2 等同于 C = C & 2 |
| ^= | ビットごとの XOR 代入演算子 | C ^= 2 等同于 C = C ^ 2 |
| |= | ビット論理和代入演算子 | C |= 2 等同于 C = C | 2 |
实例
次の例を見て、C# で使用可能なすべての代入演算子を理解してください:
实例
namespace OperatorsAppl
{
class Program
{
static void Main(string[] args)
{
int a = 21;
int c;
c = a;
Console.WriteLine(Line 1 - = c の値 = {0}, c);
c += a;
Console.WriteLine(Line 2 - += c の値 = {0}, c);
c -= a;
Console.WriteLine(Line 3 - -= c の値 = {0}, c);
c *= a;
Console.WriteLine(Line 4 - *= c の値 = {0}, c);
c /= a;
Console.WriteLine(Line 5 - /= c の値 = {0}, c);
c = 200;
c %= a;
Console.WriteLine(Line 6 - %= c の値 = {0}, c);
c <<= 2;
Console.WriteLine("Line 7 - <<= c の値 = {0}", c);
c >>= 2;
Console.WriteLine(Line 8 - >>= c の値 = {0}, c);
c &= 2;
Console.WriteLine(Line 9 - &= c の値 = {0}, c);
c ^= 2;
Console.WriteLine(Line 10 - ^= c の値 = {0}, c);
c |= 2;
Console.WriteLine(Line 11 - |= c の値 = {0}, c);
Console.ReadLine();
}
}
}
上記のコードがコンパイルおよび実行されると、次の結果が生成されます:
Line 1 - = c 的值 = 21 Line 2 - += c 的值 = 42 Line 3 - -= c 的值 = 21 Line 4 - *= c 的值 = 441 Line 5 - /= c 的值 = 21 Line 6 - %= c 的值 = 11 Line 7 - <<= c 的值 = 44 Line 8 - >>= c 的值 = 11 Line 9 - &= c 的值 = 2 Line 10 - ^= c 的值 = 0 Line 11 - |= c 的值 = 2
其他运算符
次の表は、C# がサポートするその他の重要な演算子の一部を示しています。含まれるものは次のとおりです。sizeof、typeofと? :。
| 运算符 | 描述 | 实例 |
|---|---|---|
| sizeof() | データ型のサイズを返します。 | sizeof(int),将返回 4. |
| typeof() | class のタイプを返します。 | typeof(StreamReader); |
| & | 変数のアドレスを返します。 | &a は変数の実際のアドレスを取得します。 |
| * | 変数のポインタ。 | *a; は変数を指します。 |
| ? : | 条件表达式 | 条件が真の場合 ? なら X : そうでなければ Y |
| is | オブジェクトが特定の型であるかどうかを判定します。 | If( Ford is Car) // Ford が Car クラスのオブジェクトかどうかをチェックします。 |
| as | キャスト変換。変換に失敗しても例外はスローされません。 | Object obj = new StringReader("Hello"); StringReader r = obj as StringReader; |
实例
实例
namespace OperatorsAppl
{
class Program
{
static void Main(string[] args)
{
/* sizeof 演算子の例 */
Console.WriteLine("int のサイズは {0}", sizeof(int));
Console.WriteLine("short のサイズは {0}", sizeof(short));
Console.WriteLine("double のサイズは {0}", sizeof(double));
/* 三項演算子の例 */
int a, b;
a = 10;
b = (a == 1) ? 20 : 30;
Console.WriteLine("b の値は {0}", b);
b = (a == 10) ? 20 : 30;
Console.WriteLine("b の値は {0}", b);
Console.ReadLine();
}
}
}
上記のコードがコンパイルおよび実行されると、次の結果が生成されます:
int 的大小是 4 short 的大小是 2 double 的大小是 8 b 的值是 30 b 的值是 20
typeof キーワードは、型の型オブジェクトを取得するために使用されます。通常、リフレクションや型インスタンスの動的作成に使用されます。
typeof を使用した簡単な例を次に示します。
实例
class Program
{
static void Main(string[] args)
{
Type type = typeof(string);
Console.WriteLine(type.FullName);
Console.ReadKey();
}
}
上記のコードでは、typeof キーワードを使用して string 型の型オブジェクトを取得し、それを Type 型の変数 type に格納しています。その後、FullName プロパティを使用して、その型の完全修飾名を出力しています。
上記のコードがコンパイルおよび実行されると、次の結果が生成されます:
System.String
C# における演算子の優先順位
演算子の優先順位は、式内の項の組み合わせ方を決定します。これは式の評価方法に影響します。一部の演算子は他の演算子よりも優先順位が高くなります。たとえば、乗算除算演算子は加算減算演算子よりも優先順位が高くなります。
たとえば x = 7 + 3 * 2 の場合、演算子 * は + よりも優先順位が高いため、最初に乗算 3 * 2 が計算され、その後 7 が加算されます。したがって、x には 20 ではなく 13 が代入されます。
次の表は、演算子の優先順位を高い順から低い順に示しています。優先順位の高い演算子は表の上部に表示され、優先順位の低い演算子は表の下部に表示されます。式内では、優先順位の高い演算子が先に評価されます。
優先順位の簡易まとめ: 括弧があれば括弧が先、次に乗算・除算、そして加算・減算、その後シフト、次に関係、論理が終わったら条件、最後はカンマ。, 。| 类别 | 运算符 | 结合性 |
|---|---|---|
| 后缀 | () [] -> . ++ - - | 左から右へ |
| 一元 | + - ! ~ ++ - - (type)* & sizeof | 右から左へ |
| 乘除 | * / % | 左から右へ |
| 加减 | + - | 左から右へ |
| 移位 | << >> | 左から右へ |
| 关系 | < <= > >= | 左から右へ |
| 相等 | == != | 左から右へ |
| ビット論理積 | & | 左から右へ |
| ビット排他的論理和 XOR | ^ | 左から右へ |
| 位或 OR | | | 左から右へ |
| 論理積 AND | && | 左から右へ |
| 論理和 OR | || | 左から右へ |
| 条件 | ?: | 右から左へ |
| 赋值 | = += -= *= /= %=>>= <<= &= ^= |= | 右から左へ |
| 逗号 | , | 左から右へ |
实例
实例
namespace OperatorsAppl
{
class Program
{
static void Main(string[] args)
{
int a = 20;
int b = 10;
int c = 15;
int d = 5;
int e;
e = (a + b) * c / d; // ( 30 * 15 ) / 5
Console.WriteLine((a + b) * c / d の値は {0}, e);
e = ((a + b) * c) / d; // (30 * 15 ) / 5
Console.WriteLine(((a + b) * c) / d の値は {0}, e);
e = (a + b) * (c / d); // (30) * (15/5)
Console.WriteLine((a + b) * (c / d) の値は {0}, e);
e = a + (b * c) / d; // 20 + (150/5)
Console.WriteLine(a + (b * c) / d の値は {0}, e);
Console.ReadLine();
}
}
}
上記のコードがコンパイルおよび実行されると、次の結果が生成されます:
(a + b) * c / d 的值是 90 ((a + b) * c) / d 的值是 90 (a + b) * (c / d) 的值是 90 a + (b * c) / d 的值是 50
算術演算子と代入演算子の優先順位:
实例
int result = a + b * c; // 先计算乘法,再计算加法
Console.WriteLine(result); // 输出20
result = (a + b) * c; // 先计算加法,再计算乘法
Console.WriteLine(result); // 输出30
a += b * c; // 先计算乘法,再执行加法赋值
Console.WriteLine(a); // 输出20
論理演算子の優先順位:
实例
bool a = true, b = false, c = true;
bool result = a || b && c; // 先にAND演算を計算し、その後にOR演算を計算する
Console.WriteLine(result); // 输出true
result = (a || b) && c; // 先にOR演算を計算し、その後にAND演算を計算する
Console.WriteLine(result); // 输出true
result = a || (b && c); // 先にAND演算を計算し、その後にOR演算を計算する
Console.WriteLine(result); // 输出true
条件演算子の優先順位:
实例
string result = a > b ? "a大于b" : "a不大于b"; // 先判断大小关系,再执行条件语句
Console.WriteLine(result); // 输出"a大于b"
注意:括弧は演算子の優先順位を変更できるため、実際のアプリケーションでは、可能な限り括弧を使用して演算順序を明確にし、コードの可読性と正確性を高めることをお勧めします。
其他扩展