1. 分支语句
1.1 if 语句
基本结构:
if(表达式)
{
语句块1;
}
else
{
语句块2;
}
执行顺序:先执行表达式,如果执行结果为真则执行语句块1,否则执行语句块2
分层结构:
if(表达式1)
{
语句块1;
}
else if(表达式2)
{
语句块2;
}
else
{
语句块3;
}
执行顺序:如果满足 if 中的表达式1则执行语句块1,如果不满足则进入下面的 else if 中的表达式2如果满足则执行语句块2,如果以上条件都不满足则进入 else 执行语句块3。
嵌套结构:
if(表达式1)
{
if(表达式2)
{
语句块1;
}
else
{
语句块2;
}
}
else
{
语句块3;
}
执行顺序:如果满足 外层if 中的表达式1则进入到 内层if 看是不是满足表达式2,满足就执行语句块1,否则就执行语句块2;如果不满足 外层if的语句块1就执行 外层else 的语句块3。
学完 if语句 我们就会遇到一个非常经典的题目。
练习:输入年份判断平年还是闰年,包括错误情况。
#include <stdio.h> int main(int argc, char const *argv[]) { int year; scanf("%d", &year); if (year < 0) printf("err!\n"); else if ((year % 400 == 0) || (year % 100 != 0 && year % 4 == 0)) printf("闰年!\n"); else printf("平年!\n"); return 0; }还要两个比较好的例题可以看一下:
a=1;b=2;x=0; if(!(--a)) x--; if(!b) x=7; else ++x;1. 这段程序运行后,x的值是(0)
#include <stdio.h> int main() { if(-1) printf("1"); else printf("2"); if(0) printf("3"); else printf("4"); return 0; }2. 这段程序的输出结果是(14)
总结:
- 首先判断表达式是否成立,如果成立就执行if下面的语句,否则执行else下面的语句块。
- if 后面可以没有else, 但是else前面必须有if
- if和else后面如果只有一行语句可以省略花括号{}
1.2 switch case 语句
{
case 常量1: 语句块1; break;
case 常量2: 语句块2; break;
....
case 常量n: 语句块n;break;
default: 语句块n+1;
}
执行顺序:当变量或者表达式的结果与其中一个case语句的常量相符时,就执行此case后面的语句块,并且依次执行后面所有case中的语句,除非遇到break语句就跳出switch语句。如果变量或表达式所有的case语句常量都不相符时,就执行default语句后面的语句块。
注意:
- 表达式不能是浮点或字符串
- case后面的break可以省略,但是省略时会顺序往下执行,直到遇到break结束。
练习:从终端输入一个日期
scanf ("%d %d %d ", &year , &mon , &day ),判断这是这一年的第几天
(提示:判断闰年还是平年,闰年且闰年二月份以上比平年多一天。普通年份除以4,有余数是平年,对于整百的年份,比如2100年,要除以400,有余数就是平年,整除就是闰年。)
下面这个写法是个非常深得我心的做法:
#include <stdio.h> int main(int argc, char const *argv[]) { int year, mon, day, days = 0; int leap = 0; scanf("%d %d %d", &year, &mon, &day); leap = (year % 400 == 0) || (year % 100 != 0 && year % 4 == 0); // 闰年leap为1,平年为0 switch (mon) { case 12: days += 30; case 11: days += 31; case 10: days += 30; case 9: days += 31; case 8: days += 31; case 7: days += 30; case 6: days += 31; case 5: days += 30; case 4: days += 31; case 3: days += 28 + leap; // 加上二月的天数,考虑平润年 case 2: days += 31; // 加一月的天数 case 1: days += day; // days=days+day, 加上当月的天数 break; default: printf("mon err\n"); break; } printf("%d\n", days); return 0; }总结:
执行顺序:先判断switch()中的结果是否满足下面的case,如果满足则执行case后面的语句块,如果都不满足则执行default中的语句。
如果case的语句和下面case的语句相同,则可以省略,形式如下:
- case 常量1:
- case 常量2: 语句块;break;
遵守switch语句规则
switch语句非常有用,但在使用时必须谨慎。所写的任何switch语句都必须遵循以下规则:
1. 只能针对基本数据类型中的整型类型使用switch,这些类型包括int、char等。对于其他类型,则必须使用if语句。
2. case标签必须是常量表达式,如42或者'4'。
3. case标签必须是唯一性的表达式;也就是说,不允许两个case具有相同的值。