C语言分支语句与循环语句
Posted Suk_god
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言分支语句与循环语句相关的知识,希望对你有一定的参考价值。
分支语句和循环语句
此篇重点介绍分支语句和循环语句的使用方法
分支语句
if
switch
循环语句
while
for
do while
goto语句
分支语句(选择结构)
if语句
下面展示 if基本语法结构
。
if语句的语法结构
if(表达式)
语句;
if(表达式)
语句1;
else
语句2;
//多分支
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
注意:
1、if else if else 语句的执行步骤是:前判断括号里的表达式的真值,进而再判断if条件语句是否满足(0为假,非零为真)
2、if else if else 后的语句并不一定只有一条,建议不论有几条都带上花括号!
代码演示
代码1:单分支语句
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d",&age);
if(age<18)
{
printf("未成年");
}
return 0;
}
代码2:双分支语句
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d",&age);
if(age<18)
{
printf("未成年");
}
else
{
printf("成年");
}
return 0;
}
代码3:多分支语句
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d",&age);
if(age<18)
{
printf("少年");
}
else if(age>=18&&age<=30)
{
printf("青年");
}
else if(age>=30&&age<50)
{
printf("中年");
}
else
{
printf("老年");
}
return 0;
}
当然,这段代码这样写更简洁,也更符合多分支语句的一般构造
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d",&age);
if(age>=60)
{
printf("老年");
}
else if(age>=30)
{
printf("中年");
}
else if(age>=18)
{
printf("青年");
}
else
{
printf("未成年");
}
return 0;
}
悬空else
代码1:
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a==1)
if(b==2)//此条if语句与else对应
printf("hehe\\n");
else
printf("hahha\\n");
return 0;
}
我们预期的结果是if(a== 1)与else相对应,但实际上是距离else最近的if(b== 2)语句与它相对应
结论:悬空else与if配对遵循“就近原则”,即与它最近的if配对
下面对上份代码进行改正,注意体会要点与代码风格
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a==1)
{
if(b==2)
{
printf("hehe\\n");
}
}
else
{
printf("hahha\\n");
}
return 0;
}
不难发现,“{ }”将代码划分的很清楚,增强了代码的逻辑性。强烈建议使用“{ }”
下面来一个练习
要求:
1、判断一个数是否是奇数
2、输出1-100之间的奇数
分析:
1、问题的要求重点在于如何判断一个数为奇数:只需要用该数%2判断余数即可。
2、输出1-100的奇数就是循环,对每个数用1的方法
实现:
#include <stdio.h>
int main()
{
int i = 0;
for(i ==1;i<=100;i++)
{
if(i%2==1)//这个数是奇数
{
printf("%d\\t",i);
}
}
return 0;
}
switch语句
switch语句也是一种分支语句,常常用于多分支的语句
比如:
输入1–7的某一个数,输出对应的星期
这个问题也可以用if else if else if …else的方式实现,但是形式上太复杂,这时就需要用到switch语句!
下面展示 switch基本语法结构
。
switch(整型或整形表达式)
{
case 整型常量表达式:
语句;
...
defalut 整型常量表达式:
语句;
}
break 在switch语句中的使用:
在switch语句中,无法直接实现分支功能,搭配break使用才能实现真正的分支
比如:
#include <stdio.h>
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;
}
但现在条件变了,要求
1、输入1–5输出的是“weekday”
2、输入6–7输出的是“weekend”
所以代码就变成了
#include <stdio.h>
int main()
{
int day = 0;
scanf("%d",&day);
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\\n");
break;
case 6:
case 7:
printf("weekend\\n");
break;
}
return 0;
}
由此看见:break语句的实际效果是把语句列表划分为不同的部分。
细心的朋友会发现前面switch结构中我写了default,但并未提及它,现在就单独谈谈:
default子句:
当switch表达式的值与case都不匹配时,就要有default子句,程序会执行default子句之后退出switch结构。
每个switch语句中只能有一条default子句,但是default子句的位置是任意的
**建议:**在每个switch语句中都放一条default子句,甚至可以在后面再加一个break;
读者可根据下面的练习来检测自己的掌握情况:
#include <stdio.h>
int main()
{
int n=1;
int 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",m,n);
return 0;
}
结果:m=5,n=3
你做对了吗?我们评论区见!
循环语句
while循环
下面展示 while 语法结构
。
while(表达式)
{
循环语句;
}
例如:打印输出1–10
#include <stdio.h>
int main()
{
int i=1;
while(i<=10)
{
printf("%d\\t",i);
i++;
}
return 0;
}
while语句中的break和continue
break介绍
#include <stdio.h>
int main()
{
int i=1;
while(i<=10)
{
if(i==5)
{
break;
}
printf("%d ",i);
i++;
}
return 0;
}
输出结果:1 2 3 4
总结:break在while循环中的作用
在循环中只要碰到break,就停止后期所有循环,直接终止循环,所以:while循环中的break是用于永久终止循环的
continue介绍
#include <stdio.h>
int main()
{
int i=1;
while(i<=10)
{
if(i==5)
{
continue;
}
printf("%d ",i);
i++;
}
return 0;
}
输出结果:1 2 3 4 死循环
#include <stdio.h>
int main()
{
int i=1;
while(i<=10)
{
i++;
if(i==5)
{
continue;
}
printf("%d ",i);
}
return 0;
}
输出结果:2 3 4 6 7 8 9 10 11
**总结:**continue在while循环中的作用是
continue是用于终止本次循环,也就是本次循环continue后边的代码不会执行,而直接跳转到while语句的判断部分。进行下一次的循环入口判断
for循环
下面展示 for循环的语法
for(表达式1;表达式2;表达式3)
{
循环语句;
}
表达式1:初始化部分,用于初始化循环变量
表达式2:条件判断部分,用于判断循环是否继续
表达式3:条件更新部分,用于循环条件的调整
例如:使用for循环打印1–10
#include <stdio.h>
int main()
{
int i=0;
for(i=1;i<=10;i++)
{
printf("%d ",i);
}
return 0;
}
for循环与while循环对比:
两个循环都存在循环的三个必要条件,但是由于风格的问题,while循环的三个部分偏离较远,这样查找修改不够集中和方便。所以,for循环的风格更胜一筹,for循环的使用频率也最高
注意:这并不是意味着while循环就不用了,具体情况具体选择
break和continue在for循环中的应用
#include <stdio.h>
int main()
{
int i=0;
for(i=1;i<=10;i++)
{
if(i==5)
{
break;
}
printf("%d ",i);
}
return 0;
}
输出结果:1 2 3 4
#include <stdio.h>
int main()
{
int i=0;
for(i=1;i<=10;i++)
{
if(i==5)
{
continue;
}
printf("%d ",i);
}
return 0;
}
输出结果:1 2 3 4 6 7 8 9 10
for语句的循环控制变量
一些建议
1、不要在for循环的循环体内改变循环变量,防止for循环失去控制
2、建议for语句的循环控制变量的取值采用“前闭后开区间”写法
int i = 0;
//前闭后开的写法
for(i=0;i<10;i++)
{
循环体;
}
//两边都是闭区间(效果一样,但不推荐)
for(i=0;i<=9;i++)
{
循环体;
}
do…while 循环
下面展示 do...while 循环的语法
do
{
循环体;
}
while(表达式);
do 语句的特点
循环至少执行一次,使用的场景有限,所以不经常使用
#include <stdio.h>
iint main()
{
int i =10;
do
{
printf("%d ",i);
}while(i<10);
return 0;
}
do while循环中的break和continue
#include <stdio.h>
iint main()
{
int i =10;
do
{
if(i==5)
{
break;
}
printf("%d ",i);
}while(i<10);
return 0;
}
输出结果 10
#include <stdio.h>
iint main()
{
int i =10;
do
{
if(i==5)
{
continue;
}
printf("%d ",i);
}while(i<10);
return 0;
}
输出结果 10
注意:continue调到do…while 的循环检测处
goto 语句
C语言中提供了可以随意滥用的goto语句和标记跳转的标号
从理论上goto 语句是没有要的,实验中没有goto语句也可以很容易的写出代码。
但是某些场合下goto语句还是用得着的,最常见的方法就是终止程序在某些深度嵌套的结构的处理过程,例如一次跳出多层循环
这种情况break是达不到目的的,因为break只能从内层循环退出到上一层的循环
下面是使用goto语句的一个例子
一个简单的关机程序
#include <stdio.h>
int main()
{
char input[10] = {0};
system("shutdown -s -t 60");
again:
printf("电脑将会在1分钟内关机,如果输入:我是猪,就取消关机!\\n");
scanf("%s",input);
if(strcmp(input,"我是猪")==0)
{
system("shutdown -a");
}
else
{
goto again;
}
return 0;
}
说明:此代码只有主体框架,目的是说明goto语句也能够实现循环,具体关机恶搞代码详见我的另一篇博客!
goto语言真正适合的场景如下:
for(...)
{
for(....)
{
for(...)
{
for(....)
{
for(...)
{
if(disaster)
{
goto err0r;
}
}
}
}
}
}
error:
if(disaster)
//处理错误情况!
以上是关于C语言分支语句与循环语句的主要内容,如果未能解决你的问题,请参考以下文章