1. 表达式 vs 语句
在C#里,所有的代码分两类:语句(Statement)和表达式(Expression)。语句一般说是“执行”,表达式说是“计算”。但这不是最重要的。
最关键的区别:表达式有计算结果。这个结果有类型,你可以把它赋值给变量,或者在别的表达式里用。
举个例子:
| 代码 | 备注 |
|---|---|
|
语句 |
|
表达式,类型是bool |
|
表达式,类型和变量i一样 |
|
表达式,类型和变量x一样 |
这对我们有啥用?
其实很多语句其实也是表达式(有计算结果)。比如,这样写完全没问题:int x, y, z;
x = y = z = 1; // x = (y = (z = 1));
如果你不需要表达式的结果,可以直接无视它:
Console.ReadLine(); // 忽略输入的结果
这很方便,尤其是表达式除了结果还能干点别的事(比如输出到屏幕或者读输入)。
2. 三元运算符
C#里有个特别的三元(也叫三目)运算符。它其实就是if–else的简写版:
条件 ? 表达式1 : 表达式2;
三元运算符的语法
如果条件为真,就计算表达式1,否则就计算表达式2。条件后面跟?,两个表达式之间用:分开。
和if-else最大的不同:三元运算符是表达式,它的结果可以赋值给变量,或者在别的表达式里用。
比如,算两个数的最小值:
int a = 2;
int b = 3;
int min = a < b ? a : b;
或者根据条件给变量赋不同的值:
int age = 25;
int money;
if (age > 30)
money = 100;
else
money = 50;
经典
if-else
用三元运算符写就是这样:
int age = 25;
int money = age > 30 ? 100 : 50;
三元运算符——更简洁的写法
到底用if-else还是三元运算符?速度上没啥区别,但三元运算符适合短条件。如果一行写不下,还是用if-else更清楚。
3. 使用小细节
值的类型
三元运算符的两边(<为真时的值>和<为假时的值>)类型要一样,或者能兼容(比如都是string或者都是int)。
这样没问题:
int a = 10, b = 20;
int max = (a > b) ? a : b; // 两边都是int
编译错误:
int a = 10, b = 20;
// string和int不兼容
string result = (a > b) ? "更大" : 0; // 编译错误
正确写法:
int a = 10, b = 20;
string result = (a > b) ? "更大" : "小于等于";
例子:处理数字
int number = -5;
int abs = (number >= 0) ? number : -number;
Console.WriteLine(abs); // 5
4. 把三元运算符用到应用里
来写个小对话程序:除了打招呼,程序还会告诉用户明年几岁了,并且说他是不是成年人。
Console.Write("请输入你的名字: ");
string name = Console.ReadLine();
Console.Write("请输入你的年龄: ");
string ageText = Console.ReadLine();
int age = int.Parse(ageText);
int nextYear = age + 1;
string status = (nextYear >= 18) ? "成年人" : "未成年人";
Console.WriteLine($"你好, {name}! 明年你就{nextYear}岁了。你将会是{status}。");
细节解释:
- 变量status是用三元运算符算出来的:如果明年年龄不小于18,就是成年人(或者还是成年人)。
- 三元运算符可以直接塞到字符串里(比如用$""插值)。
5. 嵌套三元运算符——小心用!
三元运算符可以嵌套(每个分支里还能再写一个三元)。但是……这样一般会让人头大,尤其是以后别人(或者你自己两天后)再看代码的时候。
例子:按年龄分组
string category = (age < 7) ? "学龄前" :
(age < 18) ? "学生" :
(age < 65) ? "成年人" : "退休";
决策表:
| 年龄 | 条件 | 结果 |
|---|---|---|
| < 7 | age < 7 | 学龄前 |
| 7–17 | age < 18 | 学生 |
| 18–64 | age < 65 | 成年人 |
| 65及以上 | 否则 | 退休 |
这种代码还能看,但要是逻辑再复杂点——最好用if-else if-else。
6. 小技巧:三元运算符和bool类型
有时候会看到这样的代码:
bool adult = (age >= 18) ? true : false;
其实完全没必要。(age >= 18)本身就返回bool。所以直接写:
bool adult = (age >= 18);
GO TO FULL VERSION