前言:讲完了基础知识,今天我们就正式的开始了专题讲解了,后续博主还会更新函数、数组、操作符、指针、结构体等专题知识。因为博主也是个刚接触C语言的小白,文章难免会有些不足,但我会用心的写好这些专题,话不多说我们正式开始学习。
if是分支语句也可以叫做条件语句,if分支语句有四种写法,这里我们一起研究一下
这里的一个大括号 {} 被称为一个分支,if可以翻译为如果,所以也可以称为条件语句,当表达式为真时则执行大括号里的语句,当表达式为假时就不执行这个 if 语句,当然大括号里的语句数量可以是随机的,根据自己需求定的。注意:在C语言中用0表示"假",一切非零的值都是"真"。
例:
#include
int main()
{
int i = 0;
//输入i的值
scanf("%d", &i);
if (i < 10)
{
printf("%d\n", i);
}
return 0;
}
这里我们输入一个数判断 i 是否小于10,如果小于10就为真,则打印输入的值 i , 大于10就为假,则不执行 if 里的语句。
else表示其他。当表达式为真时,执行分支1中的语句,当表达式为假时则执行else中的语句,注:使用这种写法时一定会有一个分支执行。
例:
#include
int main()
{
int i = 0;
//输入i的值
scanf("%d", &i);
if (i < 10)
{
printf("i = %d\n", i);
}
else
{
printf("Hello\n");
}
return 0;
}
这种写法就是先判断表达式1,为"真"则执行分支1,执行后整个 if 语句就结束了,如果表达式1为"假",则判断表达式2,为真则执行分支2,执行后整个if 语句就结束。以此类推,即只要执行一个分支,if 语句就结束。如果所以表达式都为假,就等于不执行整个 if 语句。
例:
#include
int main()
{
int i = 0;
//输入i的值
scanf("%d", &i);
if (i < 10) //分支1
{
printf("haha\n");
}
else if (i > 12)//分支2
{
printf("yyds\n");
}
else if (i == 10)//分支3
{
printf("Hello\n");
}
return 0;
}
这种写法可以从上面三种写法推理出当分支3及之前的分支都为假时,则执行else。使用这种写法时一定会有一个分支执行。 这里可以通过上面三种例子推出所以博主就不举例了。
注:使用switch语句时,switch() 括号里不能使用浮点数,不然会报错,case语句的缩进和switch一样
这里我们上代码讲解:
#include
int 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后的值进行匹配。
而default语句的作用就是当你输的值与case的值都不相符时,则执行default中的语句,当然在switch分支语句中default语句是可写可不写的。
当然case语句中的break是可以省略的,当省略时就会发生case穿透现象,例:
#include
int 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语句中可以什么都不写:
#include
int 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;
}
#include
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:
#include
int 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循环的初始化表达式和更新表达式是可以不写的,而条件表达式一般都要写,不写就会判定恒为"真",进入死循环,不管你有没有省略表达式
分号(;)都是不能省略。
#include
int main()
{
int i = 1;
for (; i <= 10; )
{
printf("%d ", i);
i++;
}
return 0;
}
1.先判断条件表达式为"真"还是"假",为真则执行循环语句,执行后再判断条件语句…直到条件表达式为假while循环终止。
#include
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ",i);
i++;
}
return 0;
}
这样写得的效果和for循环是一样的,并且也很相似,大家可以模拟一下执行顺序体会一下。其结果为:
执行原理:
1.do while 的执行原理其实和while的执行原理很相似。进来直接执行循环体中的语句,再进行条件表达式的判断,这里需要注意while()后需要加分号。 使用do while 循环一定会执行循环体一次。
continue为继续的意思,用于for、while、do while循环,作用是终止本次循环,进入下一次循环继续执行。
int main()
{
int i = 0;
for (i = 0; i <= 3; i++)
{
if (i == 2)
{
continue;
}
printf("%d\n", i);
}
}
这里为什么不是打印0 1 2 3 呢,因为当第三次循环时i = 2 ,if 条件语句判断为真执行continue,使其不执行后面的语句直接进行下一次循环,这时候 i++,再判断。
#include
int main()
{
int i = 1;
while (i <= 5)
{
if (i == 2)
{
continue;
}
printf("%d\n", i);
i++;
}
}
我们可以看到光标闪着不动,这是死循环的意思,这是因为当第二次进入循环时i = 2,这时 if 语句的判断为真,进入分支,执行continue,使其进行下一次循环而不执行后面的数,这时 i 得不到改变,就会一直以2的值进入循环,再执行if语句,从而导致死循环。为了防止死循环我们可以把i++放在if 上面。
#include
int main()
{
int i = 0;
do {
printf("haha");
continue;
i++;
} while (i < 3);
}
这里我们可以自己练习一下看看结果会怎样。
1.用于switch语句,防止case发生穿透现象。
2.用于for、while、do while循环,终止循环的执行。
当我们把上面的continue换为break又会怎样呢
#include
int main()
{
int i = 0;
for (i = 0; i <= 3; i++)
{
if (i == 2)
{
break;
}
printf("%d\n", i);
}
}
打印 0 和 1 ,当第三次进入循环体时i = 2,符合 if 条件语句,则执行break,for循环直接结束。
这里的break运用到while 、do while都没什么陷阱,和for都是一样的,遇到break后直接结束循环。
以下可以看到用getchar接收一个字符,再用putchar输出字符,当其不等于EOF时就一直打印,即不为字符时,就等于EOF,用int a = 0,是因为getchar返回的是int类型
接下来我们来模拟一下用户登录的场景
#include
int 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,所以缓冲区里会有123456\n
这时我们只需在用getchar把\n接收走。
#include
int 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,这时缓冲区还剩下:"空格"abcd\n,而使用一个getchar只是把空格拿走,后面还剩下abcd\n所以需要用到循环来接收。
#include
int 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
好了分支与循环我们学到这里就到这里结束了,如果对你有帮助的话记得收藏一下哦,喜欢本章节的也可以动动小手点个赞。如果发现文章中有错误的话,请各位大佬及时指正,谢谢各位啦。