10-用关系运算符和表达式比较大小
6.3 用关系运算符和表达式比较大小
while 循环经常依赖测试表达式作比较,这样的表达式被称为关系表达式(relational expression),出现在关系表达式中间的运算符叫作关系运算符(relational operator)。前面的示例中已经用过一些关系运算符,表6.1列出了C语言的所有关系运算符。该表也涵盖了所有的数值关系(数字之间的关系再复杂也没有人与人之间的关系复杂)。
| 运算符 | 含义 |
| :----- | :----- | :----- | :----- |
| < | 小于 |
| <= | 小于或等于 |
| == | 等于 |
| >= | 大于或等于 |
| > | 大于 |
| != | 不等于 |
关系运算符常用于构造 while 语句和其他C语句(稍后讨论)中用到的关系表达式。这些语句都会检查关系表达式为真还是为假。下面有3个互不相关的 while 语句,其中都包含关系表达式。
while (number < 6)
{
printf("Your number is too small.\n");
scanf("%d", &number);
}
while (ch != '$')
{
count++;
scanf("%c", &ch);
}
while (scanf("%f", &num) == 1)
sum = sum + num;
注意,第2个 while 语句的关系表达式还可用于比较字符。比较时使用的是机器字符码(假定为ASCII)。但是,不能用关系运算符比较字符串。第11章将介绍如何比较字符串。
虽然关系运算符也可用来比较浮点数,但是要注意:比较浮点数时,尽量只使用<和>。因为浮点数的舍入误差会导致在逻辑上应该相等的两数却不相等。例如,3乘以1/3的积是1.0。如果用把1/3表示成小数点后面6位数字,乘积则是.999999,不等于1。使用 fabs() 函数(声明在 math.h 头文件中)可以方便地比较浮点数,该函数返回一个浮点值的绝对值(即,没有代数符号的值)。例如,可以用类似程序清单6.5的方法来判断一个数是否接近预期结果。
程序清单6.5 cmpflt.c 程序
// cmpflt.c -- 浮点数比较
#include <math.h>
#include <stdio.h>
int main(void)
{
const double ANSWER = 3.14159;
double response;
printf("What is the value of pi?\n");
scanf("%lf", &response);
while (fabs(response - ANSWER) > 0.0001)
{
printf("Try again!\n");
scanf("%lf", &response);
}
printf("Close enough!\n");
return 0;
}
循环会一直提示用户继续输入,除非用户输入的值与正确值之间相差不大于0.0001:
What is the value of pi?
3.14
Try again!
3.1416
Close enough!