1. 嵌套if的基础语法
现实生活中很少有只靠一个条件就能做决定的情况。通常我们要同时检查好几个条件,而且它们经常互相关联。比如说,想进演唱会,不光要成年,有时候还得在邀请名单里。这时候就需要用到所谓的多层逻辑,而帮我们实现的就是嵌套if语句。
嵌套条件就是一个if里面再套一个if。想象一下盒子里套盒子:如果第一个盒子打开了(条件成立),我们再看看里面是不是还有别的盒子,也许还要再打开第二个。从代码和逻辑上来说,这招很强大。
先来个简单的例子:
if (条件A)
{
// 如果条件A为true(成立)要做的事
if (条件B)
{
// 如果两个条件都成立要做的事
}
}
如果你觉得这像俄罗斯套娃——你理解得没错!内层的if只有在外层成立时才会执行。
例子:进夜店
我们来升级一下之前的练习程序,之前用户输入了名字和年龄。现在加一个第二层的检查:比如说,想进封闭夜店,得年满21岁而且还要有邀请码。
Console.Write("请输入你的名字: ");
string name = Console.ReadLine();
Console.Write("请输入你的年龄: ");
int age = int.Parse(Console.ReadLine());
if (age >= 21)
{
Console.Write("请输入邀请码: ");
string code = Console.ReadLine();
if (code == "VIP2024")
{
Console.WriteLine("欢迎, " + name + ", 来到VIP俱乐部!");
}
else
{
Console.WriteLine("不好意思,邀请码不对。禁止进入。");
}
}
else
{
Console.WriteLine("不好意思,21岁以上才能进!");
}
注意:内层if只有在年龄通过检查后才会检查邀请码。这样省资源(也不让保安抓狂)。
2. 嵌套可以有几层?
技术上来说,想嵌多少层都行。但实际上——嵌套层数越多,代码越难读也越难维护。一般很少超过2-3层。如果你发现自己写了4层以上的“楼梯”式if,就要想想是不是可以简化逻辑,或者把一部分检查单独写成函数(这个以后会讲!)。
3. 嵌套if和else:常见坑和细节
新手常犯的错:大括号写得不规范。
写嵌套条件的时候,尤其是用else时,C#对语法要求很严格。如果你不加大括号{},那if或else只会管它后面第一行。这是很多小bug的来源。
有坑的例子:
if (age >= 21)
if (code == "VIP2024")
Console.WriteLine("欢迎!");
else
Console.WriteLine("邀请码错了。");
很多人以为else是和年龄检查配对的,其实它是和最近的if(邀请码检查)配对的。这样一来,消息就会乱弹。建议永远都加大括号——哪怕里面只有一行!
为了不让你误会,我再演示一下。编译器其实是这样理解上面代码的:
if (age >= 21)
{
if (code == "VIP2024")
Console.WriteLine("欢迎!");
else
Console.WriteLine("邀请码错了。");
}
重要!再强调一次:
如果if-else结构没加大括号,else只会和它前面最近的if配对。
4. 替代方案:嵌套条件里的else if
有时候你在外层if里不光想检查一个条件,还想给出别的选择。比如邀请码不对,可以让用户买票。这就要用嵌套的else if/else结构:
if (age >= 21)
{
Console.Write("请输入邀请码: ");
string code = Console.ReadLine();
if (code == "VIP2024")
{
Console.WriteLine("欢迎来到俱乐部!");
}
else if (code == "GUEST")
{
Console.WriteLine("访客模式:只能玩到23:00。");
}
else
{
Console.WriteLine("抱歉,不能进。");
}
}
else
{
Console.WriteLine("21岁以上才能进。");
}
这个例子里我们在嵌套里做了三种选择:VIP码、访客码和拒绝。
5. 实战:多层逻辑的折扣计算器
我们来写个小程序:用户在商店买东西,根据年龄和有没有会员卡来给折扣。
- 如果用户年龄大于等于60——折扣15%。
- 如果年龄不到,但有会员卡——折扣7%。
- 其他情况没有折扣。
怎么写?
Console.Write("请输入你的年龄: ");
int age = int.Parse(Console.ReadLine());
double discount = 0.0;
if (age >= 60)
{
discount = 0.15;
}
else
{
Console.Write("你有会员卡吗(是/否)? ");
string hasCard = Console.ReadLine();
if (hasCard == "是")
{
discount = 0.07;
}
}
Console.WriteLine("你的折扣: " + (discount * 100) + "%");
这里我们在else分支里用了嵌套if。只有年龄不够时才问会员卡。
GO TO FULL VERSION