分支语句和循环语句

switch语句中的break

在switch语句中,我们没法直接实现分支,搭配break使用才能实现真正的分支。
读下面代码,预测结果

#include <stdio.h>
#include<stdlib.h>

int main()
{
	int n = 1;
	int m = 2;
	switch (n)
	{
	case 1:
		m++;
	case 2:
		n++;
	case 3:
		switch (n)
		{//switch允许嵌套使用
		case 1:
			n++;
		case 2:
			m++;
			n++;
			break;
		}
	case 4:
		m++;
		break;
	default:
		break;
	}
	printf("m = %d, n = %d\n", m, n);
	system("pause");
	return 0;
}
m = 5, n = 3
请按任意键继续. . .

goto语句

C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,例如一次跳出两层或多层循环。这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。下面的错误处理就是使用goto语句的一个例子:
为了代码规范化,建议少用甚至不用goto语句。实际使用中同一份代码最好不要出现两个以上的goto语句,容易失去控制。

for (...)
{
	for (...)
	{
		for (...)
		{
			if (disaster)
				goto error;
		}
	}
}
…
error :
if (disaster)
// 处理错误情况

循环语句中的break和continue

其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。所以:while中的break是用于永久终止循环的
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。

使用循环语句的建议

  1. 在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少 CPU 跨切循环层的次数。
  2. 如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。
//代码1
for (i = 0; i<N; i++)
{
 if (condition)
 DoSomething();
 else
 DoOtherthing();
}
//代码2
if (condition)
{
 for (i = 0; i<N; i++)
 DoSomething();
}
else
{
 for (i = 0; i<N; i++)
 DoOtherthing();
}

程序1比程序2多执行了N-1 次逻辑判断。并且由于前者老要进行逻辑判断,打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。如果 N 非常大,最好采用程序2的写法,可以提高效率。如果N 非常小,两者效率差别并不明显,采用程序1的写法比较好,因为程序更加简洁。

计算 1!+2!+3!+……+10!

#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include <stdio.h>

int main()
{
	int n;
	printf("请输入一个正数n>");
	while (scanf("%d", &n))
	{
		//n!+(n-1)!+(n-2)!+...+3!+2!+1!
		int ret = 0;
		int i = 0;
		for (i = n; i > 0; i--)//先算n!
		{
			int ret1 = 1;
			for (int j = i; j > 0; j--)
				ret1 *= j;
			ret += ret1;
		}
		printf("结果:%d\n", ret);
	}
	
	system("pause");
	return 0;
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值