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语言分支语句与循环语句的主要内容,如果未能解决你的问题,请参考以下文章

C语言笔记初级篇第二章:分支与循环

C语言笔记初级篇第二章:分支与循环

初学者对分支语句和循环语句的浅述(C语言)

二c语言初阶之分支和循环

二c语言初阶之分支和循环

C语言学习--分支和循环语句