本文发布于微信公众号:三玹
上一篇讲运算符中,学习了关系运算符和逻辑运算符,其中都有谈及程序语言中非常重要的结构之一,判断结构。本篇文章就来讲一讲判断结构。计算机语言的运行是按照顺序结构执行的,也就是一条路走到黑。就好比一些游戏,它是有一条主线的,但是结局是多样性的,有HE(Happy Ending,完美结局),也有BE(Bad Ending,悲剧结局)。至于走向是HE,还是BE,取决于你在游戏中的行为。而这些行为就是判断条件,如果符合条件,那么就执行HE,否则就执行BE。
由此可知,判断结构需要具备两个内容:判断条件和判断结果。首先,先说一个之前学过的一个运算符,三元运算符。它也是属于一种判断结构。和其他判断结构不同的是,它只能表示两种结果,要么是,要么不是。
int a = 3 > 4 ? 1 : 0;
3 > 4 是判断条件;1 或者 0 是判断结果。三元运算符的结果除了冒号前后的两个数据,就不会有第三种结果了,这就存在了局限性。如果我有多个条件,不同的条件所执行的结果也不同,显然三元运算符是不能满足的。比如还是去网吧的例子,首先得年满十八岁,且钱带足了,才能进去玩耍;如果满十八岁,但是钱不够,会被提醒带够钱,然后请出去;如果钱带够了,没满十八岁,会被提醒未成年禁止进入,然后请出去。而三元运算符只有一个条件,两个结果,显然是无法完成这样的案例。那么,我们就需要知道另外的判断结构,if-else 结构和 switch 结构。
在我当前的认知里面,if-else 结构是使用最多的循环结构。(很大的原因,是因为我先学了Python,而Python里面是没有switch结构的。)在 if-else 结构中,最少都有两种结果。其中 if 是表示如果的意思,else 是表示否则的意思。再说一个可能会让大家产生误解的话:在 if-else 结构中,if 是可以单独出现的,else 是可有可无的,但是必须要和 if 配对。if(1 > 3){
printf("1比3大");
}
else{
printf("3比1大");
}
其中 if 后面是要跟上条件的,而 else 后面是不用跟条件的。如果 if 后面的条件不满足,那么自动会找配对的 else,然后执行里面的命令。如果没有 else,那就直接跳过,运行下面的代码。那么问题来了,if 和 else 各自执行出一个结果,那么如果 if 独立出来,不就只有一个结果。作者你是怎么敢说至少两个结果呢?
不!if 单独出现,虽然只有一个条件,执行的部分也只有一个,但是它的结果是两个的。一个是满足条件,执行出的有结果;另一种是不满足条件,不执行出的没有结果。有和没有,就是两种结果。
到这里,我们就知道了无论是只有一个 if,还是 if-else 成对出现,结果都会是两个。但现在,我想要三个结果,应该怎么做呢?
if-else 之间还有一个判断方式,叫做否则如果,写作 else if。这个判断方式在 if-else 结构中也不是必须的,除非你有很多条件需要判断,否则只有一个判断条件,就用不到 else if。int age = 21;
double money = 35.00;
if(age >= 18 && money >= 50.00){
printf("欢迎光临!");
}
else if(age < 18){
printf("小朋友,长大后才能进网吧!");
}
else if(money < 50.00){
printf("不好意思,您的余额已经不足!");
}
if 判断后面的条件实际上是有 2 个,一个是判断年龄,另一个判断金钱。通过逻辑运算符,将两个条件合并成一个布尔表达式。&&,与运算符,两个条件同时满足时,该表达式的结果为真(true),就执行下面的内容。反之为假(false),跳过 if 包含的代码块(跟在条件后面的 {...} 里面的内容)。switch(expression){
case constant1:
statements1;
break;
case constant2:
statements2;
break;
default:
statements;
}
1、switch:开关。即这个循环结构的开关,表示准备开始循环。2、expression:表达式。这里可以是一个变量、但类型必须是整形、枚举类型或者class类型,其中class中必须要有单独的一个函数将其转换为整型或者枚举类型。(目前就先记着,类型可以是short、int、long的整数,以及 char 的字母。)3、case:案例。相当于 if 和 else if。4、contant:常数。该部分内容是判断的值,且必须和 expression 的类型必须是一致的。如果是整型,这个值就是1、2、3;如果是字符型,这个值就是a、b、c。这个值相当于是条件。5、statements:语句。这里是指满足 case 后面的值和 expression 传递进来的值是一致的,则要运行的内容。6、break:终止。代码块中碰到 break 关键字则结束运行,剩余的内容就不再运行了。7、default:默认。和 else 的作用是一样的,如果以上 case 后面的值都不满足,则执行这一块下面的代码语句。理论上,default 放在哪里都是可以的,但是需要注意的是,如果放在 case 上面,一定要加上 break 关键字。一般建议是放在代码的最后。int a;
scanf("%d", &a);
switch(a){
case 0:
printf("第一关");
case 1:
printf("第二关");
break;
default:
printf("结束游戏!");
}
当输入 0 给 a,这段代码的运行结果是:第一关第二关。
这个结果显然不是想要的。之所会出现这种情况,就因为少了一个 break。switch 不会像 if-else 结构一样,满足哪个条件,就执行哪部分内容,执行完就直接跳出。switch 代码块的内容都是一个整体,如果没有 break 关键字,就会发生穿透,也就是代码会按顺序执行下来。直到碰到了 break,或者全部运行完,才会跳出判断。例如:去网吧首先要对年龄进行判断,符合规定才能允许进去。进去后还要根据你缴交的钱,判断你是开的豪华包厢,可以玩高配电脑;还是在氛围贼好的大堂,玩普通配置的电脑。
int age;
double money;
if(age >= 18){
if(money > 500.00){
print("贵宾一位,豪华包厢安排起来!");
}
else{
printf("顾客一名,随便找个机子玩玩!");
}
}
else{
printf("小朋友,长大后才能进来的!");
}
switch 结构一般是对几个常量进行判断的。就比如我们去ATM取钱,在登录后会让我们选择查询余额、存取款、转账交易等行为。我们会根据系统给出的提示按下相应的数字进入界面操作。
比如存取款是按下 2 进入相应界面,之后又有几个选择,按 1 选择存钱,按 2 选择取钱,按 0 退出。
用 switch 嵌套结构实现:
int a;
int b;
switch(a){
case 1:
printf("查询余额");
break
case 2:
printf("存取款");
switch(b){
case 0:
printf("退出");
break;
case 1:
printf("存钱");
break;
case 2:
printf("取钱");
break;
}
break;
case 3:
printf("转账交易");
break;
}
一般情况下,建议尽可能少使用嵌套循环,迫不得已要使用嵌套,三次就差不多了。如果嵌套了太多,会导致代码的可读性急剧下降,且后期的维护就变得非常困难。
最后
关于判断结构的介绍和使用就到这里结束了,下一篇文章我们讲另外一个重要的结构——循环结构。对文中有疑问或者出现错误的地方,欢迎大家在评论区指正。
如果您觉得文章还不错的话,点赞、分享支持一下呗!