中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C之邏輯運算符(十四)

發布時間:2020-06-25 18:16:55 來源:網絡 閱讀:634 作者:上帝之子521 欄目:編程語言

        我們在 C 語言中經常會遇到邏輯運算符。|| 是從左向右開始計算的,當遇到為真的條件時停止計算,整個表達式為真;所有條件為假時表達式才為假。 && 是從左向右開始計算,當遇到為假的條件時停止計算,整個表達式為假;所有條件為真時表達式才為真。

        我們先來看個經常會遇到的筆試題,以此代碼進行分析

#include <stdio.h>

int main()
{
    int i = 0;
    int j = 0;
    int k = 0;
    
    ++i || ++j && ++k;

    printf("i = %d\n", i);
    printf("j = %d\n", j);
    printf("k = %d\n", k);
    
    return 0;
}

        那么在第 9 行,我們經常會認為先執行 && 運算然后進行 || 運算。那么我們想著就是先執行 ++j && ++k,執行完之后 j 和 k 就分別為 1 了,那么整個表達式的值也就為真了。++i 就不執行了,當然 i 就為 0 了,下來我們來看看結果是否如此

C之邏輯運算符(十四)

        結果剛好跟我們分析的相反。那么我們忽略了一個問題,那就是程序中的短路。在邏輯表達式中, && 比 || 具有更高的優先級。在 && 和 || 混合運算時,整個表達式被看做 || 表達式,編譯器從左向右開始計算 && 表達式,當某個 && 表達式的值為真時,停止計算,整個表達式的值為真。那么我們的第9行可以這樣看:++i || ++j && ++k ==> ++i || (++j && ++k) ==> (true && ++i) || (++j && ++k)。那么這樣分析后,++i 就為 1 了,整個表達式的值就為真了。自然也就不會向后執行了,所以結果應該是1、0、0。

        我們再來看一哥示例代碼,比較有迷惑性,代碼如下

#include <stdio.h>

int g = 0;

int f()
{
    printf("In f()...\n");

    return g++;
}

int main()
{
    if( g || f() && f() )
    {
        printf("In if statement: %d\n", g);
    }
    
    printf("In main(): %d\n", g);
    
    return 0;
}

        我們來分析下這個代碼,第14行表達式便可以看成 (true && g) || (f() && f()),那么由于 g 為0,前面為假,繼續向后執行。這是便調用到 f() 了,便會打印出 In f()... 這條語句,它在內部返回的 g++,就是先返回 0 再進行++操作。由于 f() 已經返回 0 了,所以后面的 && 表達式為假,因而 main 函數中的 if 中的打印語句得不到執行。但是由于上面已經 g++ 了,所以這時 g 的值就為 1 啦。我們來看看編譯結果

C之邏輯運算符(十四)

        我們下來來看下這個運算符"!"。C語言中的邏輯非 "!" 只認得0,只知道見了0就返回1,其他就都為0。我們來看下示例代碼。

#include <stdio.h>

int main()
{
    printf("%d\n", !0);
    printf("%d\n", !1);
    printf("%d\n", !100);
    printf("%d\n", !-1000);
    
    return 0;
}

        由上面可知,第一個為1,其他全為0。編譯后結果如圖

C之邏輯運算符(十四)

        結果也確實如此。我們今天學習了邏輯運算符相關的知識,總結如下:1、程序中的邏輯表達式遵從短路規則;2、在 && 與 || 混合運算時:整個表達式被看做 || 表達式;從左向右先計算 && 表達式;最后計算 || 表達式;3、邏輯非 "!" 運算符只認得 0 碰見 0 返回 1,否則則返回1。只有 0 才代表假,其余所有值均代表真后面我們會繼續對 C 語言的學習。


         歡迎大家一起來學習 C 語言,可以加我QQ:243343083

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鸡西市| 礼泉县| 呼伦贝尔市| 定陶县| 邻水| 井陉县| 乐亭县| 台湾省| 仲巴县| 渑池县| 阜康市| 咸丰县| 甘德县| 赣榆县| 同德县| 读书| 平定县| 临武县| 茂名市| 会东县| 建水县| 黄大仙区| 温泉县| 富宁县| 白水县| 珠海市| 尉氏县| 靖宇县| 军事| 蓬溪县| 淮南市| 辽宁省| 蓝田县| 武鸣县| 涞水县| 曲水县| 呼伦贝尔市| 临夏县| 诸暨市| 县级市| 海盐县|