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

一、运算符概述

        运算符是程序进行数学运算、逻辑判断的核心工具,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=5b=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=truey=false
&&逻辑与bool c = x && y;false
||逻辑或`有成立就成立
!逻辑非bool c = !y;true

位运算符(Bitwise Operators)​

直接对整数的二进制位进行操作,常用于标志位、掩码运算。

运算符说明示例代码二进制运算过程(以a=0b1010b=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. 位移运算溢出
int x = 1 << 31; // 对于32位int,结果为-2147483648(溢出)

五、避坑指南

  1. 整数除法陷阱:10/4=2,需显式转换为浮点
  2. 运算符优先级x = 5 + 3 * 2; → 11,而非16
  3. 浮点精度问题:避免用==直接比较浮点数
  4. 自增时序:循环中使用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用户" : "用户");

注意:

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

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

  3. 预分配机制 StringBuilder通过char数组减少扩容次数

附录:

C#中常用的格式说明符(Format Specifiers)​及其用法的详细分类表格:

一、数字格式说明符

格式符名称描述示例输入(值=1234.56)输出示例(默认区域)适用类型
CCurrency货币格式(带符号)1234.56.ToString("C2")¥1,234.56数值类型
DDecimal整数补零(仅整数)123.ToString("D6")000123仅整数类型
EExponential科学计数法1234.56.ToString("E2")1.23E+003浮点数/双精度
FFixed Point定点数(指定小数位)1234.56.ToString("F1")1234.6数值类型
GGeneral自动选择最紧凑格式1234.5.ToString("G")1234.5所有数值类型
NNumber带千位分隔符1234.56.ToString("N0")1,235数值类型
PPercent百分比格式0.123.ToString("P1")12.3%数值类型
XHexadecimal十六进制(大小写敏感)255.ToString("X4")00FF仅整数类型

二、日期时间格式说明符

格式符示例输出(日期=2023-10-5 14:30:00)描述
d2023/10/5短日期格式
D2023年10月5日长日期格式
t14:30短时间格式
T14:30:00长时间格式
f2023年10月5日 14:30长日期+短时间(组合)
F2023年10月5日 14:30:00完整日期时间
g2023/10/5 14:30通用短格式
G2023/10/5 14:30:00通用长格式
m10月5日月日格式
y2023年10月年月格式
s2023-10-05T14:30:00ISO 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值