int a = 5, b, c;
// 后置:先使用原值,再自增
b = a++; // b = 5, 然后 a 变成 6
// 等价于:b = a; a = a + 1;
// 前置:先自增,再使用新值
a = 5;
c = ++a; // a 先变成 6,然后 c = 6
// 等价于:a = a + 1; c = a;
// 自减同理
int d = 5;
Console.WriteLine(d--); // 输出 5,然后 d = 4
Console.WriteLine(--d); // d 先变成 3,输出 3
复合赋值运算符
运算符
等价写法
说明
+=
a = a + b
加后赋值
-=
a = a - b
减后赋值
*=
a = a* b
乘后赋值
/=
a = a / b
除后赋值
%=
a = a % b
取模后赋值
代码如下
int num = 10;
num += 5; // num = 15
num -= 3; // num = 12
num *= 2; // num = 24
num /= 4; // num = 6
num %= 4; // num = 2
// 字符串也支持 +=
string msg = "Hello";
msg += " World"; // "Hello World"
运算符优先级
优先级
运算符
结合性
1(最高)
++ -- (后置)
从左到右
2
++ -- (前置) + - (正负号)
从右到左
3
* / %
从左到右
4
+ -
从左到右
5
= += -= 等
从右到左
举例如下
int result = 10 + 5 * 2; // 20,先乘后加
int result2 = (10 + 5) * 2; // 30,括号优先
// 复杂示例
int a = 5, b = 3, c = 2;
int r = a + b * c - a / c; // 5 + 6 - 2 = 9
// 陷阱1:整数溢出
int max = int.MaxValue; // 2147483647
max = max + 1; // 变成 -2147483648(溢出)
// 陷阱2:除零异常
int a = 10, b = 0;
// int c = a / b; // 抛出 DivideByZeroException
// 陷阱3:浮点精度
double d = 0.1 + 0.2;
Console.WriteLine(d == 0.3); // False!d = 0.30000000000000004
Console.WriteLine(Math.Abs(d - 0.3) < 0.0001); // True,用误差判断
// 陷阱4:decimal 精度准确
decimal m = 0.1m + 0.2m;
Console.WriteLine(m == 0.3m); // True!
类型提升规则
// 运算时,类型会自动向"更大"的类型提升
int a = 10;
double b = 3.5;
var result = a + b; // result 是 double 类型
// 混合运算
int x = 5;
float y = 2f;
decimal z = 3m;
// var r = x + y + z; // 编译错误!float 和 decimal 不能混合
评论区