大家在学习C#的过程中,运算符也是我们学习路上非常重要的存在,比如说运算的“+、-、*、/”,又比如逻辑判断的“|、&”等等,这些都组成了我们C#语言的运算符。
一、C#算术运算符
在 C# 中,算术运算符通常用于执行数学运算。以下是 C# 支持算术运算符,让我们一起来看看:
加法运算符 +
- 用于将两个数相加。
- 也可以用于字符串连接。
int a = 5; int b = 3; int sum = a + b; // 8 string greeting = "Hello, " + "world!"; // "Hello, world!"
减法运算符 -
- 用于从一个数中减去另一个数。
int a = 5;
int b = 3;
int difference = a - b; // 2
乘法运算符 *
- 用于将两个数相乘。
int a = 5;
int b = 3;
int product = a * b; // 15
除法运算符 /
- 用于将一个数除以另一个数。
- 用于将一个整数除以另一个整数,如果定义为int,那么返回结果也为整数。
int a = 5;
int b = 3;
double quotient = (double)a / b; // 1.6666666666666667
int quotient2 = a / b; // 1
模运算符 %(取余)
- 用于求两个数相除的余数。
int a = 5;
int b = 3;
int remainder = a % b; // 2
幂运算符 ^
- 用于计算一个数的另一个数次幂。
- 注意:这不是一个标准的 C# 算术运算符,需要
using System;
命名空间。
int baseNum = 2;
int exponent = 3;
int result = (int)Math.Pow(baseNum, exponent); // 8
递增运算符 ++
- 用于将变量的值增加一。
int a = 5;
a++; // a 现在是 6
递减运算符 --
- 用于将变量的值减少一。
int a = 5;
a--; // a 现在是 4
算术运算符的优先级
在 C# 中,算术运算符的优先级决定了在没有括号指定顺序的情况下,表达式中运算符的执行顺序。从最高到最低:
-
幂运算符
^
(表示幂运算,不是位异或)- 幂运算符的优先级最高,它会在其他算术运算之前执行。
-
一元加减运算符
+
,-
(表示正负号)- 一元加和一元减运算符(用于改变一个数的符号)也具有高优先级。
-
乘法、除法和整除运算符
*
,/
,%
- 这三个运算符优先级相同,按照从左到右的顺序执行。
-
加法和减法运算符
+
,-
(表示数值相加减)- 这两个运算符优先级相同,按照从左到右的顺序执行。
以下给大家做了个例子:
int a = 10;
int b = 5;
int c = 3;
// 正确的运算顺序是先幂运算,然后乘法,最后加法
int result1 = a + b * c; // 等价于 int result1 = a + (b * c);
// 正确的结果是 10 + (5 * 3) = 10 + 15 = 25
// 如果使用括号改变优先级
int result2 = (a + b) * c; // 等价于 int result2 = (10 + 5) * 3;
// 正确的结果是 (10 + 5) * 3 = 15 * 3 = 45
// 幂运算符优先级最高
int result3 = a + b ^ c; // 等价于 int result3 = a + (b ^ c);
// 正确的结果是 10 + (5 ^ 3),如果使用位异或运算符,则需要使用括号
// 正确的结果是 10 + (5 ^ 3) = 10 + 6 = 16
// 一元运算符
int result4 = -a + b; // 等价于 int result4 = (-a) + b;
// 正确的结果是 -10 + 5 = -5
为了确保表达式按照预期的方式执行,可以使用括号 ()
来明确指定运算顺序,这样可以覆盖默认的优先级规则。这是一个好的编程习惯,特别是在复杂的表达式中,使用括号可以提高代码的可读性和正确性。
二、关系运算符
关系运算符也是C#很常用的运算符,用于比较两个值,并返回布尔值(true
或 false
)。以下是 C# 中的关系运算符:
等于 ==
- 检查两个值是否相等。
bool isEqual = (a == b); // 如果 a 和 b 相等,则返回 true
不等于 !=
- 检查两个值是否不相等。
bool isNotEqual = (a != b); // 如果 a 和 b 不相等,则返回 true
大于 >
- 检查左侧的值是否大于右侧的值。
bool isGreaterThan = (a > b); // 如果 a 大于 b,则返回 true
小于 <
- 检查左侧的值是否小于右侧的值。
bool isLessThan = (a < b); // 如果 a 小于 b,则返回 true
大于等于 >=
- 检查左侧的值是否大于或等于右侧的值。
bool isGreaterThanOrEqual = (a >= b); // 如果 a 大于或等于 b,则返回 true
小于等于 <=
- 检查左侧的值是否小于或等于右侧的值。
bool isLessThanOrEqual = (a <= b); // 如果 a 小于或等于 b,则返回 true
这些关系运算符用于所有可比较的类型,包括数值类型(如 int
、double
、decimal
)、枚举类型以及字符串类型。它们在条件语句(如 if
)、循环(如for
、while
等)和其他逻辑表达式中经常使用。
请注意,==
和 !=
运算符也可以用于比较对象的引用是否指向同一位置(即是否是同一个对象的引用),而不仅仅是比较它们的值。对于值类型的比较,它们会比较值是否相等;对于引用类型的比较,它们会比较引用是否相同。如果需要比较对象的内容是否相等,通常需要重写 Equals
方法或使用 SequenceEqual
方法(对于集合类型)。
关系运算符使用案例:
int x = 15;
int y = 20;
// 使用关系运算符在 if 语句中
if (x < y) {
Console.WriteLine("x is less than y"); // 输出
}
// 在 for 循环中使用
for (int i = 0; i < 5; i++) {
Console.WriteLine(i);
}
// 在逻辑表达式中使用
bool result = (x > 10) && (y < 30);
三、逻辑运算符
它用于结合两个布尔表达式,并返回一个布尔值(true
或 false
)。以下逻辑运算符:
逻辑与 &&
- 当且仅当两个操作数都为
true
时,结果才为true
。它是短路运算符,如果第一个操作数为false
,则第二个操作数不会执行。
bool result = (condition1 && condition2);
// 如果 condition1 和 condition2 都为 true,则 result 为 true
逻辑或 ||
- 如果两个操作数中至少有一个为
true
,则结果为true
。它也是短路运算符,如果第一个操作数为true
,则第二个操作数不会执行。
bool result = (condition1 || condition2);
// 如果 condition1 或 condition2 至少一个为 true,则 result 为 true
逻辑非 !
- 反转操作数的布尔值,如果操作数为
true
,则结果为false
;如果为false
,则结果为true
。
bool result = !condition;
// 如果 condition 为 false,则 result 为 true
逻辑运算符通常用于条件语句(如 if
、while
等)和复杂的逻辑表达式中。短路逻辑运算符 &&
和 ||
的特点是,如果第一个操作数足以确定整个表达式的结果,那么第二个操作数不会被求值。这可以防止不必要的计算,并在某些情况下避免运行时错误。
逻辑运算符的使用案例:
bool a = true;
bool b = false;
// 逻辑与
bool andResult = a && b; // false,因为 b 为 false
// 逻辑或
bool orResult = a || b; // true,因为 a 为 true
// 逻辑非
bool notResult = !a; // false,因为 a 为 true
逻辑运算符是控制程序流程和实现复杂逻辑条件的重要工具。
四、赋值运算符
赋值运算符用于将值赋给变量,最常见的“=”就是赋值运算符
简单赋值 =
- 将右侧表达式的值赋给左侧的变量。
int myNumber = 10; // 将整数 10 赋值给变量 myNumber
string myString = "Hello"; // 将字符串 "Hello" 赋值给变量 myString
复合赋值
结合了算术运算符和赋值运算符,用于将左侧变量与右侧表达式的结果相加减乘除后,再赋值回左侧变量。
加法赋值 +=
int a = 5;
a += 3; // 等同于 a = a + 3; 结果是 a = 8
减法赋值 -=
int a = 5;
a -= 3; // 等同于 a = a - 3; 结果是 a = 2
乘法赋值 *=
int a = 5;
a *= 3; // 等同于 a = a * 3; 结果是 a = 15
除法赋值 /=
int a = 10;
a /= 2; // 等同于 a = a / 2; 结果是 a = 5
模赋值 %=
int a = 10;
a %= 3; // 等同于 a = a % 3; 结果是 a = 1
位左移赋值 <<=
int a = 1;
a <<= 2; // 等同于 a = a << 2; 结果是 a = 4 (二进制左移两位)
位右移赋值 >>=
int a = 4;
a >>= 1; // 等同于 a = a >> 1; 结果是 a = 2 (二进制右移一位)
位与赋值 &=
int a = 0b1010;
int b = 0b1100;
a &= b; // 等同于 a = a & b; 结果是 a = 0b1000
位或赋值 |=
int a = 0b1010;
int b = 0b1100;
a |= b; // 等同于 a = a | b; 结果是 a = 0b1110
位异或赋值 ^=
int a = 0b1010;
int b = 0b1100;
a ^= b; // 等同于 a = a ^ b; 结果是 a = 0b0110
复合赋值运算符提供了一种快捷方式,可以在单个语句中执行运算和赋值操作。这在需要迭代变量或在循环中更新变量值时非常有用。
请注意,对于浮点数和整数的除法赋值,如果左侧变量是整数类型,那么结果将执行整数除法,即使右侧表达式的结果是一个浮点数。如果需要浮点结果,应该确保至少有一个操作数是浮点类型:
int a = 10;
a /= 3; // 结果是 3,因为整数除法
a = 10;
a = a / 3.0; // 结果是 3.333333,因为使用了浮点数 3.0
赋值运算符是编程中最基本的操作之一,用于在程序中存储和更新数据。