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

相关推荐
Java版蜡笔小新2 分钟前
数字与静态
java·开发语言·学习
哦豁灬25 分钟前
基于香橙派 KunpengPro学习CANN(2)——Ascend Extension for PyTorch 配置与安装
人工智能·pytorch·学习·ascend
不会编程的懒洋洋1 小时前
软考笔记——计算机系统知识
笔记·学习·软考·计算机系统
勤奋的小笼包1 小时前
【论文阅读】FairCLIP - 医疗视觉语言学习中的公平性提升
论文阅读·人工智能·笔记·学习·语言模型·自然语言处理·chatgpt
Running小学生2 小时前
使用cartographer扩展地图
笔记·学习
月临水3 小时前
SpringCloud 学习笔记3(OpenFeign)
笔记·学习·spring cloud
朝九晚五ฺ3 小时前
【算法学习】位运算篇:位运算相关算法详解
数据结构·c++·学习·算法
虾球xz3 小时前
游戏引擎学习第160天
java·学习·游戏引擎
笨鸟先飞的橘猫4 小时前
lua学习(三)
学习·lua