一、運算符概述
????????運算符是程序進行數學運算、邏輯判斷的核心工具,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