通过刚刚的介绍,你应该很容易理解这段代码在干什么:如果我们输入的是一个偶数,那么条件判断为真,我们进入if语句块,在屏幕上输出这个数是偶数;否则,条件判断为假,我们就进入else,并且在屏幕上输出这个数是个奇数。
多学一招:
如果if或是else里只有一条语句,那么外面的花括号可以省略。比如刚刚的例子也可以写成:
int number;
scanf("%d", &number);
if (number % 2 == 0)
printf("%d是个偶数\n", number);
else
printf("%d是个奇数\n", number);
当然你也可以一直把一对{}带着,这取决于你喜欢哪种代码风格。
if…else if…else结构
If加上else只能帮我们处理二选一的情况。然而,正如同在城市里开车还会遇到三岔路口和十字路口一样,有的时候我们还需要能够处理三选一,四选一乃至N选一的情况。比如在美剧《生活大爆炸》中,男主角谢耳朵有一张严格的日程表,精确到每星期几应该吃什么:
表 52谢耳朵的菜单
周一
周二
周三
周四
周五
周六
周日
燕麦粥
汉堡
奶油土豆汤
披萨
法式面包
中餐
谢耳朵周日吃啥是个谜,笔者没有考证出来。我们就假定谢耳朵周日自己做饭吧。
现在,如果你要给谢耳朵写一个日程管理程序,输入星期几,输出今天要吃什么。这是一个N选一的选择结构。由于N选一可以被拆成很多很多个二选一,利用手头已知的if和else语句,机智的读者可以写出如下的嵌套结构:
if (今天是星期一)
{
我们吃燕麦粥;
}
else
{
if (今天是星期二)
{
我们吃汉堡;
}
else
{
if (今天是星期三)
{
我们吃奶油土豆汤;
}
else
…
}
}
这个程序当然是对的,但是这样的程序既难读又难写。幸好C语言中除了if和else之外还有专门为N选一设计的else if结构,它可以让我们不必写上面这种嵌套的if程序:
if (今天是星期一)
{
我们吃燕麦粥;
}
else if (今天是星期二)
{
我们吃汉堡;
}
else if (今天是星期三)
{
我们吃奶油土豆汤;
}
else if (今天是星期四)
{
我们吃披萨;
}
else if (今天是星期五)
{
我们吃法式面包;
}
else if (今天是星期六)
{
我们吃中餐;
}
else
{
//今天是星期天
谢耳朵要自己做饭!
}
结合这个例子,else if干了什么应该很好懂了。首先,判断if的条件是否成立,如果成立,意味着今天是星期一,进入if;如果不成立,我们就去看第一个else if的条件,如果第一个else if的条件为真(今天是星期二),就进入这个else if,否则就接着看第二个else if,第三个else if,直到最后一个else if.如果上面的else if统统都不成立,我们就进入最后一个else,执行"谢耳朵要自己做饭!"
关于上面的else if结构,有几点需要留意的地方:首先,在语法上else if可以有多个(当然也可以有0个,这时候就退化成了之前的if else);其次,最后的else也是可有可无的。你可以只带着N个else if结束这段程序。这时候如果if和所有的else if中的条件判断统统为假,那么程序什么也不做。
M脚下留心:
正文中给出的都只是伪代码,仅用于讲解语法,不是可以在电脑上运行的程序!请不要试图直接复制粘贴"谢耳朵要自己做饭"然后编译运行程序!
:动手体验:
回到我们为怪兽大学写的程序上来(忘记题目设定的读者可以查阅5.1.2节):
#include
int main()
{
int voice;
float score;
//从控制台读入一个整数
scanf("%d", &voice);
//计算考生得分
score = (float)voice / 40 + 2.5;
//输出考生的得分
printf("%f", score);
return 0;
}
郝刻薄院长发现一个问题:不管婴儿的分贝数有多么低,考生们至少都能拿到2.5分保底。正如她的名字显示的那样,郝刻薄院长是一个严厉的老师,她觉得2.5分对于那些懒惰的学生来说太宽容了,因此她决定着手修改量化评分标准:
如果婴儿的分贝低于60,小怪兽的得分为0;
如果婴儿的分贝不低于60而低于80,小怪兽得分为2.5分;
否则,按照原来的方法评分:得分=婴儿分贝/40+2.5.
由于怪兽大学没有计算机系,请你再次帮助郝刻薄院长完成这个程序。
switch判断结构
我们之前用if和else if为谢耳朵写了一小段管理每天菜单的代码。作为一个Geek,谢耳朵觉得如此多的else if堆在一起还是不够优美,因此他把你的程序改动成了这个样子:
int day;
scanf("%d", &day);
switch(day)
{
case 1:
printf("燕麦粥\n");
break;
case 2:
printf("汉堡\n");
break;
case 3:
printf("奶油土豆汤\n");
break;
case 4:
printf("披萨\n");
break;
case 5:
printf("法式面包\n");
break;
case 6:
printf("中餐\n");
break;
default:
printf("谢耳朵要自己做饭\n");
}
在这里谢耳朵为我们介绍了新的语句--switch语句。这是一种升级版的if else语句,专门用于处理多种分支间的选择:
switch(表达式)
{
case 值1:
语句1;
break;
case 值2:
语句2;
break;
…
default:
语句N;
}
switch是相对比较复杂的语句,我们来详细解释一下:
首先,switch一开始会计算表达式的值。这个值可以是整型,可以是字符,可以是枚举,但是,不能是浮点数float或double.不严谨地说,只要这个值可以被解读成是一个整数,就可以用switch.
接下来,根据表达式的值,选择进入合适的case.如果表达式的值恰好符合某一个case后面的值,就跳到那个case当中,开始执行case下面的语句。需要强调的是,这里的语句1,语句2,语句N等都不一定是一行语句,它们可以是多行语句,而且不需要用花括号{}括起来。如果,表达式的值不符合任何一个case,那么就跳转到default,去执行default下面的语句N.正如在if-else-if当中最后的else可以没有一样,在switch中,最后的default也可以不写,这时如果表达式不符合任何一个case,就直接跳过整个switch代码,相当于什么都不做。
最后,也是switch当中最神奇最费解的,是每一个case内部都跟了一个break.我们将在循环结构中再次见到break语句。在这里,break语句表示当我们进入了某个case后,执行完了这个case下的语句之后,遇到了一句break,我们就跳出整个switch语句,这一段代码结束。如果,在某一个case下面没有break,那么当执行完了当前的case之后,程序会接着进入下一个case继续执行里面的代码,这个过程会一直持续到遇见第一个break为止。当然,如果接下来的case里面都没有break的话,那就一直执行到底,包括最后的default,然后跳出switch.
上面这几段话是非常抽象的,如果你看了一遍之后就完全明白了switch的执行顺序,那么恭喜你,你很适合学习编程!如果你看得一头雾水,没有关系,我们还是用谢耳朵的程序来说明一下:
int day;
scanf("%d", &day);
switch(day)
{
case 1:
printf("燕麦粥\n");
break;
case 2:
printf("汉堡\n");
break;
case 3:
printf("奶油土豆汤\n");
break;
case 4:
printf("披萨\n");
break;
case 5:
printf("法式面包\n");
break;
case 6:
printf("中餐\n");
break;
default:
printf("谢耳朵要自己做饭\n");
}