C语言中的分支与循环语句

从所周知,C语言是一种结构化的程序设计语言,其中的结构包括顺序结构、选择结构、循环结构。

我们可以通过分支语句和循环语句来实现选择结构与循环结构。

分支语句:if语句、switch语句

循环语句:while语句、do...while语句、for语句


1.分支语句:

1.1 if语句:

1.1.1基本语法形式

当表达式结果为真时,执行语句;表达式结果为假时,则不执行语句。

值得注意的是,在C语言中,非0表示真,0表示假!!!

举个例子:

#include<stdio.h>
int main()
{
	int a = 1;
	if (a == 1)//a = 1,括号里的表达式结果为真,执行下面的printf语句
	{
		printf("呵呵\n");
	}
	return 0;
}

结果如下图:

1.1.2 else

先举个例子,然后解释。

//这是一段判断奇偶数的代码
#include<stdio.h>
int main()
{
	int number = 0;
	scanf("%d", &number);//输入一个数字
	if (number % 2 == 0)//当一个数字能被2整除时,说明这个数是偶数。(运算符 % 表⽰求模运算,即返回两个整数相除的余值。)
	{
		printf("%d是偶数\n", number);
	}
	else//当一个数字不是偶数时,那它只能是奇数。
	{
		printf("%d是奇数\n", number);
	}
	return 0;
}

从上面的例子中我们不难看出,当if()里的表达式不成立(结果为假时),就会执行else下包含的语句。换句话说,就是else语句对应的是if语句中条件判断的相反情况

1.1.3 多重分支(多重选择)与嵌套if语句

如果说把if...else比作一个人来到一个路口,他只有两条路可以走,要么走if路,要么走else路,他只有两种选择。

而else if语句可以让这个人拥有更多条路可以走,并且嵌套if可以在一条路上开辟更多的道路。

举个例子: 

​
​
#include<stdio.h>
int main()
{
	int num = 0;
	scanf("%d", &num);//输入一个数字
	if (num > 0)//在输入的数字大于0的情况下,再去判断该数字是奇数还是偶数
	{
		if (num % 2 == 0)
			printf("%d是偶数\n", num);
		else
		    printf("%d是奇数\n", num);
		
	}
	else if (num == 0)//输入的数字等于0的情况下
		printf("%d既不是正数也不是负数\n", num);	
	else//输入的数字小于0的情况下
		printf("%d是负数\n",num);
	return 0;
}

​

​

相信通过上面的例子,大家应该可以理解多重分支与嵌套if语句。

需要值得注意的是,在默认情况下,无论是if语句还是else语句,都只控制一条语句,如果想要其控制两条语句,就必须加{}将其括起来!!!(敲重点,这很重要)

还有一个重点知识需要关注的是悬空else的问题,大家可以想想如果有多个else语句和if语句,那么它们之间是怎样配对的呢?

答案就是:else 总是跟最接近的 if 匹配。

我们来看看下面的例子:

大家可以看到,这段代码什么也没有输出,这是为什么呢?

记住!else 总是跟最接近 的 if 匹配。所以,这段代码中的else语句是跟if(b==1)语句配对,它们作为一个整体,嵌套在第一个if语句。当a=0时,a == 3表达式的结果为假,第一个if语句不成立,那么下面的if...else语句自然没有机会执行。

最后再强调一遍:else 总是跟最接近的 if 匹配。

大家务必记住这条规则!!!


1.2 switch语句:

1.2.1基本语法形式

switch语句会根据expression中不同的值,来执行相对应的case分支,如果没有相应的case分支,则执行default分支。(case与default没有顺序要求,只是一般我们把default放在最后面)

在上面的代码中,expression必须是整型表达式,value必须是整型常量表达式。

1.2.2 switch语句中的break语句

在switch语句中,我们使用break语句跳出当前switch语句,如果一个case语句中的后边没有break语句,程序则会往下按顺序执行另外的case语句。

具体情况可看下面例子:

因为每个case分支中的语句后边没有加break语句,导致程序从case 0开始往下依次执行case 1、case 2分支中的语句。

显然这不是我们想要的效果,这时我们加上break语句看看。

当我们加上break语句时,结果就大不一样了。

虽然break语句在switch语句中很重要,但这并不意味着我们得在每个case语句后边加上break语句。

请看下面的例子:

总的来说,我们得根据实际需要来在case语句后边加上break语句。

2.循环语句:

2.1 while循环:

2.1.1 基本语法形式

while(表达式)
{
   语句;
}

首先,当程序执行到while这里后,会根据表达式的值来判断是否进去while循环。表达式的值为0,不执行while循环语语句;表达式的值为非0,则会进去while循环,执行循环语句。

每次执行完循环语句后,都会重新判断表达式的值,以此决定是否继续执行循环语句。

我们通过一个简单的例子来看看while循环。 

可以看到当表达式为1时,就会无限次执行循环语句,持续不断地打印”呵呵“。

由此可见,在实际写代码过程中,我们要设置好while循环的条件,不然就可能导致代码死循环。

接下来,我们看下while循环具体的应用:打印数字1-10。

2.2 do...while循环

2.2.1 基本语法形式

{
  语句;
}while(表达式);

do...while循环跟while循环是比较相似的,do...while循环会先执行一次循环语句,再去判断表达式的值,以此决定是否继续执行循环语句。

do...while循环跟while循环相比,它至少会执行一次循环语句,而while循环可以不执行。

我们再来打印一下数字1-10。

可以看出,两次代码的差别不大。

do...while循环在实际写代码过程中使用频率较少,因为只有在循环体⾄少被执⾏⼀次的场景下,do...while循环才能发挥作用。

2.3 for循环

2.3.1 基本语法形式

for(表达式1;表达式2;表达式3)
{
    语句;
}
 

表达式1:用于循环变量的初始化

表达式2:用于判断循环是否结束

表达式3:用于调整一次循环后的变量

for循环的执行流程:首先执行表达式1,对循环变量进行初始化;然后执行表达式2,其结果为0,结束循环,结果不为零,则执行循环语句;接着执行表达式3,进行循环变量的调整。然后执行表达式2,根据其结果判断是否继续执行循环。

所以表达式1整个循环只会执行一次,然后都是表达式2,循环语句,表达式3在循环。

可以借助流程图帮助理解

我们还是举打印数字1-10的例子。

3.break语句和continue语句:

在执行循环时,当某个特殊条件出现时,我们希望提前结束循环。此时break语句和continue语句就派上用场了。

break语句:用于永久终止循环,当程序执行break语句后,立即结束循环。

continue语句:跳过此次循环continue后边的代码。

break语句在三种循环的效果基本一致,所以只举一个for的例子。

当i == 6时,跳出循环,6及6后面的数字就不打印的了。

接下来我们看看continue语句在三种循环的区别。

当i == 6时,执行continue,跳过了continue后面的代码,直接来到了i++这步,所以打印的数字少了6。 

上面的while和do...while的情况类似,当i == 6后,就执⾏continue,直接跳过continue的代码,去循环的判断的地⽅,但是由于跳过了i++,i一直为6,这时代码就陷入了死循环。

由此可知,对于continue语句的使用要谨慎,当调整循环变量的表达式在continue后面,continue将其跳过,直接来到循环变量判断的部分,此时就有可能导致代码死循环。


这次就先写到这里了,因为是第一次写体量大的博客,可能会有许多不足的地方,还请看到这篇博客的有缘人见谅了,我也非常欢迎大家的建议与指正。

感谢观看,我们下一篇博客见!!!

  • 22
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值