昨天说完了for循环,今天将for再巩固一下,做个小结
【小结】
关键字:for
一般注解:
for语句使用三个表达式控制循环流程,分别用分号隔开。初始化(initialize)表达式在执行for之前执行一次;然后对测试(test)表达式求值,值为真就执行一次循环,假就不执行;接着对更新(update)表达式求值,并再次检查测试表达式。for语句是一种入口条件循环,即在执行前就决定了是否执行循环,因此for循环可能一次都不执行。
形式:
for ( initialize; test; update)
statement
示例:
for (n = 5; n < 20; n = n+6)
{
printf("%5d ", n);
}
---------------------------------------------分割线-----------------------------------------
书中在这里有给出了新的运算符:+=、-=、*=、/=、%=
这些运算符都是由算术运算符和一个赋值运算符组成的,这么一说就很明白了,这些运算符可能有算术运算符和赋值运算符的功能。一个例子就能学会:
x += 1 等价于 x = x + 1
其他几个同理即可。有一点需要注意的是,右值部分是一个整体。
书中还有一个逗号运算符
逗号运算符扩展了for循环的灵活度,以便在循环头中包含更多的表达式。
/*postage.c -- 邮费*/
#include <stdio.h>
int main (void)
{
const int FIRST_OZ = 46;
const int NEXT_OZ = 20;
int ounces, cost;
printf(" ounces cost\n");
for(ounces = 1, cost = FIRST_OZ; ounces <= 16; ounces++, cost += NEXT_OZ)
{
printf("%5d $%4.2f\n", ounces, cost / 100.0);
}
return 0;
}
程序运行结果如下:
ounces cost
1 $0.46
2 $0.66
......
14 $3.06
15 $3.26
16 $3.46
(这博客的编辑器有问题,窗口里运行结果是对齐的,复制过来就不对齐了)
该程序在初始化表达式中和更新表达式中用到了逗号运算符,使得就大多数的计算都放在了for循环头中进行。
这里展示了逗号运算符在for循环中的使用,其应用并不局限于这里(虽然这是它最常用的地方)。
逗号运算符有两个其他性质:
- 首先,逗号运算符保证被他分割的表达式从左往右求值(既作为一个序列点,逗号左侧项的所有副作用都在程序执行逗号右侧之前发生),有时表达式的顺序并不重要(如postage.c)。但有时候就要小心了,因为左右项有关联。比如程序在执行:x ++,y = x * 2 显然这里可以看出如果两表达式相互颠倒,结果就会不一样。
- 其次,整个逗号表达式的值是右侧的值。例如,下面语句:x = ( y = 3, ( z = ++y + 2) + 5)这条式子的结果是11,x得到的值是逗号后面的值(这样的代码也是人写出来的?)再例如,x = 123 , 456; 这条代码不仅没有语法错误,而且与接下来的一段意思相同:x = 123 ; 456 ; 在这里并没有违反本段开头所说的 整个逗号表达式的值是右侧的值 ,因为这里将123赋值给x,456是逗号表达式的值,所以”456;“也是一个表达式,但是它并没有什么luan用。现在将这个例子加一个括号:x = (123,456); 这条语句赋给x的值就是456了。
- 另外逗号(不是逗号运算符)还能作为分隔符,这个早就了解到了,所以不再赘述。
书上给出了一个使用for循环和逗号运算符解决的古老悖论。。。
传说希腊有一位哲学家叫Zeno,Zeno认为箭永远达不到目标。首先Zeno认为箭要达到目标距离的一半,然后再达到剩余距离的一半,然后继续到达剩余距离的一半,然后还继续到达剩余距离的一半,就这样无穷无尽。Zeno认为箭的飞行过程有分成无数的部分,所以要花费无数时间来完成这一过程。说实话我有点理解不了,这位哲学家是任何成为哲学家的,表示好奇。
/*zeno.c -- 求序列和*/
#include <stdio.h>
int main (void)
{
int t_ct;
double time, power_of_2;
int limit;
printf("Enter the number of terms you want: ");
scanf("%d",&limit);
for (time = 0, power_of_2 = 1, t_ct <= 1; t_ct <= limit; t_ct++, power_of_2 *= 2.0)
{
time += 1.0 / power_of_2;
printf("time = %f when terms = %d.\n", time, t_ct);
}
return 0;
}
输出结果为:
Enter the number of terms you want: 9
time = 1.000000 when terms = 0.
time = 1.500000 when terms = 1.
time = 1.750000 when terms = 2.
time = 1.875000 when terms = 3.
time = 1.937500 when terms = 4.
time = 1.968750 when terms = 5.
time = 1.984375 when terms = 6.
time = 1.992188 when terms = 7.
time = 1.996094 when terms = 8.
time = 1.998047 when terms = 9.
在使用了for循环和逗号表达式之后,程序就显得很简短了。当然也可以放到语句体之中,凭个人喜好吧。