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

3.5 认识关系运算符

从本书一开始到现在,我们在while语句的控制表达式里用的都是运算符“<=”。实际上,该运算符是关系运算符,C语言里的关系运算符包括“>”“>=”“<”和“<=”,分别表示“大于”“大于等于”“小于”和“小于等于”,而“<=”只是其中的一个。

所有关系运算都是非常相似且极易理解的,因此也就不需要多费口舌加以解释。对于以上关系运算符,当对应的关系成立时,关系运算符(关系表达式)的结果为1;否则关系运算符(关系表达式)的结果为0。如果使用大于等于运算符“>=”,则上述while语句可以是这样的:

              while(r >= n)sum += n ++;

实际上,这只是一个障眼法,原来的控制表达式为n<= r,现在是将n和r调换了一下位置,而运算符自然也要由原来的“<=”改为“>=”。

练习3.4

1.若变量n和sum的初值都为0,请修改函数cusum的while语句但不改变它的功能,要求:不得使用复合语句;只能使用关系运算符>和复合赋值运算符+=。提示:复合赋值运算符+=是从右向左结合的。

2.若变量n和sum的初值都为0,请修改函数cusum的while语句但不改变它的功能,要求:不得使用复合语句;只能使用关系运算符<、复合赋值运算符+=和前缀递增运算符。提示:前缀递增运算符的优先级高于复合赋值运算符。

3.在不改变程序功能的前提下,我们将cusum函数做了如下修改:

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

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

                  return sum;
               }

但是,源文件在翻译的过程中出错,请解释出错的原因并改正这个错误。

4.所有关系运算符的优先级都相同,而且都是从左往右结合的;加性运算符+也是从左往右结合的,而且它的优先级高于关系运算符。给定以下函数f:

              int f(int a, int b, int c, int d, int e, int f)
              {
                  return a + b + c > d > e <= f;
              }

如果调用它的表达式为f(1, 2, 3, 7, 8, 9),则:

(a)表达式c>d>e<= f的意思是变量c的值大于变量d的值;变量d的值大于变量e的值;变量e的值大于等于变量f的值,对吗?为什么?

(b)为表达式a + b + c>d>e<= f添加适当的括号,以体现各运算符的操作数都是谁。

(c)函数f的返回值是多少?请添加一个main函数,使之成为一个完整的C源文件,上机验证这个结果。