C语言之分支与循环
【前言】
哈罗,大家好,这里是某不知名博主的博客,这一次的博客内容是有关于C语言的分支和循环的总结,是初识C语言这一章里的一部分内容的扩展,诸位多多指教。
一、分支语句
if…else
switch
if语句
语法结构:
1、if(表达式)
语句;
2、if(表达式)
语句1;
else
语句2;
3、if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
说明:
- 表达式结果为真(非0),则语句执行,假(0)不执行表达式后面的语句而直接执行位于该if语句后的下一条语句
- 语句有多条时,需要用{ }括起来,使代码的逻辑更加清楚
- else总和位于它前面的最近的未配对的if配对,因此为了提高代码的可读性,不可将else悬空,作为一个想要成为大有出息的程序员的我们,要形成良好的代码风格
代码举例:
代码内容为输入成绩grade,区间为[0,100],如果成绩在[90,100]区间内输出优秀,在[80,90)区间内输出良好,在[60,80)区间内输出合格 ,低于60输出不合格。
#include <stdio.h>
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;
}
效果:
switch语句
语法结构:
switch(整形表达式)
{
case 整形常量表达式:
语句;
}
说明:
当分支语句过于多时,使用if…else语句的形式会过于冗余,这时switch语句就会派上用场了,该语句常常用于多分支的情况
switch后面的( )中放的是整形表达式,包括整形、字符型、枚举数据型,所以( )中是浮点型的话就会出现错误,case后面的整形常量表达式要与之匹配
case语句和整形常量表达式之间一定要有一个空格,并且case后面如果需要执行多条语句,是不需要用花括号括起来的
switch语句中,需要搭档break使用才能实现真正的分支。其实际效果是吧语句划分为不同的部分,在每条case语句的后面都加上break是一个良好的编程习惯,可以避免在很久以后再添加一条case语句时前面没有break而产生错误的情况
default子句,在switch语句中的所有case标签的值都无法匹配时,需要在语句列表中增加一条default子句,此时该子句后面的语句就会被执行,该子句可以出现在语句列表中的任何位置。每个switch语句都放一条default子句,并且在后面加一个break是一个编程好习惯
switch语句的执行是按顺序的,当括号内的整形表达式的值和某case后整形常量表达式的值相等时,就执行其后面的语句,执行完后自动执行下一个case后面的语句,直到遇见break或者switch语句的右括号为止
代码举例:
实现一个星期的分支,使输入1-5时输出"工作日",输入6-7时输出"休息日",输入非1-7之间的数时输出"输入错误"
#include <stdio.h>
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;
}
效果:
二、循环语句
- while
- for
- do while
while语句
语法结构:
while(表达式)
循环语句;
说明:
- 当while后面的表达式为真时即非0,则执行循环语句,完成一次循环之后再来判断表达式的值,重复操作,直到表达式的值为假即0时,结束循环,该条while语句就执行完毕了。属于前测循环
- 若循环语句包含一条以上的语句时,应该用花括号括起来,不括起来的话,就只有while后面的第一条语句才是循环体语句
- while语句中也有break,在循环中只要遇见break,就会停止后期的所有的循环,跳出循环语句,永久终止循环
- while语句中有continue语句,该语句用于终止本次循环。运行到这里时,continue后面的代码就不会再执行了,而是直接跳到while语句后面的判断表达式部分,进行下一次循环的入口判断
代码举例:
一个包含while语句,break语句和continue语句的代码
#include <stdio.h>
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;
}
效果:
代码图解:
for 循环
语法结构:
for(表达式1;表达式2;表达式3)
循环语句;
说明:
- 表达式1为初始化部分,用于初始化循环变量的。
表达式2为条件判断部分,用于判断循环时候终止。
表达式3为调整部分,用于循环条件的调整。
- for( ; ; )无条件,无论如何都为真
for(xx; ;xx)表达式2不写就没有了判断条件,为死循环,需要靠break语句跳 出循环
for( ;xx; )表达式1不写,可以在for循环之前初始化循环变量,
表达式2不写,可以在循环过程中改变循环控制变量的值
for循环中也可以出现break和continue,他们的意义和在while循环中是一样的。 但是还是有些差异,比如使用continue时,for循环continue后结束本次循环后,仍然会进行循环条件的调整使循环继续;while循环就极有可能跳过循环调整部分导致死循环
关于for的二三建议:
(1)不可在for 循环体内修改循环变量,防止 for 循环失去控制。
(2) 建议for语句的循环控制变量的取值采用“前闭后开区间”写法,比如这样写for(i = 0; i < 10; i ++);这样i在一定程度上有了意义,代表了10次循环
代码举例:
关于continue在while循环和for循环中的区别
//在while循环中
#include <stdio.h>
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;
}
//在for循环中
#include <stdio.h>
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;
}
效果:
do while语句
语法结构:
do
循环语句;
while(表达式);
说明:
- do while语句就是一种先斩后奏的后测循环,先执行循环体语句,然后求表达式的值。若表达式的值为非0即为真,返回继续执行循环体语句,如此重复,直到表达式的值为0即条件为假,结束循环。
- do while循环语句中break和continue仍然适用
- while后面的表达式后记得加一个分号
代码举例:
do while语句中break和continue的应用
#include <stdio.h>
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;
}
#include <stdio.h>
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;
}
效果:
三、goto语句
语法结构:
goto 语句标号;
语句标号:
//语句标号可以放在自己想要放在某一语句行的前面
说明:
- goto语句称为无条件转移语句,在实践中最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,比如一次跳出多层循环
- goto语句不可滥用否则会造成程序结构的紊乱
代码举例:
for(...)
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
....
error:
if(disaster)
//处理错误
本章了结,如有内容有误,欢迎指导,如有疑问,博主定当回答
最后希望大家一起努力,冲!