C语言非常道
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.8 认识表达式语句

上面我们已经了解到逗号运算符的结果是其右操作数的值,那么,我们可以利用这个特点来将我们的while语句改写为更奇特的形式:

              unsigned long long int cusum(unsigned long long int r)
              {
                  unsigned long long int n = 1, sum = 0;

                  while(sum += n ++, n <= r);

                  return sum;
              }

在这里,while语句的控制表达式是一个逗号表达式,逗号运算符的左操作数是表达式sum += n ++,用来累加并更新变量sum的存储值,它是有副作用的表达式,将更新变量sum和n的存储值;控制表达式的值是逗号运算符的右操作数n<= r的值。

while语句是反复执行的,在每次执行前,都要对控制表达式求值以决定是否继续循环执行,而我们正是利用了这一点。当然,这里面也有序列点的功劳,因为在两个子表达式的求值之间有一个序列点,所以在求值子表达式n<= r的时候,可以保证变量n的存储值已经被前一个表达式sum += n ++求值时的副作用更新过。

很奇怪地,while语句的循环体仅仅是一个分号“;”,这是什么意思呢?这在C语言里称为空语句。空语句不执行任何操作,但有时候还需要它。就像上面的示例一样,如果没有什么需要执行的操作,但是在语法上还不能省掉这条语句,就需要它了。

本质上,空语句是特殊的表达式语句。这是因为——好吧,还是先来看表达式语句的语法组成:

            表达式可选

显然,表达式语句由表达式及一个分号“;”组成,但表达式是可选的,如果省略了表达式,则只剩下一个分号,这就成了空语句。

练习3.8

在本节中,while语句的控制表达式是逗号表达式。第一次执行控制表达式后,变量n和sum的值分别为( )和( );最后一次执行控制表达式后,变量n和sum的值分别为( )和( )。