题目
原题
- 简述一下switch的语法, switch支持哪些类型的值
- 什么是switch的穿透
- 实际开发中 通常哪些判断使用if 哪些判断使用switch
作答
1. 简述一下switch的语法, switch支持哪些类型的值
switch 是一种选择结构的语句,用来代替简单的、拥有多个分枝的 if else 语句,基本格式如下:
switch(表达式){
case 整型数值1: 语句 1;
case 整型数值2: 语句 2;
…
case 整型数值n: 语句 n;
default: 语句 n+1;
}
它的执行过程是:
1) 首先计算“表达式”的值,假设为 m。
2) 从第一个 case 开始,比较“整型数值1”和 m,如果它们相等,就执行冒号后面的所有语句,也就是从“语句1”一直执行到“语句n+1”,而不管后面的 case 是否匹配成功。
3) 如果“整型数值1”和 m 不相等,就跳过冒号后面的“语句1”,继续比较第二个 case、第三个 case……一旦发现和某个整型数值相等了,就会执行后面所有的语句。
假设 m 和“整型数值5”相等,那么就会从“语句5”一直执行到“语句n+1”。
4) 如果直到最后一个“整型数值n”都没有找到相等的值,那么就执行 default 后的“语句 n+1”。
支持的数据类型
字符型,只有字符常量可以,例如’a’‘b’‘6’’\r’实际上是整型.
布尔型——真,假,实际上是0,1
整型凡表达式值为整型的都可以.
enum型也可以,因为它模拟0,1,2,3…
字符,布尔等这些类型会自动转换为整型
case 后面必须是一个整数,或者是结果为整数的表达式,但不能包含任何变量。
2. 什么是switch的穿透
c语言的switch语句是穿透的。也就是说当程序判断某个case的条件为真后,
它将在执行该case所带的的语句块之后不再对后面的case的条件进行判断而直接执行。
直到遇到一个break(一般在运用时会在每一个case的语句后加一个break;以停止switch())
3. 实际开发中 通常哪些判断使用if 哪些判断使用switch
if使用的场景:
1).针对结果是boolean类型的判断
2).针对一个范围的判断
3).针对几个常量值的判断
switch语句:
针对几个常量值的判断
代码
#include <stdio.h>
#include <windows.h>
void Bool1(double* a);
int main()
{
double year, month, day;
int february, date = 0; //定义年月日 二月的天数 以及总天数
int year_s, month_s, day_s = 0;
int i = 0; //用于跳出循环
system("title 【婳骨】の记天数小玩意");
printf("欢迎使用【婳骨】の记天数小玩意\n\n请依次输入年、月、日:\n如带有小数仅取整数部分,注意月与日的范围!\n");
printf("年:");
Bool1(&year);
year_s = (int)year;
while (1)
{
printf("月:");
Bool1(&month);
month_s = (int)month;
if (month > 0.0 && month < 13.0)
{
break;
}
printf("范围不对,请重新输入");
}
if (year_s % 400 == 0 || (year_s % 4 == 0 && year_s % 400 != 0)) //判断是否为闰年
{
printf("这一年是闰年!\n");
february = 29;
}
else
{
february = 28;
printf("这一年不是闰年!\n");
}
printf("这一年二月有%d天\n", february); //打印二月份的天数
while (1)
{
printf("日:");
Bool1(&day);
day_s = (int)day;
switch (month_s)
{
case 1:
case 3:
case 5:
case 7:
case 9:
case 11:
if (day < 1 || day > 31) printf("不在范围内,请重新输入"); //判断奇数月天数
else i = 1; //用来跳出while循环
break;
case 4:
case 6:
case 8:
case 10:
case 12:
if (day < 1 || day > 30) printf("不在范围内,请重新输入"); //判断偶数月(除2月)天数
else i = 1;
break;
case 2:
if(day < 1 || day > february) printf("不在范围内,请重新输入"); //判断2月天数
else i = 1;
break;
default:
printf("输入错误,请重新输入");
}
if (i == 1)break; //判断是否跳出天数的while循环
}
printf("%d年%d月%d日\n", year_s, month_s, day_s);
switch (month_s) //根据switch()的穿透性 计算总天数
{
case 12:
date += day_s;
day_s = 30;
case 11:
date += day_s;
day_s = 31;
case 10:
date += day_s;
day_s = 30;
case 9:
date += day_s;
date = 31;
case 8:
date += day_s;
day_s = 31;
case 7:
date += day_s;
day_s = 30;
case 6:
date += day_s;
day_s = 31;
case 5:
date += day_s;
day_s = 30;
case 4:
date += day_s;
day_s = 31;
case 3:
date += day_s;
day_s = february;
case 2:
date += day_s;
day_s = 31;
case 1:
date += day_s;
}
printf("\n这是这一年的第 %d 天。\n蟹蟹使用!('ω')!", date);
return 0;
}
void Bool1(double* a) //对输入数据进行判断
{
do
{
if (scanf_s("%lf", a) == 1)
{
break;
}
char choice;
while ((choice = getchar()) != '\n' && choice != EOF);
printf("输入的不是数字!\n");
}
while (scanf_s("%lf", a) != 1);
}
部分运行结果
另
再次感谢顾北组长长~