🐒博客名:苏sir很奈斯
📚学习格言:别人可以拷贝我的模式,但不能拷贝我不断往前的激情
目录
目录
1.什么是语句
2.分支语句
那if语句的语法结构是怎么样的呢?
2.1if语法结构
if(表达式)
语句;
if(表达式)
语句1;
else
语句2;
//多分支
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
注意:else ...... if不能单独出现,必须结合if,多重if中的else - if没有上限,写多少都可以, 多重if中的else可写可不写,根据需求是否书写。
代码演示:
//代码1单分支
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age<18)
{
printf("未成年\n");
}
else
{
printf("成年\n");
}
return 0;
}
//代码2多分支
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age<18)
{
printf("少年\n");
}
else if(age>=18 && age<30)
{
printf("青年\n");
}
else if(age>=30 && age<50)
{
printf("中年\n");
}
else if(age>=50 && age<80)
{
printf("老年\n");
}
else
{
printf("老寿星\n");
}
return 0;
}
2.2 if中的赋值
代码演示:
#include<stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
if (a = 1)
{
printf("a为真");
}
else
printf("a为假");
return 0;
}
注:当我们输入大于1的值,if语句判断为真,则打印真,否则a为假。
2.3悬空else
注:悬空else的意思是书写代码风格的问题
我们来看看不好的代码风格容易造成的误解
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
注:这里会让人误以为如果if(a==1)不成立,则就打印haha。其实这个else是就近原则,对应的是if(b==2)这个if语句,而不是对应if(a==1)这个语句.
改正 :
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
{
if(b == 2)
{
printf("hehe\n");
}
}
else
{
printf("haha\n");
}
return 0;
}
注:
1. 适当的使用{}可以使代码的逻辑更加清楚。
2.代码风格很重要
2.4 switch语句
switch(整型表达式)
{
语句项;
}
//而语句项是什么呢?
//是一些case语句:
//如下:
case 整形常量表达式:
语句;
2.4.1 在switch语句中的 break
在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。
代码演示:
#include <stdio.h>
int main()
{
int day = 0;
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: //这里的default可以放在break语句中的任意位置
printf("选择错误");
break;
}
return 0;
}
注意:这里的Switch的括号里面只能放入整型表达式。如果放入浮点型或者其他形式,编译器会报错。而case只能放入整型常量表达式,如果放入变量,编译器也会直接报错。break语句是指退出循环,或退出分支的语句。default语句指的是执行在上述case情况没有包含的所有部分。
3.循环语句
3.1while循环
C语言中给我们引入了: while 语句,可以实现循环
//while 语法结构
while(表达式)
循环语句;
实现代码演示:在屏幕上打印1-10个数字
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
printf("%d ", i);
i = i+1;
}
return 0;
}
注:这里的代码是如何执行的呢?
1.i=1进入while括号里的判断条件,如果符合括号里的判断条件,则进行while循环。
2.循环到不满足这个循环条件的时候则退出循环。
3.2while语句中的break和continue
代码演示:break在while循环中的运用
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
break;
printf("%d ", i);
i = i+1;
}
return 0;
}
这里代码的输出结果是: 1 2 3 4
总结:
break在while循环中的作用:其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。所以:while中的break是用于 永久终止循环的。
continue介绍
代码演示:
#include <stdio.h>
int main()
{
int i = 0;
while (i < 10)
{
i = i + 1;
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
这里代码的输出结果是:1 2 3 4 6 7 8 9 10
总结:
continue在while循环中的作用就是:continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
3.3 getchar和 putchar的应用
代码演示:
#include <stdio.h>
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
putchar(ch);
return 0;
}
注:
1.这里的getchar()和putchar是跟scanf和printf分别对应,但是getchar和putchar只适用与字符类型的输入输出,而scanf和printf适用于任何的数据类型的输入输出。
2.利用一个while循环让getchar不等于EOF,当getchar读取到一个字符时进入循环,实现多组输入字符,将getchar输入的字符给ch。而getchar的括号里面是不用放入参数的。
3.putchar接收ch的值后进行输出
3.3.1 getchar工作原理
代码演示:
这里为什么我还没输入字符Y。就直接确认失败了呢?其实这个代码是有一点小小的问题的。
注:
1.我们从键盘输入密码的时候,编译器会将这个密码放入输入缓冲区
2.而后我们输入密码123456的时候,编译器后面会自带一个\n,scanf只会获取到123456这个密码字符,而在输入缓冲区会残留一个\n的字符,所以在输入请确认密码那里,编译器会将输入缓冲区的\n进行输入,则输入的不是字符Y,则就自动打印确认失败。
代码改进:
#include <stdio.h>
int main()
{//这个password数组名原本就是地址所以不用取地址符号
char password[20] = { 0 };
int ch = 0;
printf("请输入密码:>");
scanf("%s", password);//假设输入123456
//清理\n- 清理缓冲区
while (getchar() != '\n')
{
;
}
printf("请输入密码(Y/N):>");
ch = getchar();
if (ch == 'Y')
printf("确认成功\n");
else
printf("确认失败\n");
return 0;
}
注:
这里我们再进行输入123456密码后面的其他字符的话,就可以利用while循环中的getchar将 xxx\n(空格也属于一个字符)进行清理。
3.4 for循环
3.4.1 for循环语法
#include <stdio.h>
int main()
{
int i = 0;
//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
for(i=1; i<=10; i++)
{
printf("%d ", i);
}
return 0;
}
3.4.2 break和continue在for循环中
//代码1
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5)
break;
printf("%d ",i);
}
return 0;
}
//输出的是1 2 3 4
//代码2
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5)
continue;
printf("%d ",i);
}
return 0;
}
//输出的是1 2 3 4 6 7 8 9 10
注:这里不同于while循环的实施continue,当i==5时,continue跳出此次循环,但是for循环的i会进行+1;而while循环不进行i++的调整的话,可能会导致死循环。
3.4.3 for循环的变种
代码演示:
int i = 0;
int j = 0;
//如果省略掉初始化部分,这里打印多少个hehe?
for(; i<10; i++)
{
for(; j<10; j++)
{
printf("hehe\n");
}
}
注:
1.这里我不进行初始化的话,那么hehe打印的是十个而不是100个;
2.当i=0时,j进行循环了十次,j=9,然后j没有进行初始化,那么当i=1时,j进行++,j没有小于10,所以不进入这个循环,所以就不打印hehe了,所以总共就打印了十次hehe。
#include<stdio.h>
int main()
{
//代码1
for(;;)
{
printf("hehe\n");
}return 0;
}
注:for循环中的初始化部分,判断部分,调整部分是可以省略的,但是省略判断部分,判断就恒为真容易导致死循环。所以不建议初学时省略,容易导致问题。
3.5 do ...while 循环
3.5.1 do ...while循环语法
do
循环语句;
while(表达式);
3.5.2 do...while 语句的特点
循环至少执行一次,使用的场景有限,所以不是经常使用。
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
i=i+1;
}while(i<=10);
return 0;
}
注:由于使用场景有限,很少使用,不加以深入介绍,就就用一个实现代码进行理解。
3.6 go....to 语句
注:这里说一下为什么不推荐使用go...to语句
代码演示:
#include<stdio.h>
int main()
{
flag:
printf("hehe\n");
goto flag;
return 0
}
注意:
1.代码执行流程是先打印一遍hehe,然后往下执行遇到goto falg,然后就跳转到falg,继续打印hehe,这样就导致了死循环。
2.当我们代码多了以后,使用goto语句容易打乱代码逻辑,特别容易出错;
3.并且goto语句只能再同一个函数内部进行跳转,不能够跨函数跳转;
goto语言真正适合的场景如下:
#include <stdio.h>
#include<stdlib.h>
int main()
{
char input[10] = {0};
system("shutdown -s -t 60");
again:
printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
scanf("%s", input);
if(0 == strcmp(input, "我是猪"))
{
system("shutdown -a");
}
else
{
goto again;
}
return 0;
}
注意:小编提醒一下大家哦!!!不要轻易将这个代码放到编译器里运行,不然可能会出现大大滴惊喜哦╰(*°▽°*)╯
好了小编的分享到此结束,欲知后续,等待更新!!!!