C#入门学习记录(四)C#运算符详解:掌握算术与条件运算符的必备技巧+字符串拼接

一、运算符概述

运算符是程序进行数学运算、逻辑判断的核心工具,C#中的运算符分为:

cs 复制代码
算术运算符 → 数学计算(+ - * / %)
条件运算符 → 三目判断(?:)
关系运算符 → 比较大小(> < ==)
逻辑运算符 → 逻辑判断(&& || !)
赋值运算符 → 赋值操作(= +=)

二、算术运算符深度解析

1. 基础运算符

cs 复制代码
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. 特殊运算符技巧

cs 复制代码
// 自增自减(前缀/后缀差异)
int x = 5;
Console.WriteLine(x++); // 输出5,后变为6
Console.WriteLine(++x); // 变为7,后输出7

// 复合赋值
int y = 10;
y += 3;  // 等价于 y = y + 3 → 13

3. 浮点运算陷阱

cs 复制代码
double val = 10 / 3;     // 错误!结果为3.0(整数运算后转double)
double correctVal = 10.0 / 3; // 正确:3.333...

三、条件运算符?: 的三层境界

1. 基础用法

如果为?:问号前面的条件为true,则去:左边的值反之为右边的

cs 复制代码
int max = (a > b) ? a : b; // 取较大值
string msg = (score >= 60) ? "合格" : "不合格";

2. 嵌套使用(需谨慎)

cs 复制代码
// 判断数字正负性
string sign = (num > 0) ? "正数" : 
              (num < 0) ? "负数" : "零";

等价于:

cs 复制代码
string sign;
if (num > 0) 
{
    sign = "正数";
}
else 
{
    if (num < 0) 
    {
        sign = "负数";
    }
    else 
    {
        sign = "零";
    }
}

3. 与null合并符结合

这个和上篇文章介绍的一样,就是一个判空的作用

cs 复制代码
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)

注意事项:

  1. 位运算 vs 逻辑运算

    • 位运算符(&, |)操作的是整数的二进制位
    • 逻辑运算符(&&, ||)操作的是布尔值
  2. 位移运算溢出

cs 复制代码
int x = 1 << 31; // 对于32位int,结果为-2147483648(溢出)

五、避坑指南

  1. 整数除法陷阱:10/4=2,需显式转换为浮点
  2. 运算符优先级x = 5 + 3 * 2; → 11,而非16
  3. 浮点精度问题:避免用==直接比较浮点数
  4. 自增时序:循环中使用i++与++i可能影响结果

六、字符串拼接相关

一、基础拼接方法

1. + 运算符(最常用)
cs 复制代码
string name = "Alice";
int age = 28;

// 简单拼接
string info1 = "姓名:" + name + ",年龄:" + age; 

// 混合类型自动转换
Console.WriteLine("ID:" + 1001 + " Score:" + 95.5); 
2. String.Concat 方法
cs 复制代码
// 多参数拼接
string fullName = String.Concat("张", "三", "丰"); 

// 数组合并
string[] colors = {"Red", "Green", "Blue"};
string colorStr = String.Concat(colors); // "RedGreenBlue"

二、进阶拼接方案

1. 字符串插值
cs 复制代码
// 使用$符号
string message = $"当前时间:{DateTime.Now:HH:mm:ss}";

// 支持表达式
double price = 19.99;
string display = $"折后价:{price * 0.8:C2}"; // ¥15.99
2. String.Format(格式化控制)
cs 复制代码
// 定位参数
string template = "CPU温度:{0}℃,内存使用:{1}%";
string status = String.Format(template, 65.3, 78);

// 格式规范
string hex = String.Format("0x{0:X4}", 255); // 0x00FF
3. StringBuilder(高频操作必备)

这块我们后面会再次遇到的!

cs 复制代码
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
cs 复制代码
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查询命令。等用到的时候再去查询就是

cs 复制代码
string sql = $@"SELECT *
FROM Users
WHERE Age > {minAge} 
  AND City = '{city}'";
3. 条件拼接
cs 复制代码
string welcome = "欢迎" + (isVIP ? "尊贵的VIP用户" : "用户");

注意:

  1. 字符串不可变性每次拼接都会创建新字符串对象,原对象成为垃圾(不过C#自己有垃圾回收机制GC不用自己手动释放)

  2. 内存碎片问题大量小字符串拼接会导致内存碎片

  3. 预分配机制 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

相关推荐
Chef_Chen4 小时前
从0开始学习R语言--Day18--分类变量关联性检验
学习
键盘敲没电4 小时前
【IOS】GCD学习
学习·ios·objective-c·xcode
海的诗篇_5 小时前
前端开发面试题总结-JavaScript篇(一)
开发语言·前端·javascript·学习·面试
AgilityBaby5 小时前
UE5 2D角色PaperZD插件动画状态机学习笔记
笔记·学习·ue5
AgilityBaby5 小时前
UE5 创建2D角色帧动画学习笔记
笔记·学习·ue5
武昌库里写JAVA6 小时前
iview Switch Tabs TabPane 使用提示Maximum call stack size exceeded堆栈溢出
java·开发语言·spring boot·学习·课程设计
一弓虽7 小时前
git 学习
git·学习
Moonnnn.9 小时前
【单片机期末】串行口循环缓冲区发送
笔记·单片机·嵌入式硬件·学习
viperrrrrrrrrr710 小时前
大数据学习(131)-Hive数据分析函数总结
大数据·hive·学习
fen_fen10 小时前
学习笔记(26):线性代数-张量的降维求和,简单示例
笔记·学习·算法