【C】 15_邏輯運算子分析

TianSong發表於2019-05-10
  • ++i || ++j && ++k; 會輸出什麼呢?

例項分析: 初探邏輯運算子

#include <stdio.h>

int main()
{
    int i = 0;
    int j = 0;
    int k = 0;
    
    ++i || ++j && ++k;
    
    printf("i = %d
", i);
    printf("j = %d
", j);
    printf("k = %d
", k);
}
輸出:
i = 1
j = 0
k = 0

邏輯運算子分析

  • 程式中的短路

    • || 從左向右開始計算 :

      • 當遇到為真的條件時停止計算,整個表示式為真
      • 所有條件為假時表示式才為假
    • && 從左向右開始計算

      • 當遇到為假的條件時停止計算,整個表示式為假
      • 所有條件為真時表示式為真
  • 邏輯表示式中, && 比 || 具有更高的優先順序
    ++ i || ++j && ++k;            ==> 
    
    (++i) || (++j && ++k);         ==>
    
    (true && ++i) || (++j && ++k);

在 && 和 || 混合運算時,整個表示式被看作 || 表示式,編譯器從左向右開始計算 && 表示式,當某個 && 表示式的值為真時,停止計算,整個表示式的值為真。

例項分析: 程式中的短路規則

#include <stdio.h>

int g = 0;

int f()
{
    printf("In f()...
");
    
    return g++;
}

int main()
{
    if( g || f() && f() )
    {
        printf("In if statement: %d
", g);
    }
    
    printf("In main(): %d
", g);
    
    return 0;
}
輸出:
In f()...
In main(): 1

分析:
g || f() && f()  ==> (true && g) || (f() && f()) ==> 0 || (f() && f()) ==> 0 || 0 ==> 0
  • “!” 是什麼?
#include <stdio.h>

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

    return 0;
}
輸出:
1
0
0
0

C 語言中邏輯非 “!” 只認得 0,只知道見了 0 就返回 1。因此當碰見的值不是 0 時,其結果0。

  • 真 : ! 0
  • 假 : 0

小結

  • 程式中的邏輯表示式遵從短路規則
  • 在 && 與 || 混合運算時:

    • 整個表示式被看作 || 表示式
    • 從左向右先計算 && 表示式
    • 最後計算 || 表示式
  • 邏輯非 ! 運算子只認得 0

    • 碰見 0 返回 1 ,否則統統返回 0

以上內容參考狄泰軟體學院系列課程,請大家保護原創!

相關文章