C – 判斷式

        在 C 裡頭有很多地方都使用判斷式來決定這個 condition 或 loop 執行與否,舉些例子:

int i = 1;
if(i == 1)
    printf("HaHaHa\n");
//如果 i = 1 印出 'HaHaHa'
for(i = 0; i < 5; i++){
    printf("Ha");
}
//印出 5 次 Ha
printf("\n");

        我們可以把 if 函式看成:

if( 條件 ){ 敘述 }

        while 與 for 看成:

while( 條件 ){ 敘述 }
for( 初始值 ; 條件 ; 遞增減 ){ 敘述 }

        其中,那些 ” 條件 ” 項就是塞判斷式的地方。在C中,判斷式是以:

真 = 1
否 = 0

來表示的,如果把判斷式 printf 出來的話就會長這樣:

程式:

int i = 1;
printf("i = %d\n", i);
printf("條件真 -> %d\n", i==1);
printf("條件否 -> %d\n", i==0);

輸出:

i = 1
條件真 -> 1
條件否 -> 0

        但是,在 ” 條件 ” 中,只有 ‘0’ 會被視為 “否”:

程式:

int try[5]={0,1,-1,10,-10}, i;
for(i = 0; i < 5; i++){
    if(try[i])
        printf("%d is considered True\n", try[i]);
    else
        printf("%d is considered False\n", try[i]);
}

輸出:

0 is considered False
1 is considered True
-1 is considered True
10 is considered True
-10 is considered True

        如果我們有 2 個以上的條件要進行邏輯判斷,除了這樣做之外,

if(a == 1){
    if(b == 0){
        ......
    }
}

C 中還有 邏輯AND運算子 ‘&&’ 和 邏輯OR運算子 ‘||’,分別是鍵盤上的 [Shift + 7] 和 [Shift + \],可以把 2 個判斷式合並在一起,把他們當作 “且” 和 “或” 可能理解起來更為方便:

   '&&'          '且'
0 && 0 = 0    否且否 = 否
0 && 1 = 0    否且真 = 否
1 && 0 = 0    真且否 = 否
1 && 1 = 1    真且真 = 真

   '||'          '或'
0 || 0 = 0    否或否 = 否
0 || 1 = 1    否或真 = 真
1 || 0 = 1    真或否 = 真
1 || 1 = 1    真或真 = 真

// 2AC 以上就 Pass 了
if(AC == 5 || AC == 4 || AC == 3 || AC == 2){
    Pass = 1;
}
//當 5AC 或 4AC 或 3AC 或 2AC 時,Pass為真

        當我們有多於 2 個判斷式時,也能將它們合併起來。但是,在 C 中執行程式時,並不會去一一檢查所有的判斷式後,再得出結果,而是由左到右、能少判斷就少判斷:

int a = 0, b = 1;
if(a == 1 && b == 0) ...

a == 1 -> 0
0 && anything -> 0
so ... 
condition -> False

// b == 0 is not noticed

證明:

int True(int a){
    printf("a is %d\n", a);
    return 1;
}//從前從前在 main外 有個 function

...

int a = 0;
if(True(a) && a == 0 && a == 1 && True(a))
    printf("It is IMPOSSIBLE!\n");

//[True(a) -> 1] && a == 0 && a == 1 && True(a)
// do True(a)
//[1 && a == 0 -> 1] && a == 1 && True(a)
//[1 && a == 1 -> 0] && True(a)
//[0 && True(a)] -> False

//True(a) is only done once

輸出:

a is 0

結論

        知道了這麼多,這些到底有什麼用呢?當我們的資料越來越大,比較所佔用的時間也會越來越多,就能透過調整判斷式的順序,漸少判斷所佔用的時間。


        文中所有程式都有用我的電腦執行過(Ubuntu 18.04.1 內建的 gcc 編譯執行),另外,大家可能都有這個疑問:’&’ 跟 ‘|’ 又代表著什麼呢?他們跟 C 的另外一個功能:位元運算有關喔!有機會也會對此在寫一篇文的~

還有一點要注意,&& 的運算子優先順序比 || 高喔!所以

a == b || b == c && a == c
equals
a == b || (b == c && a == c)

        有空會再寫一篇關於運算子優先序的文 … 大概吧。