6.5 for循环

for循环把所有这三种动作(初始化、测试、更新)都放在一起。通过使用for循环,您可以用程序清单6.11中的程序来代替前一个程序。

程序清单6.11 sweetie2.c程序

阅读 ‧ 电子书库

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

在关键字for之后的圆括号中包含了由两个分号分开的三个表达式。第一个表达式进行初始化,它在for循环开始的时候执行一次。第二个表达式是判断条件,在每次执行循环之前都要对它进行求值。当表达式为假(count大于NUMBER)时,循环就结束了。第三个表达式进行改变或称为更新,它在每次循环结束时进行计算。程序清单6.10使用它来递增count的值,但是并没有限制一定要这样使用它。这之后的一个简单或复合语句结束了for语句。三个控制表达式中的每一个都是完整的表达式,所以任意一个控制表达式的任何副作用(例如把一个变量的值递增)都在程序求下一个表达式的值之前生效。图6.3总结了for循环的结构。

阅读 ‧ 电子书库

图6.3 for循环的结构

我们来看另外一个例子,程序清单6.12在一个打印立方表的程序中使用了for循环。

程序清单6.12 for_cube.c程序

阅读 ‧ 电子书库

程序清单6.12打印出了从1到6的整数以及它们的立方。

 

 

n n cubed
1 1
2 8
3 27
4 64
5 125
6 216

for循环的第一行告诉我们关于循环参数的所有信息:num的初始值,num的最终值以及num在每次循环的增量。

利用for的灵活性

尽管for循环看上去类似于FORTRAN的DO循环、Pascal的FOR循环以及BASIC的FOR…NEXT循环,但实际上for循环比它们中的任何一种都要灵活得多。这种灵活性来自于在一个for语句中如何使用三个表达式。迄今为止的例子使用第一个表达式来初始化计数器,第二个表达式来表达对计数器的限制,第三个表达式来把计数器的值加1。当使用这种方法时,C的for语句与我们提到的其他语句非常相似。但是还有更多其他的可能性,下面是其中的9种:

1.您可以使用减量运算符来减小计数器而不是增加它。

阅读 ‧ 电子书库

下面是它的输出:

5 seconds!

4 seconds!

3 seconds!

2 seconds!

1 seconds!

We have ignition!

2.如果需要,您可以让计数器依次加2,加10,等等:

阅读 ‧ 电子书库

这个例子在每次循环中把n增加13,打印输出如下:

2

15

28

41

54

3.您也可以用字符代替数字来进行计数:

阅读 ‧ 电子书库

部分输出如下:

The ASCII value for a is 97.

The ASCII value for b is 98.

The ASCII value for x is 120.

The ASCII value for y is 121.

The ASCII value for z is 122.

这段程序可以工作,因为字符是以整数的形式进行存储的,所以这个循环实际上仍然是用整数来计数的。

4.您可以判断迭代次数之外的条件。在for_cube程序中,您可以将:

阅读 ‧ 电子书库

如果与限制循环次数相比,您更关心限制立方的大小,就可以使用这种判断条件。

5.您也可以让数量几何增加而不是算术增加;也就是说,不是每次加一个固定的数,而是乘上一个固定的数:

阅读 ‧ 电子书库

这段程序在每次循环中把debt的值乘以1.1,即每次把它增加10%。输出看上去是这个样子:

Your debt is now $100.00.

Your debt is now $110.00.

Your debt is now $121.00.

Your debt is now $133.10.

Your debt is now $146.41.

6.在第三个表达式中,您可以使用所需的任何合法表达式。无论您使用的是什么,在每次循环中都会得到更新。

阅读 ‧ 电子书库

这个循环打印出x与代数表达式++x*5+50的值。输出看上去是这个样子:

 

 

1 55
2 60
3 65
4 70
5 75

注意判断中涉及到y,而不是x。for循环控制中的三个表达式可以使用不同的变量(注意尽管这个例子是合法的,它并不是好的编程风格。如果不是使用一个代数计算来进行更新,这个程序将会更清楚)。

7.您甚至可以让一个或多个表达式为空(但是不要遗漏分号)。只须确保在循环中包含了一些能使循环最终结束的语句。

阅读 ‧ 电子书库

下面是输出:

n = 3; ans = 54.

在循环中n的值保持为3。变量ans的值开始为2,然后增加到6、18,最后为54(18小于25,所以for循环再执行一次,用18乘以3来得到54)。顺便说一句,中间的那个控制表达式为空会被认为是真,所以下面的循环会永远执行:

阅读 ‧ 电子书库

8.第一个表达式不必初始化一个变量,它也可以是某种类型的printf()语句。要记住第一个表达式只在执行循环的其他部分之前被求值或执行一次。

阅读 ‧ 电子书库

这段程序只把第一条消息打印一次,然后在您输入6之前不断地接收数字:

Keep entering numbers!

3

5

8

6

That's the one I want!

9.循环中的动作可以改变循环表达式的参数。例如,假定您有一个这样的循环:

for(n = 1; n < 10000; n = n + delta)

如果执行几次循环之后,程序觉得delta的值太小或太大,循环中的if语句(第7章“C控制语句:分支和跳转”)就可以改变delta的大小。在交互式程序中,delta的值可以在循环运行时由用户进行改变。这种调节有一点危险,例如把delta设置为0会使您(和循环)停步不前。

简言之,因为您拥有选择for循环的控制表达式的自由,这使得您在执行固定次数的循环之外还可以做更多的事情。通过使用我们马上要讨论的一些运算符,for循环的有效性可以得到进一步的提高。