switch-default
如果表达的值与所有的case标签的值都不匹配怎么办?其实也没什么,结构就是所有的语句都被跳过而已。程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?
你可以在语句列表中增加一条default子句,把下面的标签:default:写在任何一个 case 标签可以出现的位置。
当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。
所以,每个switch语句中只能出现一条default子句。
但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。
任意位置,而且只能出现一次!
#include <stdio.h> int main() { int n = 1; int m = 2; switch (n) { case 1: m++; // m:3 case 2: n++; // n:2 case 3: switch (n) {//switch允许嵌套使用 case 1: n++; //这里不会执行!因为条件是1,但是n是2 case 2: m++; //m:4 n++;//n:2 break; } case 4: m++;//m:5 break; default: break; } printf("m = %d, n = %d\n", m, n); return 0; }
为什么是这个结果,大家一定要明白这个执行逻辑顺序,这里强调的是:break是跳出,如果没有写就会一次执行,但是前提是必须要满足这个条件(和变量有一一对应),且依次执行后面的语句。
这样对应上面的代码就可以完全可以看懂了!
switch也是选择题里面经常会考察的一个点,如果你觉得它难,那一定是没有理解到精髓,建议多看和多测试!
循环语句
while循环
当条件满足的情况下,if语句后的语句执行,否则不执行。但是这个语句只会执行一次。由于我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。那我们怎么做呢?
C语言中给我们引入了: while 语句,可以实现循环。
//while 语法结构 while(表达式) 循环语句;
表达式成立:1,不成立:0
死循环演示
#include <stdio.h> int main() { int i = 0; while (1) { i++; printf("正在执行第%d次任务!",i); } return 0; }
在写代码的过程中,我们需要避免死循环的产生!
break与continue
在循环中,我们经常需要使用这两个关键词关键词进行跳出循环,最终达到我们所需的要求的!
其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。
所以:while中的break是用于永久终止循环的。
我们在写代码的过程中,一定要学会自己分析算法,一般的考试和面试重点在于如何使用代码完成这个算法功能效果
九九乘法表(while)
比如,我们可以利用while循环自己写一个九九乘法表:
#include <stdio.h> int main() { int i = 0; while (i < 9) { i++; int j = 0; while (j < i) { j++; printf("%d*%d=%d\t", i, j, i * j); } printf("\n"); } return 0; }
那么有的同学就会疑问,如果是嵌套循环的话,break是怎么个规则法呢?
它的规则是,跳出本次循环,而不是全部循环!
#include <stdio.h> int main() { int i = 0; while (i < 5) { printf("%d", i); while (i < 5) { if (i == 0) { break; } } } return 0; }
其次:continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,
而是直接跳转到while语句的判断部分。进行下一次循环的入口判断
#include <stdio.h> int main() { int ch = 0; while ((ch = getchar()) != EOF) putchar(ch); return 0; }
这个代码是什么意思呢?
首先getchar()是读取字符,但是它会把\0也读进去,也就是说,我们输入一个字符,一般不是一个字符,它还有一个反斜杠0
这里EOF是文件读取错误的一种显示!那么如果,我们需要达到回车之后,不进入下一行又该怎么去实现呢?
#include <stdio.h> int main() { char ch = '\0'; while ((ch = getchar()) != EOF) { if (ch < ‘0’ || ch > ‘9’) continue; putchar(ch); } return 0; }
这个代码的作用是:只打印数字字符,跳过其他字符的,具有清空缓冲区的作用!
密码区缓冲代码
那么在日常的生活中我们有什么具体的案例?
假设,目前需要你写一个密码验证程序,用户输入密码进行确认,然后进行判断密码是否正确!
#include <stdio.h> int main() { char passwoed[15] = { 0 }; printf("请设置你的密码():"); scanf("%s", &passwoed);//读取密码,但是在终端我们会回车 //清空缓冲区,将\n清空,因为scanf只会接收password这个里面的东西 getchar(); printf("输入Y确认:"); getchar();//清空缓冲区 char result = getchar(); if (result = 'Y') { printf("确认成功!"); } else { printf("确认失败!"); } return 0; }
简单的来说就是,getchar()可以用来清空缓冲区,这样就避免bug的出现!
这样看来,C语言果然适合做一些系统和软件的设计,在python语言中,我们都不用担心这些东西!
但是真的这个程序就是没有bug的吗?我们如果请专业的测试人员,可能一测试!
当我们的密码里面出现空白格之后,也是不可以的,同时当我们输入过快的时候,没有输入Y而是输入的回车那么他也确认成功?
原来是,之前这个等号没有写出双等号!第一个bug解决了,那么我们继续解决第二个!
#include <stdio.h> int main() { char passwoed[15] = { 0 }; printf("请设置你的密码():"); scanf("%s", &passwoed);//读取密码,但是在终端我们会回车 //清空缓冲区,将\n清空,因为scanf只会接收password这个里面的东西 getchar(); printf("输入Y确认:"); //getchar();//清空缓冲区 int temp = 0; while ((temp = getchar()) != '\n') { ; } char result = getchar(); if (result == 'Y') { printf("确认成功!"); } else { printf("确认失败!"); } return 0; }
每文一语
日积月累才是最好的前进!