前言:讲完了基础知识,今天我们就正式的开始了专题讲解了,后续博主还会更新函数、数组、操作符、指针、结构体等专题知识。因为博主也是个刚接触C语言的小白,文章难免会有些不足,但我会用心的写好这些专题,话不多说我们正式开始学习。
文章目录- 一、分支语句
- I. 分支语句if
- 1.第一种写法
- 2.第二种写法
- 3.第三种写法
- 4.第四种写法
- II. 分支语句switch
- 1.用法
- 2.case穿透现象
- 3.用字符型
- 二、 循环语句
- I. for循环
- II. while循环
- III. do while循环
- 三、continue和break
- I. continue
- 1.用于for循环:
- 2.用于while循环
- 3.用于do while 循环
- II. break
- 四、getchar和putchar
- 五、练习
1.第一种写法if是分支语句也可以叫做条件语句,if分支语句有四种写法,这里我们一起研究一下
if的第一种写法为:
这里的一个大括号 {} 被称为一个分支,if可以翻译为如果,所以也可以称为条件语句,当表达式为真时则执行大括号里的语句,当表达式为假时就不执行这个 if 语句,当然大括号里的语句数量可以是随机的,根据自己需求定的。注意:在C语言中用0表示"假",一切非零的值都是"真"。
例:
#includeint main() { int i = 0; //输入i的值 scanf("%d", &i); if (i < 10) { printf("%dn", i); } return 0; }
2.第二种写法这里我们输入一个数判断 i 是否小于10,如果小于10就为真,则打印输入的值 i , 大于10就为假,则不执行 if 里的语句。
else表示其他。当表达式为真时,执行分支1中的语句,当表达式为假时则执行else中的语句,注:使用这种写法时一定会有一个分支执行。
例:
#includeint main() { int i = 0; //输入i的值 scanf("%d", &i); if (i < 10) { printf("i = %dn", i); } else { printf("Hellon"); } return 0; }
当条件成立时则打印 i 后结束:
3.第三种写法当条件不成立时则打印 Hello 后结束:
这种写法就是先判断表达式1,为"真"则执行分支1,执行后整个 if 语句就结束了,如果表达式1为"假",则判断表达式2,为真则执行分支2,执行后整个if 语句就结束。以此类推,即只要执行一个分支,if 语句就结束。如果所以表达式都为假,就等于不执行整个 if 语句。
例:
#includeint main() { int i = 0; //输入i的值 scanf("%d", &i); if (i < 10) //分支1 { printf("hahan"); } else if (i > 12)//分支2 { printf("yydsn"); } else if (i == 10)//分支3 { printf("Hellon"); } return 0; }
当分支1的条件为真时打印 haha 后语句结束:
当分支1为假,分支2为真时打印 yyds 后语句结束:
当分支1 2都为假,分支3为真时打印 Hello 后语句结束:
当分支1 2 3都为假时则不执行:
II. 分支语句switch 1.用法这种写法可以从上面三种写法推理出当分支3及之前的分支都为假时,则执行else。使用这种写法时一定会有一个分支执行。 这里可以通过上面三种例子推出所以博主就不举例了。
注:使用switch语句时,switch() 括号里不能使用浮点数,不然会报错,case语句的缩进和switch一样
这里我们上代码讲解:
#includeint main() { int day = 0; //我们把day当做星期,输入星期几。 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("输入的值不在范围内,"); } return 0; }
用法:switch(表达式)中的表达式中的值和case的值进行匹配,如果相同则执行这条case语句,即day的值与case后的值进行匹配。
这里我们输入2则执行case 2:的语句即打印星期二。
输入6则打印星期六:
2.case穿透现象而default语句的作用就是当你输的值与case的值都不相符时,则执行default中的语句,当然在switch分支语句中default语句是可写可不写的。
当然case语句中的break是可以省略的,当省略时就会发生case穿透现象,例:
#includeint main() { int day = 0; //我们把day当做星期,输入星期几。 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"); break; case 6: printf("星期六n"); break; case 7: printf("星期日n"); break; default: printf("输入的值不在范围内,"); } return 0; }
执行结果:
当输入2时与case匹配,则输入星期二,而当没有break时,就会一直往下执行,去找break,找到后就停止。
当然case语句中可以什么都不写:
#includeint main() { int day = 0; //我们把day当做星期,输入星期几。 scanf("%d", &day); switch (day) { case 1: case 2: case 3: case 4: case 5: printf("上学n"); case 6: case 7: printf("打游戏n"); } return 0; }
这里1 2 3 4 5都是上学,而6 7则是打游戏:
#include二、 循环语句 I. for循环int main() { char a = '0'; //输入字符给a scanf("%c", &a); switch (a) { case 'A': printf("睡觉"); break; case 'B': printf("学习"); break; case 'C': printf("吃饭"); } return 0; }
第一:初始化表达式最先执行,并且在整个循环中只执行一次。
第二:条件表达式结果必须是"真"或"假",即0和非零的表达式。
执行原理:
1.先执行初始化表达式,并且初始化表达式只执行1次。
2.然后判断条件表达式的结果,如果条件表达式结果为true,则执行循环体。
3.循环体结束之后,执行更新表达式。
4.更新完之后,再判断条件表达式的结果,如果还是真,继续执行循环体,以此类推,直到条件表达式为"假"时for循环终止
这里我们可以看图执行完1~5的顺序后如果条件表达式为真,则继续执行(这里看灰色线),直到条件表达式为假,for循环结束。
例如我们想打印1~10:
#includeint main() { int i = 0; for (i = 1; i <= 10; i++) { printf("%d ", i); } return 0; }
第一次执行 i = 1,然后执行判断语句判断 i <= 10,为真则执行循环体中语句,执行完循环体,则 i++,此时i = 2,再执行判断语句 i <= 10,为真时执行循环体中的语句…,以此类推,直到第十次循环完后此时i = 10,执行i++后,i = 11,再执行 i <= 10,此时可以看出条件不成立即为假,所以for循环终止。
当然for循环的初始化表达式和更新表达式是可以不写的,而条件表达式一般都要写,不写就会判定恒为"真",进入死循环,不管你有没有省略表达式
分号(;)都是不能省略。
#includeint main() { int i = 1; for (; i <= 10; ) { printf("%d ", i); i++; } return 0; }
for循环还可以输入多个条件如图:
执行原理:
1.先判断条件表达式为"真"还是"假",为真则执行循环语句,执行后再判断条件语句…直到条件表达式为假while循环终止。
#includeint main() { int i = 1; while (i <= 10) { printf("%d ",i); i++; } return 0; }
这样写得的效果和for循环是一样的,并且也很相似,大家可以模拟一下执行顺序体会一下。其结果为:
三、continue和break I. continue执行原理:
1.do while 的执行原理其实和while的执行原理很相似。进来直接执行循环体中的语句,再进行条件表达式的判断,这里需要注意while()后需要加分号。 使用do while 循环一定会执行循环体一次。
continue为继续的意思,用于for、while、do while循环,作用是终止本次循环,进入下一次循环继续执行。
1.用于for循环:int main()
{
int i = 0;
for (i = 0; i <= 3; i++)
{
if (i == 2)
{
continue;
}
printf("%dn", i);
}
}
2.用于while循环这里为什么不是打印0 1 2 3 呢,因为当第三次循环时i = 2 ,if 条件语句判断为真执行continue,使其不执行后面的语句直接进行下一次循环,这时候 i++,再判断。
#includeint main() { int i = 1; while (i <= 5) { if (i == 2) { continue; } printf("%dn", i); i++; } }
结果:
3.用于do while 循环我们可以看到光标闪着不动,这是死循环的意思,这是因为当第二次进入循环时i = 2,这时 if 语句的判断为真,进入分支,执行continue,使其进行下一次循环而不执行后面的数,这时 i 得不到改变,就会一直以2的值进入循环,再执行if语句,从而导致死循环。为了防止死循环我们可以把i++放在if 上面。
#includeint main() { int i = 0; do { printf("haha"); continue; i++; } while (i < 3); }
这里我们可以自己练习一下看看结果会怎样。
II. break1.用于switch语句,防止case发生穿透现象。
2.用于for、while、do while循环,终止循环的执行。
当我们把上面的continue换为break又会怎样呢
#includeint main() { int i = 0; for (i = 0; i <= 3; i++) { if (i == 2) { break; } printf("%dn", i); } }
打印 0 和 1 ,当第三次进入循环体时i = 2,符合 if 条件语句,则执行break,for循环直接结束。
这里的break运用到while 、do while都没什么陷阱,和for都是一样的,遇到break后直接结束循环。
四、getchar和putchargetchar的返回值为int类型。
当gatchar不为字符时返回EOF。
以下可以看到用getchar接收一个字符,再用putchar输出字符,当其不等于EOF时就一直打印,即不为字符时,就等于EOF,用int a = 0,是因为getchar返回的是int类型
接下来我们来模拟一下用户登录的场景
#includeint main() { char password[20] = { 0 }; printf("请输入密码:"); //输入密码 scanf("%s", password); printf("请确定密码(Y/N):"); int ch = getchar();//输入Y/N放到ch中 if (ch == 'Y') { printf("确定成功n"); } else { printf("确定失败n"); } return 0; }
按道理来说我们输入密码后,就能输入Y/N确定密码了。但为什么会不输Y/N就给出确定失败呢。原因是当我们使用输入函数时都会先放缓冲区,当我们使用scanf函数在键盘上输入123456时,需要按回车键确定输入的数,即n,所以缓冲区里会有123456n
这时我们只需在用getchar把n接收走。
#includeint main() { char password[20] = { 0 }; printf("请输入密码:"); //输入密码 scanf("%s", password); printf("请确定密码(Y/N):"); getchar();//把n拿走 int ch = getchar();//输入Y/N放到ch中 if (ch == 'Y') { printf("确定成功n"); } else { printf("确定失败n"); } return 0; }
这里我们可以看到可以正常的判断了,但问题又来了如果用户这样输入呢:
当我们使用scanf接收123456时,用空格时,空格前面表示123456输入给一个变量,即变量ch,这时缓冲区还剩下:"空格"abcdn,而使用一个getchar只是把空格拿走,后面还剩下abcdn所以需要用到循环来接收。
#includeint main() { char password[20] = { 0 }; printf("请输入密码:"); //输入密码 scanf("%s", password); printf("请确定密码(Y/N):"); int teap = 0; while ((teap = getchar()) != 'n')//用于接收多余的值 { ;//空语句 } int ch = getchar();//输入Y/N if (ch == 'Y') { printf("确定成功n"); } else { printf("确定失败n"); } return 0; }
while ((teap = getchar()) != 'n')
{
;//空语句
}
这个的意思是用getchar()返回的字符然后赋值给变量teap,当其接收到 n 时,while循环执行的条件就不满足了,这时缓冲区的值也都被拿出来了,所以下一个getchar()光标会停下等待输入字符.
这次我们再来看看结果:
这时我们可以看到成功了。这里我们可以先理解再自己把完整的把代码敲出来。
我们做些练习来巩固一下知识:
小练习1
好了分支与循环我们学到这里就到这里结束了,如果对你有帮助的话记得收藏一下哦,喜欢本章节的也可以动动小手点个赞。如果发现文章中有错误的话,请各位大佬及时指正,谢谢各位啦。



