1.何为语句?
C语句可分为五类:
1.表达式语句
2.函数调用语句
3.控制语句
4.复合语句
5.空语句
本文主要围绕控制语句进行分析和讲解。
控制语句是用于控制程序执行,以用于实现程序的各种结构方式,由固定的九种控制语句定义符组成。
可以分为三大类:
第一类:条件判断语句也叫分支语句:if语句、switch语句;
第二类:循环执行语句:do while语句、while语句、for语句;
第三类:转向语句:break语句、goto语句、continue语句、return语句。
2.分支语句(选择结构)
2.1 if语句
if语句的语法结构:
if(表达式)
语句1; //如果表达式的结果为真,语句1就会被执行。
if(表达式)
语句1;
else
语句2;
//多分支
if(表达式1)
语句1;
if else(表达式2)
语句2;
else
语句3;
C语言中,0表示为假,其余非0数字都是真。
接下来用代码来展示if语句的使用方法:
#include <stdio.h>
int main()
{
if(1==2)
printf("不对\n"); //不会打印,因为1不等于2,if条件表达式为假
if(1==1)
printf("对的\n"); //由于1等于1,if条件表达式为真 所以打印"对的"
int a =10;
if(a=3)
printf("yes\n"); //由于3为非0数,所以打印"yes"
int b=10;
if(b==3)
printf("no\n"); //由于10不等于3 所以if条件表达式为假 所以不打印
//if条件表达式可以用于逻辑的判断 比如判断是否成年
int age=20;
if(age>18)
printf("成年了\n");
else
{
printf("未成年\n"); //注意:如果if、else if还有else要跟多条语句时必须加上{}
printf("现在才%d岁\n",age);
}
//if多分支写法 多分支只会执行一个分支
int age1=10;
scanf("%d",&age1);
if(age1<18)
printf("青年\n");
else if(age1>=18&&age1<=40)
printf("中年\n");
else if(age1>=40&&age1<=60)
printf("壮年\n");
else
printf("老年\n");
return 0;
}
2.1.1悬空else
#include<stdio.h>
int main()
{
int a=0,b=1;
if(a==1)
if(b==1)
printf("xixi\n");
else
printf("hehe\n");
return 0;
}
这样编写的代码是有问题的,我们实际上希望的是else(hehe)和if(a==1)是匹配的,但是当我们将此代码复制到编译器后,编译器会默认else(hehe)与if(b==1)匹配到一起。所以运行结果什么都不会打印。
原因在于:else是和它离得最近的if匹配的。
所以要想实现预期结果,则需添加{}进行代码块化处理。
#include<stdio.h>
int main()
{
int a=0,b=1;
if(a==1)
{
if(b==1)
printf("xixi\n");
}
else
printf("hehe\n");
return 0;
}
由此可见,代码的规范十分有必要。
2.1.2练习
判断一个数是否为奇数
#include<stdio.h>
int main()
{
int a=0;
scanf("%d",&a);
//判断
if(a%2==1)
printf("是奇数\n");
else
printf("不是奇数\n");
return 0;
}
2.2switch语句
switch语句也是一种分支语句,常常用于多分支的情况。
int main()
{
int day =0;
scanf("%d",&day);
//if(1==day)
// printf("星期一\n");
//if(2==day)
// printf("星期二\n");
//if(1==day)
// printf("星期三\n");
//if(1==day)
// printf("星期四\n");
//...
我们如果写出if...else的形式太复杂,那么我们就得用不一样的语法,就是switch语句。
switch(整型表达式)
{
语句项;
}
其中语句项为case语句:
case 整型常量表达式;
语句;
2.2.1switch的使用
int main()
{
int day =0;
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");
case 6:
printf("星期六\n");
case 7:
printf("星期天\n");
}
return 0;
}
我们的预期是输入一个数字 然后打印出对应的星期几
可以看到,程序打印是从星期二到星期天,这时需要注意:case只负责入口,没有负责出口,所以进入之后会往下执行所有的case。
在switch语句中,我们没办法直接实现分支,搭配break使用才可以实现真正的分支。
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;
}
加上break之后,可以看到按照预期结果执行了。
break语句的实际效果是 把语句列表划分成为不同的分支部分
2.2.2default字句
如上面的switch,如果我们输入的数字并不是1~7,比如输入8,会怎么样呢?
可以看到,什么都没打印。
因此可以看出如果输入的数字不是在1~7之内时,分支会自动跳过,那么如果我们不想直接跳过忽略时,就可以用default字句,写在任何一个case标签可以出现的位置。
当switch表达式的值并不匹配所有的case时,就会执行default语句
//在上面的代码加上
default :
printf("选择错误!\n");
break;
{
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;
default:
printf("选择错误\n");
break;
}
return 0;
}
2.2.3练习
#include<stdio.h>
int main()
{
int n=1,m=2;
switch(n)
{
case 1:m++;
case 2:n++;
case 3:
switch (n)
{
case 1:n++;
case 2:m++;n++;
break;
}
case 4:
m++;
break;
default:
break;
}
printf("m=%d,n=%d\n",m,n);
return 0;
}
让我们逐步分析代码的执行过程:
1.初始化整数变量 n 为1,整数变量 m 为2。
2.进入 switch (n),n 的值为1,因此进入 case 1 分支。
3.在 case 1 中,m 的值增加到3,但没有 break 语句,所以继续执行下一个 case。
4.进入 case 2,n 的值增加到2,同样没有 break 语句。
5.接下来,进入 case 3,此处有一个嵌套的 switch 语句。
6.进入内部的 switch (n),此时 n 的值是2。
7.在内部的 switch 中,进入 case 2,n 的值增加到3,然后执行 m++,m 的值增加到4,接着 n++,n 的值增加到4。
8.内部的 switch 没有 break 语句,所以控制流继续流向外部的 case 4。
9.在外部的 case 4 中,m 的值增加到5。
10.switch 结束,没有 default 分支被执行。
11.最后,printf 打印出 m 和 n 的值,即 m = 5, n = 3。
3循环语句
循环语句有3种:
- while
- for
- do while
3.1while循环
在上面我们已经学习了if语句的基本知识
当条件满足的情况下,if语句后的语句执行,否则不执行
但是只会执行一次
那么当我们在同一件事需要执行多次,该怎么做呢?
这时,就利用到了循环语句
我们首先学习的是while语句
//while 语法结构
while(表达式)
循环语句;
while语句执行的流程:
//打印1~10数字
int main()
{
int i=1;
while(i<=10)
{
printf("%d ",i);
i++;
}
return 0;
}
3.1.1while语句中的break和continue
//break介绍
int main()
{
int i=1;
while (i<=10)
{
if(5 ==i)
break;
printf("%d ",i);
i++;
}
return 0;
}
break在while循环中的作用:
其实在循环中只要遇到break,就会停止后期的所有的循环,直接结束循环。
所以while中的break是用于终止循环的。
continue在while循环的作用是:
continue是用于终止“本次”循环的,也就是本次循环中continue后面的代码不会运行,而是直接跳转到下一次循环,继续判断运行。
3.2for循环
3.2.1语法
for(表达式1;表达式2;表达式3)
循环语句;
表达式1是初始化部分,用于初始化循环变量的
表达式2是条件判断部分,用于判断循环时候终止
表达式3是调整部分,用于循环条件的调整
int main()
{
int i=0;
for(i=1;i<=10;i++)
{
printf("%d ",i);
}
return 0;
}
for循环执行流程图:
3.2.2break和continue在for循环的区别
3.2.3for循环和while循环对比
3.2.4for语句的循环控制变量
建议:
1.不可以在for循环体内修改循环变量,防止for循环失去控制
2.建议for语句的循环控制变量的取值采用“前闭后开区间”写法
建议写法:
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
//0~9
int i =0;
for(i =0;i<10;i++) //不建议将i<10改为i<=9
{
printf("%d ",arr[i]);
}
return 0;
}
3.2.5一些for循环的变种
//代码1
//for循环的判断部分省略意味着这判断会恒成立
for(;;)
{
printf("hello\n");
}
在这个代码中,for循环的初始化部分是一个空语句;;,条件部分也是一个空语句,因此他们都是空的。这意味着初始化、条件判断以及迭代部分都不存在。因此,这个循环将一直执行下去,永远不会停止。
//代码2
int i=0;
int j=0;
//这里打印多少个hello?
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("hello\n");
}
}
外部的for循环控制变量i从0递增到2,它将执行3次。而内部的for循环控制变量j从0递增到2,它也将执行3次。
因此,内部的printf("hello\n");语句将在外部循环每次迭代时都执行3次。
所以总共会打印3*3=9次。
//代码3
int i =0;
int j =0;
//如果省略掉初始化部分,这里将打印多少个hello?
for(;i<3;i++)
{
for(;j<3;j++)
{
printf("hello\n");
}
}
首先i=0,说明i<3,此时j=0,j<3,将进入printf
打印完hello后,j++ ->j=1,再次打印第二个hello
然后j++ ->j=2,j<3,再次打印第三个hello
j++ ->j=3,j<3不成立,跳出循环,i++ ->i=1
此时再次进入for-j循环,由于此处省略掉初始化语句,此时j还是3,那么这个循环就不会执行,j<3不成立,跳出该循环
后面就单执行for-i循环
所以只打印3次hello
3.3do...while循环
3.3.1do语句的语法
do
循环语句;
while(表达式);
3.3.2执行流程
3.3.3do语句的特点
循环至少执行一次,使用的场景有限,所以不是经常使用
int main()
{
int i=1;
do
{
printf("%d ",i);
i++;
}while(i<=10);
return 0;
}
3.3.4do ...while 循环中的break和continue
当在C语言中使用do...while循环时,break和continue语句可以用来控制循环执行。
break语句:break语句用于立即终止当前的do...while循环,不再继续执行后续的迭代。这通常用于在满足某个条件时提前退出循环。
示例代码:
#include <stdio.h>
int main()
{
int i=1;
do{
if(i==3)
{
break; //当I等于3时,立即退出循环
}
printf("%d\n",i);
i++;
}while(i<=5);
return 0;
}
在这个示例中,当i的值等于3时,break语句被触发,循环立即终止,不再打印后续的数字。
continue语句: continue语句用于跳过当前迭代的剩余部分,然后继续下一次循环迭代。这通常用于跳过某些特定条件下的迭代,但不终止整个循环。
示例代码:
#include <stdio.h>
int main()
{
int i=1;
do{
if(i==3)
{
i++; //增加i的值以避免陷入无限循环
continue; //当i等于3时,跳过本次迭代
}
printf("%d\n",i);
i++;
}while(i<=5);
return 0;
}
在这个示例中,当i的值等于3时,continue语句被触发,跳过了打印数字3的部分,然后继续下一次迭代。
以上便是C语言的分支语句和循环语句
上述内容有部分借鉴其他博客。