上一篇讲运算符中,学习了关系运算符和逻辑运算符,其中都有谈及程序语言中非常重要的结构之一,判断结构。本篇文章就来讲一讲判断结构。

学习c语言有什么常见的问题(从零开始学习C语言判断结构)(1)

计算机语言的运行是按照顺序结构执行的,也就是一条路走到黑。就好比一些游戏,它是有一条主线的,但是结局是多样性的,有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 结构

在我当前的认知里面,if-else 结构是使用最多的循环结构。(很大的原因,是因为我先学了Python,而Python里面是没有switch结构的。)

在 if-else 结构中,最少都有两种结果。其中 if 是表示如果的意思,else 是表示否则的意思。

再说一个可能会让大家产生误解的话:在 if-else 结构中,if 是可以单独出现的,else 是可有可无的,但是必须要和 if 配对。

先来看一个有 if 和 else 的结构:

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 结构

先来看一下 switch 结构语法:

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 关键字。一般建议是放在代码的最后。

来看一个 switch 结构的简单案例:

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,或者全部运行完,才会跳出判断。

嵌套循环

嵌套就是套娃行为,嵌套循环就是判断里面还有判断。

例如:去网吧首先要对年龄进行判断,符合规定才能允许进去。进去后还要根据你缴交的钱,判断你是开的豪华包厢,可以玩高配电脑;还是在氛围贼好的大堂,玩普通配置的电脑。

用 if-else 嵌套结构实现:

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; }

一般情况下,建议尽可能少使用嵌套循环,迫不得已要使用嵌套,三次就差不多了。如果嵌套了太多,会导致代码的可读性急剧下降,且后期的维护就变得非常困难。

最后

关于判断结构的介绍和使用就到这里结束了,下一篇文章我们讲另外一个重要的结构——循环结构。对文中有疑问或者出现错误的地方,欢迎大家在评论区指正。

如果您觉得文章还不错的话,点赞、分享支持一下呗!

,