阅读 ‧ 电子书库 总结:新运算符
赋值运算符:
这些运算符使用指定的操作根据其右边的值来更新其左边的变量。

 

 

+= 把右边的值加到左边的变量上
-= 从左边的变量中减去右边的值
*= 把左边的变量乘以右边的值
/= 把左边的变量除以右边的值
%= 给出左边的变量除以右边的值之后的余数
例如:
rabbits *=1.6;
等于
rabbits = rabbits * 1.6;
这些复合赋值运算符和普通的赋值运算符有着同样的比较的运算优先级,比算术运算符的优先级要低得多。因此,以下的两条语句最终效果相同:
contents *=old_rate + 1.2;
contents = contents * (old_rate + 1.2);
逗号运算符:
逗号运算符把两个表达式链接为一个表达式,并保证最左边的表达式最先计算。它通常被用在for循环的控制表达式中以包含多个信息。整个表达式的值是右边表达式的值。
例如:
for(step = 2, fargo = 0; fargo < 1000; step *=2)
fargo+=step;

当Zeno遇到for循环

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

我们来看一下如何使用for循环和逗号运算符来帮助解决一个古老的悖论。希腊哲学家Zeno曾经辩论说一支箭永远不能达到它的目标。他说,首先箭要到达目标距离的一半,然后又必须到达剩余距离的一半,然后还有一半,这样就没有穷尽。Zeno说因为这个旅程有无限个部分,所以箭要花费无限的时间才能结束这个旅程。但是我们怀疑在这个论点中,Zeno是自愿作为靶子。

我们采取一种定量的方法,假定箭用一秒的时间走完前一半距离,然后要用1/2秒的时间来走完剩下的距离的一半,1/4秒的时间来走完再次剩下的距离的一半,等等。可以用以下的无限序列来表示总的时间:

阅读 ‧ 电子书库

程序清单6.14中的简短程序求出了前几项的和。

程序清单6.14 zeno.c程序

阅读 ‧ 电子书库

下面是前15项的输出:

阅读 ‧ 电子书库

可以看到,尽管不断地添加新的项,总和看起来是变化不大的。数学家们确实证明了当项的数目接近无穷时,总和接近于2.0,就像这个程序表明的那样。下面是一个证明,假定您用S来表示总和:

阅读 ‧ 电子书库

这里的省略号意味着“等等”。把S除以2得到:

阅读 ‧ 电子书库

从第一个表达式中减去第二个表达式得到:

阅读 ‧ 电子书库

除了第一个值1,每个其他的值都是一正一负地成对出现的,所以这些项都可以消去,只留下:

阅读 ‧ 电子书库

然后,两侧同乘以2得到:

阅读 ‧ 电子书库

从中可能汲取的一点启示是在进行复杂计算之前,先看一下数学上是否有更容易的方法来解决它。

程序本身有什么需要注意的呢?它说明您可以在一个表达式中使用多个逗号运算符,这里您初始化了time、x和count。在构建了循环条件之后,程序本身就很简短了。