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语句的判断部分。进行下一次循环的入口判断。
使用循环语句的建议
- 在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少 CPU 跨切循环层的次数。
- 如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。
//代码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;
}