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源文件,上机验证这个结果。