一、运算符概述
运算符是程序进行数学运算、逻辑判断的核心工具,C#中的运算符分为:
算术运算符 → 数学计算(+ - * / %)
条件运算符 → 三目判断(?:)
关系运算符 → 比较大小(> < ==)
逻辑运算符 → 逻辑判断(&& || !)
赋值运算符 → 赋值操作(= +=)
二、算术运算符深度解析
1. 基础运算符
int a = 10 + 5; // 15(加法)
int b = 20 - 3; // 17(减法)
int c = 6 * 7; // 42(乘法)
double d = 22.0 / 7; // 3.1428...(精确除法)
int e = 22 / 7; // 3(整数截断)
int f = 25 % 7; // 4(余数计算)
2. 特殊运算符技巧
// 自增自减(前缀/后缀差异)
int x = 5;
Console.WriteLine(x++); // 输出5,后变为6
Console.WriteLine(++x); // 变为7,后输出7
// 复合赋值
int y = 10;
y += 3; // 等价于 y = y + 3 → 13
3. 浮点运算陷阱
double val = 10 / 3; // 错误!结果为3.0(整数运算后转double)
double correctVal = 10.0 / 3; // 正确:3.333...
三、条件运算符?: 的三层境界
1. 基础用法
如果为?:问号前面的条件为true,则去:左边的值反之为右边的
int max = (a > b) ? a : b; // 取较大值
string msg = (score >= 60) ? "合格" : "不合格";
2. 嵌套使用(需谨慎)
// 判断数字正负性
string sign = (num > 0) ? "正数" :
(num < 0) ? "负数" : "零";
等价于:
string sign;
if (num > 0)
{
sign = "正数";
}
else
{
if (num < 0)
{
sign = "负数";
}
else
{
sign = "零";
}
}
3. 与null合并符结合
这个和上篇文章介绍的一样,就是一个判空的作用
string name = inputName ?? "匿名用户"; // 相当于:
// string name = (inputName != null) ? inputName : "匿名";
四、其他运算符速查表
关系运算符(Comparison Operators)
用于比较两个值的大小关系,返回bool
类型结果。
运算符 | 说明 | 示例代码 | 结果(假设a=5 , b=3 ) |
---|---|---|---|
> | 大于 | bool c = a > b; | true |
< | 小于 | bool c = 2 < 1; | false |
>= | 大于等于 | bool c = a >= 5; | true |
<= | 小于等于 | if (b <= 3) { ... } | 条件成立 |
== | 等于 | if (a == 5) { ... } | 执行代码块 |
!= | 不等于 | string s = (name != null) ? name : ""; | 非空校验 |
逻辑运算符(Logical Operators)
用于组合或反转布尔逻辑,常用于条件判断。
逻辑与又称为短路运算
运算符 | 说明 | 示例代码 | 结果(假设x=true , y=false ) |
---|---|---|---|
&& | 逻辑与 | bool c = x && y; | false |
|| | 逻辑或 | ` | 有成立就成立 |
! | 逻辑非 | bool c = !y; | true |
位运算符(Bitwise Operators)
直接对整数的二进制位进行操作,常用于标志位、掩码运算。
运算符 | 说明 | 示例代码 | 二进制运算过程(以a=0b1010 , b=0b1100 为例) |
---|---|---|---|
& | 按位与 | int c = a & b; | 1010 & 1100 → 1000 (十进制8) |
| | | | 按位或 | |flags = flags |
^ | 按位异或 | int c = a ^ b; | 1010 ^ 1100 → 0110 (十进制6) |
~ | 按位取反 | int c = ~a; | ~0b1010 → 1111 0101 (补码表示) |
<< | 左移 | int c = 1 << 3; | 0b0001 → 0b1000 (十进制8) |
>> | 右移 | int c = 8 >> 2; | 0b1000 → 0b0010 (十进制2) |
注意事项:
-
位运算 vs 逻辑运算
- 位运算符(
&
,|
)操作的是整数的二进制位 - 逻辑运算符(
&&
,||
)操作的是布尔值
- 位运算符(
- 位移运算溢出
int x = 1 << 31; // 对于32位int,结果为-2147483648(溢出)
五、避坑指南
- 整数除法陷阱:10/4=2,需显式转换为浮点
- 运算符优先级:
x = 5 + 3 * 2;
→ 11,而非16 - 浮点精度问题:避免用==直接比较浮点数
- 自增时序:循环中使用i++与++i可能影响结果
六、字符串拼接相关
一、基础拼接方法
1. +
运算符(最常用)
string name = "Alice";
int age = 28;
// 简单拼接
string info1 = "姓名:" + name + ",年龄:" + age;
// 混合类型自动转换
Console.WriteLine("ID:" + 1001 + " Score:" + 95.5);
2. String.Concat
方法
// 多参数拼接
string fullName = String.Concat("张", "三", "丰");
// 数组合并
string[] colors = {"Red", "Green", "Blue"};
string colorStr = String.Concat(colors); // "RedGreenBlue"
二、进阶拼接方案
1. 字符串插值
// 使用$符号
string message = $"当前时间:{DateTime.Now:HH:mm:ss}";
// 支持表达式
double price = 19.99;
string display = $"折后价:{price * 0.8:C2}"; // ¥15.99
2. String.Format
(格式化控制)
// 定位参数
string template = "CPU温度:{0}℃,内存使用:{1}%";
string status = String.Format(template, 65.3, 78);
// 格式规范
string hex = String.Format("0x{0:X4}", 255); // 0x00FF
3. StringBuilder
(高频操作必备)
这块我们后面会再次遇到的!
using System.Text;
StringBuilder sb = new StringBuilder(1024); // 预分配容量
for(int i=0; i<100; i++){
sb.Append(i).Append(" ");
}
// 最终转换为字符串
string result = sb.ToString();
三、特殊场景处理
1. 集合拼接:String.Join
List<string> files = new List<string>{"file1.log", "file2.dat"};
// 带分隔符的拼接
string path = String.Join("; ", files);
// 数值类型转换
int[] numbers = {1,2,3};
string nums = String.Join(",", numbers); // "1,2,3"
2. 多行文本:Verbatim字符串
这个是SQL,C#通过字符串拼接生成的SQL查询命令。等用到的时候再去查询就是
string sql = $@"SELECT *
FROM Users
WHERE Age > {minAge}
AND City = '{city}'";
3. 条件拼接
string welcome = "欢迎" + (isVIP ? "尊贵的VIP用户" : "用户");
注意:
-
字符串不可变性 每次拼接都会创建新字符串对象,原对象成为垃圾(不过C#自己有垃圾回收机制GC不用自己手动释放)
-
内存碎片问题 大量小字符串拼接会导致内存碎片
-
预分配机制
StringBuilder
通过char数组减少扩容次数
附录:
C#中常用的格式说明符(Format Specifiers)及其用法的详细分类表格:
一、数字格式说明符
格式符 | 名称 | 描述 | 示例输入(值=1234.56) | 输出示例(默认区域) | 适用类型 |
---|---|---|---|---|---|
C | Currency | 货币格式(带符号) | 1234.56.ToString("C2") | ¥1,234.56 | 数值类型 |
D | Decimal | 整数补零(仅整数) | 123.ToString("D6") | 000123 | 仅整数类型 |
E | Exponential | 科学计数法 | 1234.56.ToString("E2") | 1.23E+003 | 浮点数/双精度 |
F | Fixed Point | 定点数(指定小数位) | 1234.56.ToString("F1") | 1234.6 | 数值类型 |
G | General | 自动选择最紧凑格式 | 1234.5.ToString("G") | 1234.5 | 所有数值类型 |
N | Number | 带千位分隔符 | 1234.56.ToString("N0") | 1,235 | 数值类型 |
P | Percent | 百分比格式 | 0.123.ToString("P1") | 12.3% | 数值类型 |
X | Hexadecimal | 十六进制(大小写敏感) | 255.ToString("X4") | 00FF | 仅整数类型 |
二、日期时间格式说明符
格式符 | 示例输出(日期=2023-10-5 14:30:00) | 描述 |
---|---|---|
d | 2023/10/5 | 短日期格式 |
D | 2023年10月5日 | 长日期格式 |
t | 14:30 | 短时间格式 |
T | 14:30:00 | 长时间格式 |
f | 2023年10月5日 14:30 | 长日期+短时间(组合) |
F | 2023年10月5日 14:30:00 | 完整日期时间 |
g | 2023/10/5 14:30 | 通用短格式 |
G | 2023/10/5 14:30:00 | 通用长格式 |
m | 10月5日 | 月日格式 |
y | 2023年10月 | 年月格式 |
s | 2023-10-05T14:30:00 | ISO 8601 可排序格式 |
三、自定义格式符
符号 | 作用 | 示例(值=1234.5) | 输出结果 |
---|---|---|---|
0 | 强制数字占位符 | 1234.5.ToString("00000.00") | 01234.50 |
# | 可选数字占位符 | 1234.5.ToString("#####.##") | 1234.5 |
. | 小数点 | 1234.ToString("0.000") | 1234.000 |
, | 千位分隔符/比例缩放 | 1234567.ToString("#,#") | 1,234,567 |
% | 百分比乘数(自动×100) | 0.123.ToString("0.0%") | 12.3% |
; | 分节符(正数/负数/零格式) | 1234.5.ToString("+0.0;-0.0;零") | +1234.5 |
完整格式说明符文档可参考微软官方文档:
标准数字格式字符串 - .NET | Microsoft Learn
自定义数字格式字符串 - .NET | Microsoft Learn