意思是,从上到下依次检测判断条件,当某个判断条件成立时,则执行其对应的语句块,然后跳到整个 if else 语句之外继续执行其他代码。如果所有判断条件都不成立,则执行语句块n,然后继续执行后续代码。
也就是说,一旦遇到能够成立的判断条件,则不再执行其他的语句块,所以最终只能有一个语句块被执行。
我们以下面这段代码举个例子:
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age > 0 && age < 18) {
printf("少年\n");
}
else if (age >= 18 && age < 30) {
printf("青年\n");
}
else if (age >= 30 && age < 45) {
printf("壮年\n");
}
else if (age >= 45 && age < 55) {
printf("中年\n");
}
else if (age >= 55 && age < 75) {
printf("老年\n");
}
else {
printf("老寿星\n");
}
return 0;
}
假设我们输入的是40,输出:
2.4 if else的嵌套
if else也能嵌套使用,也就是说if执行的语句中也可以包含if else语句。我们用判断三角形来具体说明这个问题:
#include <stdio.h>
int main()
{
int a, b, c;
while(scanf("%d%d%d", &a, &b, &c)==3)
{
if (a + b > c && a + c > b && b + c > a) {
if (a == b && b == c) {
printf("是一个等边三角形");
}
else if (a == b || a == c || b == c) {
printf("是一个等腰三角形");
}
else if (a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a) {
printf("是一个直角三角形");
}
else {
printf("是一个普通三角形");
}
}
else {
printf("由%d,%d,%d三边组成的不是三角形", a, b, c);
}
}
return 0;
}
2.5 悬空的else
在书写if....else语句时最好每一条语句后面都加上大括号。
至于为什么,我们可以以下面这段代码举例
#include<stdio.h>
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}//输出什么???
输出结果:
为什么会什么结果都没有输出呢?
这就是悬空 else 的问题,如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。最下面的else其实是与if(b==2)这条语句配对的,而不是与if(a==1)配对,当a等于0,自然不会进入任何语句。
3. switch语句
在我们学习多个lf else语句时候就会会发现,如果条件多的话,整个选择结构就会变得很冗杂,所以C语言为了解决这个问题引入了switch,switch 是另外一种选择结构的语句,用来代替简单的、拥有多个分支的 if else 语句。
比如说下面这段代码就会显得十分冗余
int main()
{
int day = 0;
scanf("%d", day);
if(day == 1)
printf("星期一\n");
else if(day == 2)
printf("星期二\n");
else if (day == 3)
printf("星期三\n");
else if (day == 4)
printf("星期四\n");
else if (day == 5)
printf("星期五\n");
else if (day == 6)
printf("星期六\n");
else
printf("星期天\n");
return 0;
}
3.1 switch的基本规则
switch的语法如下:
switch (expression) {
case value1: statement
case value2: statement
default: statement
}
switch语句必须遵循下面的规则:
switch语句中的括号是一个常量表达式,必须是一个整型或枚举类型。
在一个 switch 中可以有任意数量的 case 语句。每个 case 后跟一个要比较的值和一个冒号。
3.2 break的重要性
学习完switch的语法之后,然后我们可以将最开始的例子改造
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一\n");
case 2:
printf("星期二\n");
case 3:
printf("星期三\n");
case 4:
printf("星期四\n");
case 5:
printf("星期五\n");
case 6:
printf("星期六\n");
case 7:
printf("星期天\n");
}
return 0;
}
int main()
{
int day = 0;
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;
case 7:
printf("星期天\n");
break;
}
return 0;
}
3.3 default的使用
在使⽤ switch 语句的时候,我们经常可能遇到⼀种情况,⽐如 switch 后的表达式中的值⽆法匹配代码中的 case 语句的时候,这时候要不就不做处理,要不就得在 switch 语句中加⼊default ⼦句。
其语法如下:
switch (expression) {
case value1: statement
case value2: statement
default: statement
}
就⽐如前⾯做的打印星期的练习,如果 day 的输⼊不是1~7的值,如果我们要提⽰:输⼊错误,则可以这样完成代码:
#include<stdio.h>
int main()
{
int day = 0;
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;
case 7:
printf("星期天\n");
break;
default :
printf("输入错误\n");
break;
}
return 0;
}
在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满⾜实际需求的就可以。不过我们通常是把 default ⼦句放在最后处理的。
4. 综合练习
4.1 题目一
输入三个整数x,y,z,请把这三个数由小到大输出。
#include <stdio.h>
int main()
{
int x, y, z, t;
printf("请输入三个数字:\n");
scanf("%d%d%d", &x, &y, &z);
if (x > y)
{ /*交换x,y的值*/
t = x; x = y; y = t;
}
if (x > z)
{ /*交换x,z的值*/
t = z; z = x; x = t;
}
if (y > z)
{ /*交换z,y的值*/
t = y; y = z; z = t;
}
printf("从小到大排序: %d %d %d\n", x, y, z);
return 0;
}
4.2 题目二
输入某年某月某日,判断这一天是这一年的第几天?
#include <stdio.h>
int main()
{
int day, month, year, sum, leap;
printf("请输入年、月、日,格式为:年,月,日(2015,12,10)\n");
scanf("%d,%d,%d", &year, &month, &day); // 格式为:2015,12,10
switch (month) // 先计算某月以前月份的总天数
{
case 1:
sum = 0;
break;
case 2:
sum = 31;
break;
case 3:
sum = 59;
break;
case 4:
sum = 90;
break;
case 5:
sum = 120;
break;
case 6:
sum = 151;
break;
case 7:
sum = 181;
break;
case 8:
sum = 212;
break;
case 9:
sum = 243;
break;
case 10:
sum = 273;
break;
case 11:
sum = 304;
break;
case 12:
sum = 334;
break;
default:
printf("输入错误\n");
break;
}
sum = sum + day; // 再加上某天的天数
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {// 判断是不是闰年
leap = 1;
}
else {
leap = 0;
}
if (leap == 1 && month > 2)
{ // *如果是闰年且月份大于2,总天数应该加一天
sum++;
}
printf("这是这一年的第 %d 天。", sum);
printf("\n");
return 0;
}