分支循环语句里的爱恨情仇"/>
C语言里的分支循环语句里的爱恨情仇
分支语句:
-
if
-
switch
循环语句:
-
while
-
for
-
do while
goto语句
1、什么是语句?
说起这些语句,我们知道他们的大致作用,但是语言又是怎么规定的呢?或者说哪些可以被称为是语句,什么是语句呢?
语句,顾名思义就是话的意思,跟我们日常对话一样,只有你说出来想表达的意思,别人才能听到,然后去理解意思,那么在我们人与电脑的交流之间也需要跟电脑对话,让它知道我们的意思,根据不同语言的语法再加上我们的变量等等来告诉电脑我们的意思,一般来说分号就是一条语句的结束标志。
在C语言当中语句分为五大类:
- 表达式语句
- 函数调用语句
- 控制语句
控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言支持三种结构:顺序结构、选择结构、循环结构),它们由特定的语句定义符组成,C语言有九种控制语句。
可分成以下三类:
-
条件判断语句也叫分支语句:if语句、switch语句;
-
循环执行语句:do while语句、while语句、for语句;
-
转向语句:break语句、goto语句、continue语句、return语句。
- 复合语句
-
空语句
int main()
{int a = 10;//1. 表达式语句//创建int型变量并且赋值为10Add(a);//2. 函数调用语句//函数调用语句,调用Add函数并且传参//3. 控制语句用于控制程序的执行流程,以实现程序的各种结构方式// (C语言支持三种结构:顺序结构、选//择结构、循环结构),它们由特定的语句定义符组成,C语言有九种控制语句//4. 复合语句,就是其他四种语句的组合,来实现你的逻辑;//5. 空语句//其实一个分号就是一个空语句
}
2、分支语句(选择结构)
分支语句有两种,说起分支,也就是选择结构,其实就是根据不同的条件去进行不同选择之下的逻辑,举个简单的例子,比如我们去北京乘坐的交通方式有不同的选择,飞机、火车、高铁。。。选择飞机就要买机票、火车要买火车票、高铁要买高铁票,分支语句跟这些情况类似,接下来让我们来看看选择结构。
2.1、if语句
语法格式:
形式一:
if(表达式)
语句;
int main()
{//无分支单纯是判断int a = 0;scanf("%d",&a);if (a > 3)printf("这个数字比3大");return 0;
}
形式二:
if(表达式)
语句1;
else
语句2;
int main()
{//双分支(非此即彼)//if (表达式)// 语句1;//else// 语句2;int a = 0;scanf("%d", &a);if (a > 3)printf("这个数字比3大");elseprintf("这个数字比3小");return 0;
}
形式三:
//多分支
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
int main()
{//多分支/*if (表达式1)语句1;else if (表达式2)语句2;else语句3;*/int a = 0;scanf("%d", &a);if (a > 3 && a < 5)printf("这个数字比3大,比5小");else if (a > 5 && a < 7)printf("这个数字比5大,比7小");elseprintf("这个数为%d\n",a);return 0;
}
多分支当中可以继续通过else if往下延申
注意:
- if else语句默认后面只跟一条语句,如果里面的逻辑多于一条语句的时候,需要加 { } 来将代码括起来
- else默认跟其上方相距的最近的if配对形成if else选择结构
- 在函数当中遇见第一个在逻辑当中的return之后该函数就会结束,如果在return之后还有return要注意逻辑顺序问题
- 良好的习惯,在if(判断)当中括号内部如果是判断的时候尽量把数字放在==的判断符号左边,但是如果==左边是一个表达式的话可以不用将数据放==左边,因为是判断的话==左边是变量空间,当你把==打错为=就会出bug导致给变量赋值,但是表达式则没有开辟空间即使==打错为=因为没有空间导致程序报错。
2.2、switch语句
相较于上方的if else语句的话,分支过多使用if else语句会导致代码写的很麻烦有很多重复的代码,为了简化代码,我们选择switch语句来让我们的工作量相对小一些。
语法:
switch(整型表达式)
{语句项;
}
比如我们选择去哪里通过导航有多条线路选择
int main()
{int a = 0;scanf("%d",&a);switch (a)//括号里面的必须是整形表达式{case 1://case后面跟的必须是整形常量表达式printf("路线一");break;case 2:printf("路线二");break;case 3:printf("路线三");break;case 4:printf("路线四");break;case 5:printf("路线五");break;default:printf("输入错误");break;}return 0;
}
通过输入a的数值,我们决定我们的分支走向,即case决定了我们程序的入口,而每次进入switch语句之后,实现完了我们的逻辑相关操作之后,我们通过关键字break来结束我们的逻辑,即break决定了我们程序的出口,那么default则是包含了我们除了case选项之外的所有可能,以上述为例,选项只有1~5,那么default则包括了除了1~5之外的数字选项,可以通过这些关键字的配合来让我们的逻辑更加的合理、完善。
注意:default可以写在任何一个 case 标签可以出现的位置。
3、循环语句
循环顾名思义就是不断循环一些代码,当然我们只会让其循环相关的一些逻辑,但是会留有结束循环和跳过本次循环的相关逻辑。
循环语句有三种:
- while
- for
- do while
3.1、while循环
语法格式:
while(表达式)
循环语句;
比如打印0-9:
int main()
{int i = 0;while (i<10)//括号内的是判断的条件{//即满足括号内的判断就会进入while循环里面执行//while里面的相关逻辑printf("%d ",i);i++;//如果没有i++那么i恒等于0,一直满足while判断条件//程序死循环打印0}return 0;
}
注意:在while循环当中我们只是想要循环一些代码逻辑,目的并不是为了让代码一直循环下去,所以尽量避免写出死循环bug
其实在while当中,还有直接结束循环的break和跳过本次循环的continue
break:结束break所属的代码块里面的所有逻辑,也就是在循环当中break就是程序的出口
int main()
{int i = 0;while (i < 10){printf("%d ", i);if (5 == i)//当i==5的时候执行break直接结束循环break;i++;}return 0;
}
continue:结束continue所属代码块在continue之后的的逻辑代码,也就是在循环中跳过continue之后的代码逻辑跳过本次循环,直接进入下一次循环的判断
int main()
{int i = 0;while (i < 10){i++;if (5 == i)//当i==5的时候跳过continue之后的代码逻辑//直接进入循环的判断入口continue;printf("%d ", i);}return 0;
}
3.2、for循环
语法结构:
for(表达式1; 表达式2; 表达式3)
循环语句;
实例:
//for循环
//for (表达式1; 表达式2; 表达式3)
//循环语句;
int main()
{int i = 0;for (i=0; i<10 ;i++){
//表达式1
//表达式1为初始化部分,用于初始化循环变量的。
//表达式2
//表达式2为条件判断部分,用于判断循环时候终止。
//表达式3
//表达式3为调整部分,用于循环条件的调整。printf("i = %d\n",i);}return 0;
}
对比一下和while循环:
int i = 0;
//实现相同的功能,使用while
i=1;//初始化部分
while(i<=10)//判断部分
{
printf("hehe\n");
i = i+1;//调整部分
}
//实现相同的功能,使用while
for(i=1; i<=10; i++)
{
printf("hehe\n");
}
我们可以发现对于循环来说,三大要素:初始化、判断、调整
break和continue在for循环里面的作用:
其实对于break和continue作用和在while循环当中一样都是用于结束循环和跳过之后的代码逻辑
建议:
不可在for 循环体内修改循环变量,防止 for 循环失去控制。
建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
一些for循环的变种:
-
程序死循环
int main()
{for (;;){printf("滴滴\n");}return 0;
}
在for循环当中表达式1、2、3都可以省略,但是当中的分号不可省略,这是语法的规定,但是表达式都没有了的时候,会导致程序死循环,所以省略的时候要注意。
-
循环嵌套
int main()
{int i = 0;int j = 0;for (i = 1; i < 10; i++){//进入第一层for循环就会执行下面的代码(第二层for循环)for (j = 1; j < 10; j++){//每一次的第一层for循环执行都会打印10次printf("滴滴\n");}}//所以总共会打印100个滴滴,也就是执行100次逻辑return 0;
}
相对于for循环的嵌套其实也是比较方便的,其实while当中也可以进行循环的嵌套
-
省略初始化
int main()
{int i = 0;int j = 0;for (; i < 10; i++){//进入第一层循环此时i为0,然后进行第二层的循环//第二层执行完毕j为10,第二次执行第一层循环的时候j依然为10//导致除了第一次的时候第二层循环能够满足条件进入执行其余的都不可以for (; j < 10; j++){printf("滴滴\n");}}//省略初始化的时候这个循环只会执行10次return 0;
}
进行嵌套的时候注意逻辑
-
多个变量控制的for循环
int main()
{int x, y;for (x = 0, y = 0; x < 2 && y < 5; ++x, y++){printf("hehe\n");}return 0;
}
3.3、do while循环
语法格式:
do
循环语句;
while(表达式);
在该循环当中,每次在判断之前都会先进行do里面的逻辑,也就是说判断之前会执行一次循环,相比较while循环的先判断满足条件再循环,do while循环则正好相反。
do while当中的break和continue:
相较于while循环,作用是一样的,就是单纯的逻辑执行顺序有偏差而已
4、goto语句
C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。
语法格式:
//goto语句
int main()
{printf("第一次打印\n");goto Flag;//通过定义Flag,当代码执行至此//会直接跳转到Falg处,执行Flag之后的代码逻辑printf("第二次打印\n");
Flag:printf("第三次打印\n");return 0;
}
但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。
for(...)for(...){for(...){if(disaster)goto error;}}…
error:
if(disaster)// 处理错误情况
更多推荐
C语言里的分支循环语句里的爱恨情仇
发布评论