C语言中的控制语句用于控制程序的流程,以实现程序的各种结构方式,包括顺序语句、判断语句、循环语句和特殊语句
什么是顺序语句呢?
观察流程图,按照语句从上到下,从左到右的进行顺序执行程序指令的过程,在程序没有使用任何其他控制语句的前提下,语句实行的就是顺序语句
举个栗子
#include
int main(int argc, const char *argv[])
{
printf("1\n");
printf("2\n");
printf("3\n");
printf("4\n");
printf("5\n");
return 0;
}
从程序的运行结果可以看出程序的执行顺序是从上到下,这是最基本的结构,也是学习其他结构的基础
通过对顺序语句的了解之后,来看看判断语句
判断语句又称选择语句,包括if语句和switch语句
基本概念
if语句是用来判定所给定的条件是否满足
根据判定的结果执行给出的操作
程序段0
if(判断条件){
程序段1
}else{
程序段2
}
程序段3
光看程序,还是有些不好理解的话
下面通过流程图来了解一下它的运作原理
这样就能很清晰的了解到if判断语句是如何运作的,如果判断条件为真执行程序段1,如果为假执行程序2
但是这样看还不够形象,在此之前先来看看if语句的三种基本形式
三种基本形式
形式一
程序段0
if(判断条件){
程序段1
}else{
程序段2
}
程序段3
前面已经讲到了这种形式的基本流程,接下来通过例子来更具体的了解一下
举个栗子
#include
int main(int argc, const char *argv[])
{
int a = 5,b = -5;
if(a > b){
printf("a > b\n");
}else{
printf("b >= a\n");
}
return 0;
}
通过例子可以看到,if后面括号里面的内容是关键,如果里面的表达式a>b成立,那么就会执行printf(“a > b\n”);,而不成立就会执行else后面的内容printf(“b >= a\n”);
可以看出int a = 5,b = -5;,显然a是b要大的,所以输出的内容为a > b
下面通过第二种形式来更加深入的了解if语句
形式二
程序段0
if(判断条件){
程序段1
}
程序段2
流程图
通过基本机构和流程图应该能看出一些与前面形式的不同,如果判断的表达式为假时,则直接执行后面的语句,而没有执行不成立的一个语句段
举个栗子
#include
int main(int argc, const char *argv[])
{
int a = 5,b = -5,c = 0;
if(a){
printf("%d\n",a);
}
if(b){
printf("%d\n",b);
}
if(c){
printf("%d\n",c);
}
return 0;
}
从这里看到了三个形式的if语句,但是表达式却换成了整型的变量,这样是可以的吗?
从结果能输出的情况可以看到是可以的,if语句只会判断括号里的内容的大小,从结果也不难发现,只有当内容的结果不为0时,输出判断正确的内容,而当括号里的结果为0时,则不输出任何内容
形式三
程序段0
if(判断条件1){
程序段1
}else if(判断条件2){
程序段2
}else if(判断条件3){
程序段3
}.......{
......
}else if(判断条件n){
程序段n
}
程序段n+1
流程图
这个形式能够进行多重判断,能够将一个条件进行很细的分类,当然如果只通过上面的结构和流程图可能会看的有点云里雾里,接下来就通过例子来深入了解一下吧
举个栗子
#include
int main(int argc, const char *argv[])
{
int a;
printf("在大鱼吃小鱼中,查看你现在能吃的鱼的种类\n");
printf("输入1:查询小鱼\n");
printf("输入2:查询大鱼\n");
printf("输入3:查询鲨鱼\n");
printf("输入4:查询鲸鱼\n");
scanf("%d",&a);
if(a > 4){
printf("输入内容超出范围请输入1~4\n");
}else if(a > 3){
printf("可以吃鲨鱼、大鱼和小鱼\n");
}else if(a > 2){
printf("可以吃大鱼和小鱼\n");
}else if(a > 1){
printf("可以吃小鱼\n");
}else if(a == 1){
printf("你好像什么都不能吃哦!\n");
}else{
printf("输入内容超出范围请输入1~4\n");
}
return 0;
}
这里我以一个大鱼吃小鱼的游戏为例,看现在的形态能吃什么?
当然是越厉害吃的越多
这里通过数字的划分就可以选择不同的语句进行输出,下面列了一个表格
范围 | 功能 | 结果 |
---|---|---|
a>4 | 输入有误 | 输入内容超出范围请输入1~4 |
a=4 | 你是鲸鱼 | 可以吃鲨鱼、大鱼和小鱼 |
a=3 | 你是鲨鱼 | 可以吃大鱼和小鱼 |
a=2 | 你是大鱼 | 可以吃小鱼 |
a=1 | 你是小鱼 | 你好像什么都不能吃哦! |
a<1 | 输入有误 | 输入内容超出范围请输入1~4 |
通过表格应该能够更好的理解if语句形式三的作用,但是当划分的情况更多的时候,if语句会变的很麻烦,所以更好的解决方法会在switch讲到
if嵌套语句
在if语句中又包含一个或者多个if语句称为if语句的嵌套
一般形式
程序段0
if(判断条件1){
程序段1
if(判断条件2){
程序段2
}else{
程序段3
}
}else{
程序段4
if(判断条件3){
程序段5
}else{
程序段6
}
}
程序段7
流程图
举个栗子
这里做一个判断,比如你过了英语四级,且过了计算机二级你就能拿到学位证;如果只有其中之一能拿到毕业证;如果都没过则不能毕业。输入你是否通过这两门测试,程序就会告诉你的能否毕业,还需要在哪些方面做努力
#include
int main(int argc, const char *argv[])
{
int a,b;
printf("你是否通过了英语四级(是输入1/否输入0):");
scanf("%d",&a);
printf("你是否通过了计算机二级(是输入1/否输入0):");
scanf("%d",&b);
if(a == 1){
printf("你能拿到毕业证!\n");
if(b == 1){
printf("你能拿到学位证!\n");
}else{
}
}else{
if(b == 1){
printf("你能拿到毕业证!\n");
}else{
printf("你什么都拿不到哦!\n");
}
}
return 0;
}
if语句只能从两者中选择一个,当要实现几种可能之一时
就要用if…else if,甚至多重的嵌套if来实现,当分支较多时,程序会变得很复杂,可读性很差
因此…
switch语句专门处理多路分支情形,是程序变得简洁
基本形式
程序段0
switch( 表达式){
case 常量表达式1:程序段1 ;break;
case 常量表达式2:程序段2 ;break;
case 常量表达式3:程序段3 ;break;
.....
case 常量表达式n:程序段n ;break;
default:
}
程序n+1
流程图
举个栗子
#include
int main(int argc, const char *argv[])
{
int a;
printf("在大鱼吃小鱼中,查看你现在能吃的鱼的种类\n");
printf("输入1:查询小鱼\n");
printf("输入2:查询大鱼\n");
printf("输入3:查询鲨鱼\n");
printf("输入4:查询鲸鱼\n");
scanf("%d",&a);
switch(a){
case 1:printf("你好像什么都吃不到哦!\n");break;
case 2:printf("可以吃小鱼\n");break;
case 3:printf("可以吃大鱼和小鱼\n");break;
case 4:printf("可以吃鲨鱼、大鱼和小鱼\n");break;
default:printf("输入内容超出范围请输入1~4\n");
}
return 0;
}
这样程序是不是就简单很多了,关于后面添加的break会在后面的特殊语句讲到
但能够对程序进行判断而执行指定程序的判断语句之后,如果想要重复的执行一段代码,该如何实现呢?
循环语句的出现就很好的解决了这个问题
首先看到while循环语句
while
基本形式
程序段0
while(判断条件){
程序段1
}
程序段2
流程图
通过结构图和流程可以看出,只要判断条件成立或者不为0,它就会一直循环执行程序段1,如果在程序段1不改变表达式里的情况,就会进入一个死循环,当然很多时候需要用到这个死循环,但现在先以可以退出循环的例子进行举例
举个栗子
#include
int main(int argc, const char *argv[])
{
int i = 1,s = 0;
while(i <= 5){
s += i;
i++;
}
printf("s = %d\n",s);
return 0;
}
这里进行了累加操作,通过while循环实现了1+2+3+4+5=15
do…while
基本形式
程序段0
do{
程序段1
}while(判断条件);
程序2
流程图
这么一看好像跟上面的没什么区别,但是它还是有不样的地方,通过例子一探究竟把!
举个栗子
#include
int main(int argc, const char *argv[])
{
int i = 1,s = 0;
do{
s += i;
i++;
}while(i <= 5);
printf("s = %d\n",s);
return 0;
}
for语句是C语言所提供的功能更强、使用更广泛的一种循环语句
for语句
基本形式
程序段0
for(表达式1;表达式2;表达式3){
程序段1
}
程序段2
三个表达式用分号隔开
表达式1是循环初始化表达式
表达式2是循环条件表达式
表达式3是循环调整表达式
这里用上面while循环的例子看看能够更好的理解
流程图
看着就像while的简化版
举个栗子
#include
int main(int argc, const char *argv[])
{
int i,s = 0;
for(i = 1;i <= 5;i++){
s += i;
}
printf("s = %d\n",s);
return 0;
}
这里完成的功能跟while一样,但程序简化了很多
循环嵌套
基本形式
程序段0
for(表达式1;表达式2;表达式3){
程序段1
for(表达式1;表达式2;表达式3){
程序段2
}
程序段3
}
程序段4
举个栗子
写个99乘法表
#include
int main(int argc, const char *argv[])
{
int i,j;
for(i =1;i <= 9;i++){
for(j = 1;j <=9;j++){
if(i <= j){
printf("%d*%d=%-2d ",i,j,i*j);
}
}
printf("\n");
}
return 0;
}
当然99乘法表的显示不止一种形式,如下图
这里完整版的程序内容可以参见程序案例
goto也称为无条件转移语句,这里直接通过例子来了解一下
举个栗子
#include
int main(int argc, const char *argv[])
{
int i = 1,s = 0;
loop:
if(i <= 5){
s += i;
i++;
goto loop;
}
printf("s = %d\n",s);
return 0;
}
goto同样实现了循环的功能
continue只能用在循环体中,就是不执行这个循环continue语句之后的内容直接跳到下个循环
continue;
举个栗子
比如输出100以内所有能被5整除的数
#include
int main(int argc, const char *argv[])
{
int i;
for(i = 1;i <= 100;i++){
if(i % 5 != 0){
continue;
}
printf("%d\n",i);
}
return 0;
}
之前在switch里面出现过,现在在这里做出详细的讲解
break用在switch或者循环语句中,在循环语句中与continue有点相似,不同的是它会直接退出整个循环体
而在switch中,每个case后面不加的话会继续往下进行判断
基本形式
break;
之前已经在switch里用过了,这里就举个在循环中的例子吧
举个栗子
比如让程序进行从1~100的累加,但我想让累加和大于200的时候就输出结果
#include
int main(int argc, const char *argv[])
{
int i,s = 0;
for(i = 0;i <= 100;i++){
s += i;
if(s >= 200){
break;
}
}
printf("i = %d,s = %d\n",i,s);
return 0;
}
程序
#include
/*
*功能介绍:实现不同显示形式的九九乘法表
*作者:Cage
*更新日期:2019.10.28
*/
void fun1(){
int i,j;
for(i =1;i <= 9;i++){
for(j = 1;j <=9;j++){
if(i <= j){
printf("%d*%d=%-2d ",i,j,i*j);
}
}
printf("\n");
}
}
void fun2(){
int i,j;
for(i = 1;i <= 9;i++){
for(j = 1;j <= 9;j++){
if(j < i){
printf(" ");
}else{
printf("%d*%d=%-2d ",i,j,i*j);
}
}
printf("\n");
}
}
void fun3(){
int i,j,k;
for(i = 1;i <= 9;i++){
for(k = 1;k <= 9-i;k++){
printf(" ");
}
for(j = 1;j <= i;j++){
printf("%d*%d=%-2d ",i,j,i*j);
}
printf("\n");
}
}
void fun4(){
int i,j;
for(i =1;i <= 9;i++){
for(j = 1;j < i+1;j++){
printf("%d*%d=%-2d ",i,j,i*j);
}
printf("\n");
}
}
int main(int argc, const char *argv[])
{
int c,w = 1;
while(w){
printf("请输入想要显示九九乘法表的方式(1.方式一2.方式二3.方式三4.方式四-1.退出):");
scanf("%d",&c);
switch(c){
case -1:w = 0;break;
case 1:fun1();break;
case 2:fun2();break;
case 3:fun3();break;
case 4:fun4();break;
default:printf("输入有误,请输入正确的内容\n");
}
}
return 0;
}
``
## 更多内容
[Linux-C P1 Linux基础与Vi操作](https://blog.csdn.net/qq_41030935/article/details/103098904)
[Linux-C P2 数据类型](https://blog.csdn.net/qq_41030935/article/details/103410286)
[Linux-C P3 运算符和表达式](https://blog.csdn.net/qq_41030935/article/details/103438738)
[Linux-C P4 输入输出](https://blog.csdn.net/qq_41030935/article/details/103475581)
[Linux-C P6 数组](https://blog.csdn.net/qq_41030935/article/details/103825381)
[Linux-C P7 指针](https://blog.csdn.net/qq_41030935/article/details/103882541)
[Linux-C P8 函数](https://blog.csdn.net/qq_41030935/article/details/103998816)
[Linux-C P9 内存管理](https://blog.csdn.net/qq_41030935/article/details/104074306)
[Linux-C P10 结构体细讲](https://blog.csdn.net/qq_41030935/article/details/104106883)