当前位置:首页 > 技术 > 正文内容

C# 运算符核心用法解析

访客 技术 2026年7月2日 1

运算符是 C# 中用于执行特定计算或逻辑判断的符号。本文系统梳理各类运算符的行为特征与实际应用场景。

算术运算

一元运算符包含自增与自减两种形式,其前后缀位置直接影响返回值:

int baseVal = 5;
int postfix = baseVal++;  // postfix 为 5,baseVal 变为 6
int prefix = ++baseVal;   // prefix 为 7,baseVal 变为 7

int decrement = 3;
Console.WriteLine(--decrement);  // 输出 2
Console.WriteLine(decrement--);  // 输出 2,此后值为 1

二元算术运算符支持复合赋值形式:

int score = 50;
score += 25;   // 等价于 score = score + 25
score *= 2;    // 乘法复合赋值
score %= 7;    // 取模后赋值

比较与关系运算

运算符含义示例(m=3, n=5)
==等于m == n 结果为 false
!=不等于m != n 结果为 true
<小于m < n 结果为 true
>大于m > n 结果为 false
<=小于等于m <= 3 结果为 true
>=大于等于n >= 6 结果为 false

逻辑运算

条件逻辑运算符具有短路特性,能提升执行效率:

bool flagA = true, flagB = false;

// & 与 && 的差异:前者始终计算两边,后者左侧为 false 时跳过右侧
bool result1 = flagA & flagB;   // false,两边都执行
bool result2 = flagA && flagB;  // false,flagB 仍被求值

// || 短路示例
bool result3 = flagA || SomeMethod();  // SomeMethod 不会被执行

// 异或:两操作数不同时返回 true
bool xorResult = flagA ^ flagB;  // true

位运算与移位

位运算直接操作二进制位,适用于底层协议处理:

byte flags = 0b_0000_1101;

// 按位取反
byte inverted = (byte)~flags;  // 0b_1111_0010

// 按位与、或、异或
byte mask = 0b_0000_1111;
byte masked = (byte)(flags & mask);  // 保留低四位:0b_0000_1101

// 移位运算
uint data = 0b_0000_0001;
uint shifted = data << 4;   // 0b_0001_0000,左移四位

// 算术右移与逻辑右移的区别
int negative = -16;
int arithShift = negative >> 2;   // 保持符号位,结果为 -4
int logicalShift = negative >>> 2; // 高位补零,结果为正数

演示带符号与无符号右移的差异:

int sample = -1024;
Console.WriteLine($"原始值: {sample}, 二进制: {Convert.ToString(sample, 2)}");

int afterArith = sample >> 4;
int afterLogic = sample >>> 4;

Console.WriteLine($"算术右移: {afterArith}");
Console.WriteLine($"逻辑右移: {afterLogic}, 二进制: {Convert.ToString(afterLogic, 2).PadLeft(32, '0')}");

赋值与复合赋值

除基本赋值外,C# 提供丰富的复合赋值运算符:

int accumulator = 100;

accumulator += 50;      // 加法复合
accumulator <<= 2;      // 左移复合,等价于 accumulator = accumulator << 2
accumulator &= 0xFF;    // 按位与复合
accumulator ^= 0xAA;    // 按位异或复合

特殊运算符

空值相关

string? nullableRef = null;
string fallback = nullableRef ?? "default";  // 空合并运算符

// 空条件访问
int? length = nullableRef?.Length;  // nullableRef 为 null 时 length 也为 null

// 空合并赋值
nullableRef ??= "initialized";  // 仅当左侧为 null 时赋值

类型与反射

// 获取类型信息
Type intType = typeof(int);
Type streamType = typeof(System.IO.Stream);

// 运行时类型检查
object obj = "test string";
if (obj is string text)
{
    Console.WriteLine($"字符串长度: {text.Length}");
}

// 安全类型转换
var converted = obj as System.Collections.Generic.List<int>;  // 失败返回 null

三元条件

int temperature = 28;
string status = temperature > 30 ? "炎热" : "舒适";  // 结果为 "舒适"

// 嵌套三元(建议控制嵌套层数)
int grade = 85;
char level = grade >= 90 ? 'A' : grade >= 80 ? 'B' : 'C';

sizeof 与内存布局

Console.WriteLine($"int 占用: {sizeof(int)} 字节");
Console.WriteLine($"long 占用: {sizeof(long)} 字节");
Console.WriteLine($"bool 占用: {sizeof(bool)} 字节");

// 非托管类型可用 sizeof
unsafe
{
    Console.WriteLine($"指针大小: {sizeof(int*)}");
}

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。