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)(全部一元符) 從右到左
* / % 從左到右
+ - 從左到右
< > <= >= 從左到右
== != 從左到右
= 從右到左
相關文章
相關標籤/搜索