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

news2025/3/19 14:46:13

一、运算符概述

        运算符是程序进行数学运算、逻辑判断的核心工具,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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2317853.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单片机自学总结

自从工作以来&#xff0c;一直努力耕耘单片机&#xff0c;至今&#xff0c;颇有收获。从51单片机&#xff0c;PIC单片机&#xff0c;直到STM32&#xff0c;以及RTOS和Linux&#xff0c;几乎天天在搞:51单片机&#xff0c;STM8S207单片机&#xff0c;PY32F003单片机&#xff0c;…

Unity教程(二十二)技能系统 分身技能

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程&#xff08;零&#xff09;Unity和VS的使用相关内容 Unity教程&#xff08;一&#xff09;开始学习状态机 Unity教程&#xff08;二&#xff09;角色移动的实现 Unity教程&#xff08;三&#xff09;角色跳跃的实现 Unity教程&…

HTML5扫雷游戏开发实战

HTML5扫雷游戏开发实战 这里写目录标题 HTML5扫雷游戏开发实战项目介绍技术栈项目架构1. 游戏界面设计2. 核心类设计 核心功能实现1. 游戏初始化2. 地雷布置算法3. 数字计算逻辑4. 扫雷功能实现 性能优化1. DOM操作优化2. 算法优化 项目亮点技术难点突破1. 首次点击保护2. 连锁…

【Git学习笔记】Git分支管理策略及其结构原理分析

【Git学习笔记】Git分支管理策略及其结构原理分析 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;Git学习笔记 文章目录 【Git学习笔记】Git分支管理策略及其结构原理分析前言一.合并冲突二. 分支管理策略2.1 分支策略2.2 bug分支2.3 删除临…

Spring Cloud Alibaba Nacos 2023.X 配置问题

文章目录 问题现象&#xff08;一&#xff09;解决方法&#xff08;一&#xff09;问题现象&#xff08;二&#xff09;解决方法&#xff08;二&#xff09;问题现象&#xff08;三&#xff09;解决方法&#xff08;三&#xff09; 问题现象&#xff08;一&#xff09; Spring…

厨卫行业供应链产销协同前中后大平台现状需求分析报告+P120(120页PPT)(文末有下载方式)

资料解读&#xff1a;厨卫行业供应链产销协同前中后大平台现状需求分析报告 详细资料请看本解读文章的最后内容。在当前厨卫行业竞争激烈的市场环境下&#xff0c;企业的发展战略和业务模式创新至关重要。本次解读的报告围绕某厨卫企业展开&#xff0c;深入探讨其供应链产销协同…

我在哪,要去哪

在直播间听到一首好听的歌《我在哪&#xff0c;要去哪》-汤倩。 遇见的事&#xff1a;21~24号抽调去招生。 感受到的情绪&#xff1a;公假吗&#xff1f;给工作量吗&#xff1f;月工作量不够扣钱吗&#xff1f;报销方便吗&#xff1f;有事情&#xff0c;从来不解决后顾&#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 瑞士出台新规&#xff1a;关基设施遭遇网络攻击需在24小时内上报 原文: https://www.bleepingcomputer.com/news/security/swiss-critical-sector-faces-new-24-hour-cyberattack-reporting-rule/ 新规要求&#xff0c;关键基础设施组织发现网络攻击后&…

【css酷炫效果】纯CSS实现瀑布流加载动画

【css酷炫效果】纯CSS实现瀑布流加载动画 缘创作背景html结构css样式完整代码基础版进阶版(无限往复加载) 效果图 想直接拿走的老板&#xff0c;链接放在这里&#xff1a;https://download.csdn.net/download/u011561335/90492012 缘 创作随缘&#xff0c;不定时更新。 创作…

咖啡点单小程序毕业设计(JAVA+SpringBoot+微信小程序+完整源码+论文)

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着社会的快速发展和…

网络编程套接字【端口号/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小应用——客户端输入命令&#xff0c;服务器端执行 6. 地址…

DeepSeek 3FS 与 JuiceFS:架构与特性比较

近期&#xff0c;DeepSeek 开源了其文件系统 Fire-Flyer File System (3FS)&#xff0c;使得文件系统这一有着 70 多年历时的“古老”的技术&#xff0c;又获得了各方的关注。在 AI 业务中&#xff0c;企业需要处理大量的文本、图像、视频等非结构化数据&#xff0c;还需要应对…

Unity WebGL项目访问时自动全屏

Unity WebGL项目访问时自动全屏 打开TemplateData/style.css文件 在文件最下方添加红色框内的两行代码 使用vscode或者其他编辑器打开index.html 将按钮注释掉&#xff0c;并且更改为默认全屏

C# WPF编程-Menu

C# WPF编程-Menu 布局&#xff1a;代码&#xff1a;效果 在WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;Menu控件用于创建下拉菜单或上下文菜单&#xff0c;它提供了丰富的定制选项来满足不同的应用需求。下面将介绍如何在WPF应用程序中使用Menu…

Docker和containerd之概览(Overview of Docker and Containerd)

Docker和containerd之概览 容器本质上就是一个进程。 Namespace是一种逻辑分组机制&#xff0c;允许您将集群资源划分为独立的虚拟环境。每个 Namespace 为资源提供了一个范围&#xff0c;使得不同的团队、应用程序或环境可以在同一集群中共存&#xff0c;而不会相互干扰。 C…

【多线程】线程不安全问题

文章目录 多线程不安全的原因大的层面->多线程是随机调度的容易产生死锁 小的层面->内存不可见性引入volatile关键字 指令重排序不是原子性带来的隐患 synchronized锁的互斥性及作用可重入性——解决死锁 wait()和notify()两个突然迸发出的疑问 多线程不安全的原因 大的…

【C++】树和二叉树的实现(下)

本篇博客给大家带来的是用C语言来实现数据结构树和二叉树的实现&#xff01; &#x1f41f;&#x1f41f;文章专栏&#xff1a;数据结构 &#x1f680;&#x1f680;若有问题评论区下讨论&#xff0c;我会及时回答 ❤❤欢迎大家点赞、收藏、分享&#xff01; 今日思想&#xff…

kafka指北

为自己总结一下kafka指北&#xff0c;会持续更新。创作不易&#xff0c;转载请注明出处。 目录 集群controller选举过程broker启动流程 主题创建副本分布ISRleader副本选举机制LEO 生产数据流程同步发送和异步发送 分区策略ack应答生产者发送消息的幂等性跨分区幂等性问题&…

7、vue3做了什么

大佬认为有何优点&#xff1a; 组合式api----逻辑集中、对ts有更好的支持RFC–开放了一个讨论机制&#xff0c;可以看到每一个api的提案&#xff0c;方便源码维护&#xff0c;功能扩展&#xff0c;大家一起讨论 官方rfc响应式独立&#xff0c;new Proxy&#xff0c;天生自带来…