C Primer Plus学习_18 新的运算符

本文详细解析了for循环的结构与使用方法,包括初始化、测试和更新表达式,并介绍了逗号运算符的应用及其特性。通过具体示例展示了如何利用for循环和逗号运算符简化程序。

昨天说完了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循环和逗号表达式之后,程序就显得很简短了。当然也可以放到语句体之中,凭个人喜好吧。


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值