循环是程序中经常使用的一个功能。通过循环,我们可以让程序重复执行多次。以下是一个使用循环的例子:
//round.c 使用循环进行多次打印
#include <stdio.h>
int main(void)
{
int times;
int i = 1;
printf("输入你喜欢的数字:");
scanf("%d", ×);
while (i <= times) {
printf("说第%d遍你好!\n",i);
i++;
}
return 0;
}
试运行程序:
输入你喜欢的数字:3
说第1遍你好!
说第2遍你好!
说第3遍你好!
我们可以发现,这个程序有着一些新特性。
- 循环的使用:程序使用了while循环,这使得程序能够重复执行多次而不需要重新启动;
- 循环次数的控制由用户决定。用户输入什么数字,程序就打印几次。并且,每次打印的内容会随着次数的变化而变化。
我们现在详细介绍这两个特性。
while循环(看条件)
while循环是一种当型循环。它会首先判断圆括号里的表达式,如果表达式为真,就会执行循环体。如果为假,则不执行。
while循环语句的格式如下:
while(条件表达式){
循环体
}
在上面的例子中,条件表达式是这么一条语句:
i <= times
它的意思是**i
的值小于等于times
的值**。在这个循环中,只要这个表达式为真,程序就会一直重复运行循环体的内容。在这里就是说:只要i
的值小于times
的值,循环体内的内容就会重复运行。
现在来看循环体。在上面的例子中,循环体由以下两个语句组成:
printf("说第%d遍你好!\n",i);
i++;
第一个语句的意思很明确,打印一句话,里面包含变量i
的值。第二个语句的意思是递增i
的值。
在程序第一次执行到循环时,编译器会首先判断条件表达式的真假。我们在上面已经将变量i
的值初始化为1,用户输入了3(这个3被赋给了变量times
)。1显然小于等于3。所以表达式为真,开始执行循环体内的内容。
循环体首先打印一句话:“说第%d
遍你好!”这个转换说明对应的是变量i
的值。在这里,i = 1
。
随后,我们将i
递增。这是很关键的一步。试想一下,如果没有这个语句,i
的值将始终是1,那么条件表达式始终为真,循环就会无限持续下去。所以,i
的值必须要有变化。有时我们从0开始递增,有时我们从次数开始递减。
通过while循环能够有效的控制程序。
for循环(看次数)
一般而言,while循环用于无法预知循环次数的程序。但是有时,我们需要命令程序进行指定次数的循环。这时候,for循环就派上了用场。我们看这个程序:
//for_round.c 使用for循环进行多次打印
#include <stdio.h>
int main(void)
{
int times,i;
printf("输入你喜欢的数字:");
scanf("%d", ×);
for(i = 1;i <= times;i++){
printf("说第%d遍你好!\n",i);
}
return 0;
}
这个程序的运行结果同上一个程序相同。不同的点在于:这个程序使用了for循环。
for循环的基本格式如下:
for(初始化表达式;条件判断表达式;变量调整表达式){
循环体
}
相比之前的while循环,for循环明显更加紧凑。
第一个表达式是初始化变量表达式。它将用于循环控制的变量*(这里是i
)*初始化,代替了原来的int i = 1;
。
第二个表达式是条件判断表达式。它起到判断循环终止条件的作用。和while循环中的条件表达式类似。
第三个表达式是变量调整表达式。它改变用于循环控制的变量的值,以使循环能够在规定的次数内结束。
执行流程
在执行for循环时,首先会执行初始化表达式。这个表达式只会执行一次。然后执行条件判断表达式。判断其为真后,执行循环体。最后执行变量调整语句。
执行完变量调整语句后,再判断条件判断表达式是否为真。若为真,则再执行循环,若为假,则退出循环。
注意:三个表达式缺一不可,表达式与表达式之间要以分号分隔!
循环的基本运用
重复执行程序并设定退出条件
scanf()函数的返回值是它读取的项数。如果没有读取到符合转换说明的值,它就会返回0。正好,C语言中以非0的数表示“真”,以0表示“假”。基于上述条件,我们可以写出这样的程序:
//cm_inch.c 重复执行程序并设定退出条件的单位转换程序
#include <stdio.h>
#define CM_INCH 2.54
int main(void)
{
int i;
float cm, inch;
printf("请输入要转换的厘米长度(输入q以退出):");
i = scanf("%f",&cm);
while (i != 0) {
inch = CM_INCH * cm;
printf("%.2f厘米=%.2f英寸\n",cm,inch);
printf("请输入下一个厘米长度(输入q以退出):");
i = scanf("%f",&cm);
}
printf("程序结束。");
return 0;
}
这个程序的运行结果如下:
请输入要转换的厘米长度(输入q以退出):1
1.00厘米=2.54英寸
请输入下一个厘米长度(输入q以退出):12
12.00厘米=30.48英寸
请输入下一个厘米长度(输入q以退出):123
123.00厘米=312.42英寸
请输入下一个厘米长度(输入q以退出):q
程序结束。
容易看出,这个程序运用了循环的特性与scanf()函数的特性。首先,我们通过重新设定i
的值来决定循环是否继续。当用户输入的是一个数字时,scanf()函数会返回不是0的真值;当用户输入不是数字的内容时,scanf()读不到想要的数字,就会返回0。同时,我们设定的条件判断表达式是(i != 0)
(!表示否),当i
不等于0时,程序会循环(而且我们在循环体内重设了i
的值),当i
等于0时,程序退出循环,也随即结束。
容易知道,用户输入任何非数字都会导致程序结束。我们提示用户输入“q”的目的是为了给用户一个明确的提示。
我们在后面会介绍更多循环的用法。