C Primer Plus 第6章 C控制语句:循环 6.3 关系运算符和表达式

关系运算符函数

运算符 含义
< 小于
<= 小于等于
== 等于
>= 大于等于
> 大于
!= 不等于

注意:关系表达式也能够用于字符的比较。例:ch!='$';进行比较时使用的是机器的字符代码(咱们假定为ASCII)。然而不能使用关系运算符来比较字符串。ui

关系运算符也能够用来比较浮点数。但要当心,在浮点数比较中只能使用>和<。缘由在于传入偏差可能致使两个逻辑上相等的数不相等。例如,3和1/3的乘积应该是1.0.可是若是您使用6位小数来表示1/3,乘积就是.999999而不是1.使用在math.h头文件中声明的fabs()函数能够方便的进行浮点数判断。这个函数返回一个浮点数的绝对值(即没有代数符号的值)。spa

例如,您可使用相似程序清单6.5的方法来判断一个数是否接近一个想要的结果。code

//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!");
        scanf("%lf",&response);
    }
    printf("Close enough!\n");
    return 0;
}

在用户的答案与正确的答案的偏差小于0.0001以前,这个循环反复地请求输入答案。ci

6.3.1 什么是真字符串

对于C来讲,一个真表达式的值为1,而一个假表达式的值为0.input

6.3.2 还有什么是真编译器

更通常地,全部的非零值都被认为是真,只有0被认为是假。C对真的范围放的很是宽。it

能够说,只要while循环的判断条件的值非零,它就能够执行循环。这使得判断条件是创建在数值的基础上而不是真假的基础上。要谨记若是关系表达式为真,它的值就为1;若是为假,它的值就为0.io

6.3.3 真值的问题

要确保使用正确的运算符。编译器容许您使用错误的形式,产生您不但愿的结果。

若是比较的双方中有一个是常量,则能够把它放在比较表达式的左边,这样有助于发现错误。

5==canoes;

关键之处在于,为常量赋值是非法的。因此编译器把赋值运算符的这种用法识别为语法错误(5=canoes).

总之,关系运算符被用来构成关系表达式。关系表达式在为真时,值为1,为假时值为0.一般使用关系表达式做为判断条件的语句(例如while和if)可使用任何表达式做为判断,非零值被认为是真,而零值被认为是假。

6.3.4 新的_Bool类型

在C中,表示真/假的变量一直是由int类型来表示的。C99专门为这种类型的变量添加了_Bool类型。

一个_Bool变量只能够具备值1或0。若是您把一个_Bool变量赋为一个非零值,变量就被设置为1.这说明,C把任何非零值都认为是真。

程序清单6.9 boolean.c程序

//boolean.c --使用_Bool变量
#include <stdio.h>
int main(void)
{
    long num;
    long sum=0L;
    _Bool input_is_good;
    printf("Please enter an integer to be summed.(q to quit):");

    input_is_good = (scanf("%ld",&num)==1);
    while(input_is_good)
    {
        sum = sum + num;
        printf("Please enter next integer(q to quit ):");
        input_is_good = (scanf("%lf",&num)==1);
    }
    printf("Those integer sum to %ld.\n",sum);
    return 0;
}

注意代码是如何把比较结果赋值给变量的:

 input_is_good = (scanf("%ld",&num)==1);

这是有意义的,由于==运算符的返回值为1或0.顺便说一句,把==表达式括起来的()不是必需的,由于==运算符的优先级高于=,可是它们可使代码更容易阅读。

C99还提供了一个stdbool.h的头文件。包含这个头文件可使用bool来代替_Bool,并把true和false定义成值为1和0的符号常量。

6.3.5 关系运算符的优先级

关系运算符的优先级要低于包括+和-在内的算术运算符,可是要高于赋值运算符。

运算符的优先级

运算符(优先级从高到低) 结合性
() 从左到右
- + ++ -- sizeof(type)(全部一元符) 从右到左
* / % 从左到右
+ - 从左到右
< > <= >= 从左到右
== != 从左到右
= 从右到左
相关文章
相关标签/搜索