6.7 逗号运算符

逗号运算符扩展了for循环的灵活性,因为它使您可以在一个for循环中使用多个初始化或更新表达式。例如,程序清单6.13中的程序打印一类邮资费率(在写作本书时,该费用为第1个盎司37美分,然后每增加1盎司费用增加23美分。您可以查看www.usps.gov来了解当前的费用)。

程序清单6.13 postage.c程序

阅读 ‧ 电子书库

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

输出的前4行看上去是这个样子:

ounces cost

1 $0.37
2 $0.60
3 $0.83
4 $1.06

这个程序在初始化表达式和更新表达式中使用了逗号运算符。第一个表达式中的逗号使ounces和cost的值都进行了初始化。逗号的第二次出现使每次循环中ounces增加1,cost增加23(NEXT_OZ的值)。所有的计算都在for循环语句中执行(请参见图6.4)。

阅读 ‧ 电子书库

图6.4 逗号运算符和for循环

逗号运算符并不只限于在for循环中使用,但是这是最常使用它的地方。该运算符还具有两个属性。首先,它保证被它分开的表达式按从左到右的次序进行计算(换句话说,逗号是个顺序点,逗号左边产生的所有副作用都在程序运行到逗号右边之前生效)。因此,ounces在cost之前初始化。在这个例子中顺序是不重要的,但是如果计算cost的表达式中包含了ounces,它就是重要的了。例如,假定您具有如下的表达式:

ounces++, cost = ounces * FIRST_OZ

这将递增ounces,并在第二个子表达式中使用ounces的新值。作为顺序点的逗号保证左边子表达式的副作用在计算右边的子表达式之前生效。

其次,整个逗号表达式的值是右边成员的值。语句:

x =(y = 3,(z = ++y + 2) + 5);

的效果是首先把y赋值为3,把y递增为4,然后把4加上2,把结果6赋值给z,接下来把z加5,最后把x赋为结果值11。这里不讨论为什么有人会这样做。另一方面,假定您不小心在写一个数字时使用了逗号:

houseprice = 249, 500;

这并没有语法错误。C把它解释为一个逗号表达式,houseprice = 249是左子表达式,而500是右子表达式。因此整个逗号表达式的值就是右边表达式的值,并且左边的子语句把变量houseprice赋值为249。这样它的效果与下面的代码相同:

houseprice = 249;

500;

记住任何具有分号的表达式都可以成为一个语句,所以500;是一个什么都不做的语句。

另一方面,语句:

houseprice = (249, 500);

把houseprice赋值为500,因为该值是右子表达式的值。

逗号也被用做分隔符,在下面两条语句中:

char ch, date;

printf(“%d %d\n”, chimps, chumps);

逗号都是分隔符,而不是逗号运算符。