我们先来讲一下switch case语句
int main()
{
int a = 0;
while (1)
{
printf("qing shu ru shuzi\n");
scanf("%d", &a);
switch (a)
{
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;
}
我们知道,任何具有判断能力的语法结构,都必须具有:判定和分支功能
switch case语句也同样相同:switch case语句中,case充当判定功能,break充当分支功能,switch(),括号内部的元素必须为整型或者整型表达式:注意:short char等都是整型
我们知道,case语句充当判定功能,那么break是如何充当分支功能呢?
我们对代码进行修改:我们把周一到周三的break语句去除掉
int main()
{
int a = 0;
while (1)
{
printf("qing shu ru shuzi\n");
scanf("%d", &a);
switch (a)
{
case 1:
printf("星期一\n");
case 2:
printf("星期二\n");
case 3:
printf("星期三\n");
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期日\n");
break;
}
}
return 0;
}
我们进行编译,输入1
我们可以发现,结果出现星期一 二三 四,原因是什么?
答:switch case语句中的break起到了分支功能,如果没有break,case 1 2 3 4中的语句就会混淆在一起,所以break起到了分支功能
第二点:switch语句记得要加上default,default的意思是假如以上条件全部不满足,就执行default语句
第二个问题,能否在case语句和break之间创建变量
答:不能,例如
int main()
{
int a = 0;
while (1)
{
printf("qing shu ru shuzi\n");
scanf("%d", &a);
switch (a)
{
case 1:
int b = 10;
printf("星期一\n");
printf("星期一\n");
printf("星期一\n");
printf("星期一\n");
printf("%d\n", b);
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;
}
我们在case 1和break之间初始化代码创建变量b,进行运行,
代码报错,那么如何正确书写呢?
我们直接在case语句内部加上花括号即可
int main()
{
int a = 0;
while (1)
{
printf("qing shu ru shuzi\n");
scanf("%d", &a);
switch (a)
{
case 1:
{
int b = 10;
printf("星期一\n");
printf("星期一\n");
printf("星期一\n");
printf("星期一\n");
printf("%d\n", b);
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;
}
如何写出多条case语句执行同一个语句的代码?例如case1到5运行时打印结果周内,case6到7运行时打印结果周末
答:很简单,我们只需要删掉case1到case4的全部内容,在case5语句的内部写出我们所要执行程序的结果,case6 和7也同理
int main() { int a = 0; while (1) { printf("qing shu ru shuzi\n"); scanf("%d", &a); switch (a) { case 1: case 2: case 3: case 4: case 5: printf("周内\n"); break; case 6: case 7: printf("周末\n"); break; default : printf("你输入的日期有误,请重新输入\n"); break; } } return 0; }
我们进行运行
注意:default语句不一定全部都要放在末尾,default语句可以放在switch语句内部的任意位置,并不会影响代码的逻辑执行顺序
如何使用switch case语句在我们想要中断的case语句部位中断?
int main() { int b = 0; while (!b) { printf("qing shu ru shuzi\n"); int a = 0; scanf("%d", &a); switch (a) { case 1: case 2: b = 1; case 3: case 4: case 5: printf("周内\n"); break; case 6: case 7: printf("周末\n"); break; default : printf("你输入的日期有误,请重新输入\n"); break; } } return 0; }
如代码所示,我们首先创建变量b,变量b=0,我们的while循环判断语句内容是!b,b=0,在逻辑上是否的意思,!b在逻辑上是是的意思,我们进入循环,在想要终止的case语句内部把b初始化为1,那么!b的结果就是0,退出循环。
我们都知道,case 语句后面的是常量,我们的const修饰的常变量能否直接作为case语句的判断条件呢?
答:我们写代码来进行检测
int main() { const int a = 10; switch (1) { case a: printf("4"); break; default : break; } return 0; }
我们进行编译,代码报错
所以 const修饰的长变量是不能直接当作case的判断条件的,case语句的判断条件必须是严格意义上的整型
那么宏定义的可以吗?
答:我们进行检测
#define A 10 int main() { int a = 10; switch (a) { case A: printf("4"); break; default : break; } }
我们进行编译
所以宏定义的变量是能够被当作case语句的判定条件的
注意:我们在排列case语句时,可以通过case语句的执行频率来排列case语句 ,也就是最常执行的放在最前面,最少执行的放在最后面
for死循环该如何书写
int main() { for ( ; ; ) { printf("."); } return 0; }
我们进行编译
在任何c程序中,在默认编译好之后,都有三个输入输出流
stdin:标准输入 文件名是FILE*STDIN ,对应的是键盘
stdout :标准输出 文件名FILE*STDOUT ,对应的是显示器
stderr:标准错误 文件名是FILE*STDERR ,对应的是显示器
现阶段的学习,我们只需要记住就可以
getchar需要注意的一些事项
getchar会接受键盘上的回车键,会把他默认为换行符
例如
int main() { while (1) { int c = getchar; if (c == '#') { break; } printf("%c\n", c); } return 0; }
因为我们的getchar识别键盘上的回车键作为换行符,又因为我们打印时,又写了一个换行,所以程序运行时,会隔两行
所以我们在调用getchar函数时,不用换行分割符,因为getchar自身就会识别我们回车键给的换行符
我们去掉我们自己加上的换行符后
代码就恢复正常了
第二个注意事项
我们知道,getchar接受的是字符,为什么返回的要是整型呢?
答:假如我们输入成功,没什么两样,假如我们输入失败,因为我们char的类型的有效数字是0到255,换算成二进位制就是0000 0000到1111 1111,假设我们的错误对应的二进位制是10000 0000,那么我们在返回时,只能返回后八位,也就是0000 0000,那么在编译器看来,我们输入的值仍在合法范围内,输入依旧成功
注意:我们在键盘中输入的内容,或者显示器打印的内容全部都是字符
我们进行验证
int main()
{
int ret=printf("%d", 1234);
printf("%d", ret);
return 0;
}
我们进行编译
我们可以发现,printf实际上是字符,我们输入了四个数字,所以就是四个字符
例如
int main()
{
int a = 0;
scanf("%d", &a);
}
假设我们输入的数字是1234,那么实际上,输入的是四个字符,这四个字符是1,2,3,4