# C语言之分支与循环
## 一、分支语句
>* **if......else**
>
>* **switch**
### if语句
~~~text
语法结构:
1、if(表达式)
语句;
2、if(表达式)
语句1;
else
语句2;
3、if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
~~~
说明:
>1. 表达式结果为真(非0),则语句执行,假(0)不执行表达式后面的语句而直接执行位于该**if**语句后的下一条语句
>2. 语句有多条时,需要用{ }括起来,使代码的逻辑更加清楚
>3. **else**总和位于它前面的最近的未配对的**if**配对,因此为了提高代码的可读性,不可将**else**悬空,作为一个想要成为大有出息的程序员的我们,要形成良好的代码风格
代码举例:
代码内容为输入成绩grade,区间为[0,100],如果成绩在[90,100]区间内输出优秀,在[80,90)区间内输出良好,在[60,80)区间内输出合格 ,低于60输出不合格。
~~~c
#include
int main()
{
int grade = 0;
printf("请输入0到100的分数成绩:");
scanf("%d",&grade);
if(grade >= 90 && grade <= 100)
//在逻辑语句中不能写成100>=grade>=90这样的形式,会引起错误
//例如输入95,100>=grade为真返回1,1小于90,为假返回0,不输出优秀,这违背了优秀的定义
printf("优秀\n");
else if(grade < 90 && grade >= 80)
printf("良好\n");
else if(grade <80 && grade >= 60)
printf("合格\n");
else
//低于60分的情形
printf("不合格\n");
return 0;
}
~~~
效果:
![输入图片说明](https://images.gitee.com/uploads/images/2021/0417/093518_a0bb6e41_8907017.png "分数if.png")
### switch语句
~~~text
语法结构:
switch(整形表达式)
{
case 整形常量表达式:
语句;
}
~~~
说明:
>1. 当分支语句过于多时,使用**if**...**else**语句的形式会过于冗余,这时**switch**语句就会派上用场了,该语句常常用于多分支的情况
>2. **switch**后面的( )中放的是整形表达式,包括整形、字符型、枚举数据型,所以( )中是浮点型的话就会出现错误,**case**后面的整形常量表达式要与之匹配
>3. **case**语句和整形常量表达式之间一定要有一个空格,并且**case**后面如果需要执行多条语句,是不需要用花括号括起来的
>
>4. **switch**语句中,需要搭档**break**使用才能实现真正的分支。其实际效果是吧语句划分为不同的部分,在每条**case**语句的后面都加上**break**是一个良好的编程习惯,可以避免在很久以后再添加一条**case**语句时前面没有**break**而产生错误的情况
>
>5. **default**子句,在**switch**语句中的所有**case**标签的值都无法匹配时,需要在语句列表中增加一条**default**子句,此时该子句后面的语句就会被执行,该子句可以出现在语句列表中的任何位置。每个**switch**语句都放一条**default**子句,并且在后面加一个**break**是一个编程好习惯
>6. **switch**语句的执行是按顺序的,当括号内的整形表达式的值和某**case**后整形常量表达式的值相等时,就执行其后面的语句,执行完后自动执行下一个**case**后面的语句,直到遇见**break**或者**switch**语句的右括号为止
代码举例:
实现一个星期的分支,使输入1-5时输出"工作日",输入6-7时输出"休息日",输入非1-7之间的数时输出"输入错误"
~~~c
#include
int main()
{
int day = 0;
scanf("%d",&day);
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
//前4条case语句没有语句,也没有加break,程序就会按顺序向下执行,
//直到遇见第五条case语句,输出了工作日并且执行break跳出分支语句
case 6:
case 7:
printf("休息日\n");
break;
default:
printf("输入错误\n");
//当输入非1-7之间的数时就会执行default子句
}
return 0;
}
~~~
效果:
![输入图片说明](https://images.gitee.com/uploads/images/2021/0417/093543_aac586ed_8907017.png "switch星期输出.png")
## 二、循环语句
>* **while**
>* **for**
>* **do while**
### while语句
~~~text
语法结构:
while(表达式)
循环语句;
~~~
说明:
>1. 当**while**后面的表达式为真时即非0,则执行循环语句,完成一次循环之后再来判断表达式的值,重复操作,直到表达式的值为假即0时,结束循环,该条**while**语句就执行完毕了。属于前测循环
>2. 若循环语句包含一条以上的语句时,应该用花括号括起来,不括起来的话,就只有**while**后面的第一条语句才是循环体语句
>3. **while**语句中也有**break**,在循环中只要遇见**break**,就会停止后期的所有的循环,跳出循环语句,永久终止循环
>4. **while**语句中有**continue**语句,该语句用于终止本次循环。运行到这里时,**continue**后面的代码就不会再执行了,而是直接跳到**while**语句后面的判断表达式部分,进行下一次循环的入口判断
代码举例:
一个包含**while**语句,**break**语句和**continue**语句的代码
~~~c
#include
int main()
{
int i = 1,x = 1;
while(i <= 20)
{
if(x >= 10)
break;
//当x>=10这个条件成立时,执行break跳出循环,
//执行printf函数的那条语句
if(x % 2 == 1)
{
x += 5;
continue;
//当x%2==1这个条件成立时,执行continue,结束本次循环,
//回到while后面判断i<=20这条语句
}
x -= 3;
i ++;
}
printf("i= %d,x= %d\n",i,x);
return 0;
}
~~~
效果:
![输入图片说明](https://images.gitee.com/uploads/images/2021/0417/093612_cfe6b650_8907017.png "PF1F`_@H7T[I0CV~8U37%7I.png")
代码图解:
![输入图片说明](https://images.gitee.com/uploads/images/2021/0417/093625_fc5de5b2_8907017.png "break,continue,while.png")
### for 循环
~~~text
语法结构:
for(表达式1;表达式2;表达式3)
循环语句;
~~~
说明:
>1. **表达式1**为初始化部分,用于初始化循环变量的。
>
> **表达式2**为条件判断部分,用于判断循环时候终止。
>
> **表达式3**为调整部分,用于循环条件的调整。
>
>2. **for**( ; ; )无条件,无论如何都为真
>
> **for**(xx; ;xx)表达式2不写就没有了判断条件,为死循环,需要靠**break**语句跳 出循环
>
> **for**( ;xx; )表达式1不写,可以在for循环之前初始化循环变量,
>
> 表达式2不写,可以在循环过程中改变循环控制变量的值
>
>3. **for**循环中也可以出现**break**和**continue**,他们的意义和在**while**循环中是一样的。 但是还是有些差异,比如使用**continue**时,**for**循环continue后结束本次循环后,仍然会进行循环条件的调整使循环继续;**while**循环就极有可能跳过循环调整部分导致死循环
>
>4. 关于**for**的二三建议:
>
> (1)不可在for 循环体内修改循环变量,防止 for 循环失去控制。
>
> (2) 建议for语句的循环控制变量的取值采用“前闭后开区间”写法,比如这样写for(i = 0; i < 10; i ++);这样i在一定程度上有了意义,代表了10次循环
代码举例:
关于**continue**在**while**循环和**for**循环中的区别
~~~c
//在while循环中
#include
int main()
{
int i = 1;
while(i <= 10)
{
if(5 == i)
continue;
//当i==5时,这个continue结束本次循环,进行while判断,
//并没有对变量i进行调整,导致i一直等于5,死循环了
printf("%d ",i);
//因此输出部分只打印了1 2 3 4,然后就死循环了
i++;
}
return 0;
}
~~~
~~~c
//在for循环中
#include
int main()
{
int i = 0;
for(i = 1; i <= 10; i++)
{
if(5 == i)
continue;
//当i==5时,这个continue结束了本次循环,回到for循环语句,
//此时对变量i进行了调整,i等于6了,循环继续
printf("%d ",i);
//因此输出部分打印了1 2 3 4 6 7 8 9 10,只是跳过了5
}
return 0;
}
~~~
效果:
![输入图片说明](https://images.gitee.com/uploads/images/2021/0417/093655_674767bd_8907017.png "continue效果异.png")
### do while语句
~~~text
语法结构:
do
循环语句;
while(表达式);
~~~
说明:
>1. **do while**语句就是一种先斩后奏的后测循环,先执行循环体语句,然后求表达式的值。若表达式的值为非0即为真,返回继续执行循环体语句,如此重复,直到表达式的值为0即条件为假,结束循环。
>2. **do while**循环语句中**break**和**continue**仍然适用
>3. **while**后面的表达式后记得加一个分号
代码举例:
**do while**语句中**break**和**continue**的应用
~~~c
#include
int main()
{
int i = 1;
do
{
if(5 == i)
//在这里最好写成5==i,虽然意义和i==5一样,
//但是它可以防止意外将==(等号)写成=(赋值),因为5是常数不可以被赋值改变
break;
//当i==5时,跳出循环
printf("%d ",i);
i++;
}while(i <= 10);
return 0;
}
~~~
~~~c
#include
int main()
{
int i = 1;
do
{
if(5 == i)
continue;
//当i==5时,结束本次循环,直接判断i<=10,跳过了i++,
//变量i无法调整,进入死循环
printf("%d ",i);
i++;
}while(i <= 10);
return 0;
}
~~~
效果:
![输入图片说明](https://images.gitee.com/uploads/images/2021/0417/093719_b22390ee_8907017.png "do while.png")
## 三、goto语句
~~~c
语法结构:
goto 语句标号;
语句标号:
//语句标号可以放在自己想要放在某一语句行的前面
~~~
说明:
>1. **goto**语句称为无条件转移语句,在实践中最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,比如一次跳出多层循环
>2. **goto**语句不可滥用否则会造成程序结构的紊乱
代码举例:
~~~c
for(...)
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
....
error:
if(disaster)
//处理错误
~~~
一键复制
编辑
Web IDE
原始数据
按行查看
历史