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=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
相关文章:
C#入门学习记录(四)C#运算符详解:掌握算术与条件运算符的必备技巧+字符串拼接
一、运算符概述 运算符是程序进行数学运算、逻辑判断的核心工具,C#中的运算符分为: 算术运算符 → 数学计算( - * / %) 条件运算符 → 三目判断(?:) 关系运算符 → 比较大小(> < &#…...
单片机自学总结
自从工作以来,一直努力耕耘单片机,至今,颇有收获。从51单片机,PIC单片机,直到STM32,以及RTOS和Linux,几乎天天在搞:51单片机,STM8S207单片机,PY32F003单片机,…...
Unity教程(二十二)技能系统 分身技能
Unity开发2D类银河恶魔城游戏学习笔记 Unity教程(零)Unity和VS的使用相关内容 Unity教程(一)开始学习状态机 Unity教程(二)角色移动的实现 Unity教程(三)角色跳跃的实现 Unity教程&…...
HTML5扫雷游戏开发实战
HTML5扫雷游戏开发实战 这里写目录标题 HTML5扫雷游戏开发实战项目介绍技术栈项目架构1. 游戏界面设计2. 核心类设计 核心功能实现1. 游戏初始化2. 地雷布置算法3. 数字计算逻辑4. 扫雷功能实现 性能优化1. DOM操作优化2. 算法优化 项目亮点技术难点突破1. 首次点击保护2. 连锁…...
【Git学习笔记】Git分支管理策略及其结构原理分析
【Git学习笔记】Git分支管理策略及其结构原理分析 🔥个人主页:大白的编程日记 🔥专栏:Git学习笔记 文章目录 【Git学习笔记】Git分支管理策略及其结构原理分析前言一.合并冲突二. 分支管理策略2.1 分支策略2.2 bug分支2.3 删除临…...
Spring Cloud Alibaba Nacos 2023.X 配置问题
文章目录 问题现象(一)解决方法(一)问题现象(二)解决方法(二)问题现象(三)解决方法(三) 问题现象(一) Spring…...
厨卫行业供应链产销协同前中后大平台现状需求分析报告+P120(120页PPT)(文末有下载方式)
资料解读:厨卫行业供应链产销协同前中后大平台现状需求分析报告 详细资料请看本解读文章的最后内容。在当前厨卫行业竞争激烈的市场环境下,企业的发展战略和业务模式创新至关重要。本次解读的报告围绕某厨卫企业展开,深入探讨其供应链产销协同…...
我在哪,要去哪
在直播间听到一首好听的歌《我在哪,要去哪》-汤倩。 遇见的事:21~24号抽调去招生。 感受到的情绪:公假吗?给工作量吗?月工作量不够扣钱吗?报销方便吗?有事情,从来不解决后顾&#x…...
SpringBoot-2整合MyBatis以及基本的使用方法
目录 1.引入依赖 2.数据库表的创建 3.数据源的配置 4.编写pojo类 5.编写controller类 6.编写接口 7.编写接口的实现类 8.编写mapper 1.引入依赖 在pom.xml引入依赖 <!-- mysql--><dependency><groupId>com.mysql</groupId><artifac…...
本周安全速报(2025.3.11~3.17)
合规速递 01 瑞士出台新规:关基设施遭遇网络攻击需在24小时内上报 原文: https://www.bleepingcomputer.com/news/security/swiss-critical-sector-faces-new-24-hour-cyberattack-reporting-rule/ 新规要求,关键基础设施组织发现网络攻击后&…...
【css酷炫效果】纯CSS实现瀑布流加载动画
【css酷炫效果】纯CSS实现瀑布流加载动画 缘创作背景html结构css样式完整代码基础版进阶版(无限往复加载) 效果图 想直接拿走的老板,链接放在这里:https://download.csdn.net/download/u011561335/90492012 缘 创作随缘,不定时更新。 创作…...
咖啡点单小程序毕业设计(JAVA+SpringBoot+微信小程序+完整源码+论文)
✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 随着社会的快速发展和…...
网络编程套接字【端口号/TCPUDP/网络字节序/socket编程接口/UDPTCP网络实验】
网络编程套接字 0. 前言1. 认识端口号2. 认识TCP和UDP协议3. 网络字节序4. socket编程接口5. 实现一个简单的UDP网络程序5.1 需求分析5.2 头文件准备5.3 服务器端设计5.4 客户端设计5.5 本地测试5.6 跨网络测试5.7 UDP小应用——客户端输入命令,服务器端执行 6. 地址…...
【c++】内存序 和 内存一致性模型
c 11 中为了支持并发,定义了内存序和内存一致性模型。这个概念听起来非常高深,好像是在多线程编程领域浸淫多年之后的神级程序员才能搞明白,并用明白的东西。 本文尝试用最简单的方式说清楚这个概念。因为这个概念真的超级简单,大…...
7-字符串
1-ASCII 0-9 对应 48-57 A-Z 对应 65-90 a-z 对应 97-122 2-字符数组 字符变量存储单个字符 字符数组存储多个字符 字符串就是字符数组加上结束符 ’ \0 ’ #include <iostream> using namespace std; int main(){//是字符数组,不是字符串char a1[]{C,,};…...
DeepSeek 3FS 与 JuiceFS:架构与特性比较
近期,DeepSeek 开源了其文件系统 Fire-Flyer File System (3FS),使得文件系统这一有着 70 多年历时的“古老”的技术,又获得了各方的关注。在 AI 业务中,企业需要处理大量的文本、图像、视频等非结构化数据,还需要应对…...
数据结构 -- 二叉树的存储结构
二叉树的存储结构 顺序存储 #define MaxSize 100 struct TreeNode{ElemType value; //结点中的数据元素bool isEmpty; //结点元素是否为空 };//定义一个长度为MaxSize的数组t,按照从上至下、从左至右的顺序依次完成存储完全二叉树中的各个节点 TreeNode t[MaxSi…...
Unity WebGL项目访问时自动全屏
Unity WebGL项目访问时自动全屏 打开TemplateData/style.css文件 在文件最下方添加红色框内的两行代码 使用vscode或者其他编辑器打开index.html 将按钮注释掉,并且更改为默认全屏...
vue computed 计算属性简述
Vue 的 计算属性(Computed Properties) 是 Vue 实例中一种特殊的属性,用于声明式地定义依赖其他数据动态计算得出的值。它的核心优势在于能够自动追踪依赖关系,并缓存计算结果,避免重复计算,提升性…...
破局者登场:中国首款AI原生IDE Trae深度解析--开启人机协同编程新纪元
摘要 字节跳动于2025年3月3日正式发布中国首款AI原生集成开发环境Trae国内版,以动态协作、全场景AI赋能及本土化适配为核心优势。Trae内置Doubao-1.5-pro与DeepSeek R1/V3双引擎,支持基于自然语言生成端到端代码框架、实时上下文感知与智能Bug修复&…...
如何通过Python的`requests`库接入DeepSeek智能API
本文将详细介绍如何通过Python的requests库接入DeepSeek智能API,实现数据交互与智能对话功能。文章涵盖环境配置、API调用、参数解析、错误处理等全流程内容,并提供完整代码示例。 一、环境准备与API密钥获取 1. 注册DeepSeek账号 访问DeepSeek官网&am…...
【C++】std::make_shared 详解
std::make_shared 详解 1. std::make_shared 简介 std::make_shared 是 C11 标准引入的一个函数模板,用于创建 std::shared_ptr 对象,并高效地分配和管理对象的内存。它比直接使用 std::shared_ptr 构造函数 std::shared_ptr<T>(new T(...)) 具有…...
【NoSql】Redis
Ubuntu22.04版本编译安装 Redis Redis version7.4.2 #解压源码包 tar -zxvf redis-stable.tar.gz cd redis-stable/ make make install安装好了后,可执行文件默认会放入/usr/local/bin/ rootluobozi:~ ls /usr/local/bin/* /usr/local/bin/redis-cli /usr/local/…...
ClickHouse Docker 容器迁移指南:从测试环境到离线正式环境
ClickHouse Docker 容器迁移指南:从测试环境到离线正式环境 在实际开发和运维过程中,我们经常需要将测试环境中的服务迁移到正式环境,尤其是当正式环境处于离线状态时,这种迁移会变得更加复杂。本文将详细介绍如何将运行在 Docke…...
C# WPF编程-Menu
C# WPF编程-Menu 布局:代码:效果 在WPF(Windows Presentation Foundation)中,Menu控件用于创建下拉菜单或上下文菜单,它提供了丰富的定制选项来满足不同的应用需求。下面将介绍如何在WPF应用程序中使用Menu…...
利用Python爬虫获取Shopee(虾皮)商品详情:实战指南
在跨境电商领域,Shopee(虾皮)作为东南亚及台湾地区领先的电商平台,拥有海量的商品信息。无论是进行市场调研、数据分析,还是寻找热门商品,获取Shopee商品详情都是一项极具价值的任务。然而,手动…...
Docker和containerd之概览(Overview of Docker and Containerd)
Docker和containerd之概览 容器本质上就是一个进程。 Namespace是一种逻辑分组机制,允许您将集群资源划分为独立的虚拟环境。每个 Namespace 为资源提供了一个范围,使得不同的团队、应用程序或环境可以在同一集群中共存,而不会相互干扰。 C…...
【愚公系列】《高效使用DeepSeek》015-文献摘要生成
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…...
【多线程】线程不安全问题
文章目录 多线程不安全的原因大的层面->多线程是随机调度的容易产生死锁 小的层面->内存不可见性引入volatile关键字 指令重排序不是原子性带来的隐患 synchronized锁的互斥性及作用可重入性——解决死锁 wait()和notify()两个突然迸发出的疑问 多线程不安全的原因 大的…...
为什么“连接断开可能导致锁未释放”
目录 两种典型场景可能导致锁未及时释放1. **数据库未及时检测到连接断开**2. **应用程序未正确处理事务** 为什么说“可能因连接断开导致死锁”?如何避免此类问题?总结 在大多数数据库实现中,如果持有锁的连接(或会话)…...
