while语句
如上一节中用递归的方法解决计算n!这一迭代问题,不过虽然可以用递归实现,但是循环语句实现起来更为方便,如循环语句计算n!
使用:while(控制表达式) 语句
如果控制表达式的值为真,子语句就被执行,不断判断循环这一过程直到控制表达式的值为假,跳出循环。
int factorial(int n)
{
int res=1;
while(n>0)
{
res=res*n;
n=n-1;
}
return res;
}
变量res在这个循环中的作用是累加器,把每次循环的中间结果累积起来,变量n是循环变量,每次循环要改变它的值,在控制表达式中要测试它的值,这两点合起来起到控制循环次数的作用。
可见,递归能解决的问题用循环也能解决,但解决问题的思路不一样。
在循环过程中注意一定要有跳出循环的点防止死循环。
do/while语句
使用:do 语句 while(控制表达式)
与while语句区别在于:while语句先测试控制表达式的值再执行循环体,而do/while语句先执行循环体再测试控制表达式的值。如果控制表达式的值一开始就是假,while语句的循环体一次都不执行,而do/while语句的循环体仍然要执行一次再跳出循环。
如求n!:
int factorial(int n)
{
int result = 1;
int i = 1;
do
{
result = result * i;
i = i + 1;
} while (i <= n);
return result;
}
注意:写循环一定要注意循环即将结束时控制表达式的临界条件是否准确。
for语句
使用:for (控制表达式1; 控制表达式2; 控制表达式3) 语句
若循环体内不含continue,for循环相当于控制表达式1; while(控制表达式2){ 语句 控制表达式3}
表达式1、3都可以为空。
求n!:
int factorial(int n)
{
int result = 1;
int i;
for(i = 1; i <= n; ++i)
result = result * i;
return result;
}
break、continue语句
break语句:用来跳出switch语句块、跳出循环体。
continue语句:终止当前循环,和break语句不同的是,continue语句终止当前循环后又回到循环体的开头准备执行下一次循环。
对于while循环和do/while循环,执行continue语句之后测试控制表达式,如果值为真则继续执行下一次循环;对于for循环,执行continue语句之后首先计算控制表达式3,然后测试控制表达式2,如果值为真则继续执行下一次循环。
嵌套循环
在循环中调用一个函数,而那个函数里面又有一个循环,这就是一种嵌套循环。
如用嵌套循环求1-100的素数:
int main(void)
{
int i, j;
for (i = 1; i <= 100; i++)
{
for (j = 2; j < i; j++)
if (i % j == 0)
break;
if (j == i)
printf("%d\n", i);
}
return 0;
}
goto语句和标号
goto语句,可以实现无条件跳转。如果在一个嵌套循环中遇到某个错误条件需要立即跳
出最外层循环做出错处理,就可以用goto语句。如:
for (...)
{
for (...)
{
...
if(出现错误条件)
goto error;
}
error:
出错处理;
}
这里error叫做标号,任何语句前面都可以加若干个标号,每个标号的命名也要遵循标识符的命名规则。
goto语句过于强大了,从程序中的任何地方都可以无条件跳转到任何其它地方,只要在那个地方定义一个标号就行,唯一的限制是goto只能跳转到同一个函数中的某个标号处,而不能跳到别的函数中。如上面只能跳到error后进行出错处理。