分支语句和循环语句
分支语句
- if
- switch
循环语句
- while
- for
- do while
go to 语句
文章目录
1.语句
C语言的语句可以分为一下五类:
本次内容主要讲的是控制程序的执行流程,实现程序的各种结构方式,C语言是结构化程序设计语言,对生活事件的抽象提取三种结构(顺序,选择,循环)。C语言共有九种控制语句。
2.if 语句
if语句的语法结构
语法结构:
if(表达式)
语句;
if(表达式)
语句1;
else
语句2;
//多分支
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
虽然说多分支语句有多个,但真正执行时只有一条。
C语言中如何表示真假?0表示假,非0表示真
一些注意事项:
if(1<=age<=20) printf(“少年\n”);
以上面代码为例:如果输入21,程序运行结果会是 少年。
我们知道在C语言中,非0表示真,0表示假。输入21,1<=21,所以是真,1<=21也为真,所以执行程序。那如何避免这样的结果呢? (age >= 1&&age<= 20)
//比较 if(age<18) printf("少年\n"); printf("青壮年\n");
if(age<18) { printf("少年\n"); } else { printf("青壮年\n"); }
上面两个代码执行起来所表达的意思(在大于18这个区间)都是一样的,但从可读性来说第二个更容易让别人理解。
练习:
#include <stdio.h> int main() { int a = 1; int b = 2; if (a == 0) if (b == 2) printf("Yes\n"); else printf("No\n"); return 0; }
很容易:认为执行程序结果为No.但如果我们把版面重新排一下,你会发现程序执行不出来任何结果。
else的匹配:else总是和它离的最近的if匹配。
3.switch语句
switch语句也是一种分支语句。
输入1 输出:星期一
输入2 输出:星期二
输入3 输出:星期三
.
.
.
3.1switch的语法形式:
(整型表达式)字符也可以,字符的的底层逻辑存储的是ASCII的值。
switch(整型表达式)
{
语句项:
}
//
case 整型常量表达式: 语句;
这里引入switch的两个好搭档 break与default
3.2break:
break语句:实际效果是把语句列表划分为不同的分支部分
在最后一个case 的语句的后面加上一条break语句,这么写的目的是为了避免出现在以前的最后一个case语句后面忘了添加break语句
3.3default子句:
如果表达式的值与所有的case标签值都不匹配: 结构所有的语句都被跳过。程序不会中止,也不会报错。
如果所有的case不匹配,但不想忽略怎么办?
default:写在任何一个case标签可以出现的位置。
switch表达式的值并不匹配所有case标签的值时,这个default子句后面的语句就会执行
实例:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int day = 0;
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;
}
return 0;
}
4.循环语句
- while
- for
- do while
if语句当条件满足时,后面语句就会执行,否则不执行,但这个语句只能执行一次。那如果我们想让其在某个条件下一直执行怎们办呢?while
while语法结构:
while语法结构
while(表达式)
循环语句;
了解while语句中的break和continue。
两者之间的区别:通俗说比如学生每天都要好好学习,但有一天因为一些事情没有好好学习。如果把这一天视为break,那这个学生以后都没有学习。如果视为continue,那这个学生只是这一天没有好好学习,其余天都在好好学习。
总结:
①break在while循环中的应用
其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。
所以:while中的break是用于永久终止循环的
②continue在while循环中的作用就是:
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,
而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 6)
{
if (i == 3)
continue;
printf("%d ", 666);
i = i + 1;
}
return 0;
}
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 6)
{
if (i == 3)
break;
printf("%d ", 666);
i = i + 1;
}
return 0;
}
关于缓冲区代码理解:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
printf("请输入名字:");
char name[20] = { 0 };
scanf("%s", name);
printf("请确认名字(Y/N):");
int ch = getchar();
if (ch == 'Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
return 0;
}
我们键盘输入Mike,回车键。此时开始执行这个程序。scanf读入的是’\n‘前面的Mike,getchar()从缓冲区读入的是\n,\n不等于’Y‘,所有你还没有输入Y/N已经出现输入失败了。
getchar 读取到字符的时候返回的是字符的ASCII码值
如果读取失败,返回的是EOF —> -1 ASCII:0~127
这里我们加一个getchar();用来消除缓冲区的\n
如果输入的是Mike joy 又会失败。scanf拿入的是Mike,scanf默认读取到空格就结束了 ,getchar()拿的是空格,后面一个getchar()比较的就是后面的了。
加入while((getchar()!=‘\n’)),此时能消除缓冲区问题,但是scanf输入的还是Mike,不是Mike joy!
打印name时没有加&,因为数组名就是其首地址,故没有加。
scanf输入遇到空格也能输入情况
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() { char name[20] = {0}; scanf("%[^\n]", name);; printf("%s\n", name); return 0; }
#include <stdio.h>
int main()
{
char ch = '\0';
while ((ch = getchar()) != EOF)
{
if (ch < '0'|| ch > '9')
continue;
putchar(ch);
}
return 0;
}
//这个代码的作用是:只打印数字字符,跳过其他字符的、
几个tips
适当的增加{}会使别人更易理解你的代码,养成良好的代码风格
if(表达式),如果表达是里面是两个整型进行比较,将变量放在右边,常量放在左边防止出错。if(0==age)