C 速查手冊

邏輯運算

C 語言的邏輯運算子 (operator) 包含邏輯非,施用於單一運算元,其他邏輯且、或都需要兩個運算元 (operand) ,如下列表

運算子功能範例
!!a
&&a && b
||a || b

以下例子示範邏輯運算子「非」的使用

#include <stdio.h>

int main(void)
{
    int valid = 0;
    
    if (!valid) {
        printf("valid = 0\n");
        valid = 1;
    }
    
    if (!valid) {
        printf("valid = 1\n");
        valid = 0;
    }
        
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://kaiching.org/
    檔名:logicnot.c
    功能:示範邏輯運算子「非」的使用
    作者:張凱慶 */

編譯後執行,結果如下

$ gcc logicnot.c
$ a.out
valid = 0
$

由於一開始變數 valid 就被設定為 0 ,因此第一個 if 陳述

if (!valid) {
    printf("valid = 0\n");
    valid = 1;
}

為真,所以底下的程式區塊就會執行,印出字串後就會將 valid 就被設定為 1 ,然後第二個 if 陳述

if (!valid) {
    printf("valid = 1\n");
    valid = 0;
}

為假,底下的程式區塊就不會被執行。

以下例子示範邏輯運算子「且」的使用

#include <stdio.h>

int main(void)
{
    int valid = 0;
    int a = 2;
    
    if (a > 1 && !valid) {
        printf("valid = 0\n");
        valid = 1;
    }
    
    if (a < 3 && !valid) {
        printf("valid = 1\n");
        valid = 0;
    }
        
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://kaiching.org/
    檔名:logicand.c
    功能:示範邏輯運算子「且」的使用
    作者:張凱慶 */

編譯後執行,結果如下

$ gcc logicand.c
$ a.out
valid = 0
$

由於一開始變數 valid 設定為 0a 設定為 2 ,所以第一個 if 陳述

if (a > 1 && !valid) {
    printf("valid = 0\n");
    valid = 1;
}

a 大於 1 且非 0 為真,所以底下的程式區塊會執行,變數 valid 會重新設定為 1 。到第二個 if 陳述

if (a < 3 && !valid) {
    printf("valid = 1\n");
    valid = 0;
}

a 小於 3 仍為真,但後頭非 1 為假,所以整個運算式為假,底下的程式區塊就不會被執行。

以下例子示範邏輯運算子「或」的使用

#include <stdio.h>

int main(void)
{
    int valid = 0;
    int a = 2;
    
    if (a > 1 || !valid) {
        printf("valid = 0\n");
        valid = 1;
    }
    
    if (a < 3 || !valid) {
        printf("valid = 1\n");
        valid = 0;
    }
        
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://kaiching.org/
    檔名:logicor.c
    功能:示範邏輯運算子「或」的使用
    作者:張凱慶 */

編譯後執行,結果如下

$ gcc logicor.c
$ a.out
valid = 0
valid = 1
$

一開始變數 valid 設定為 0a 設定為 2 ,所以第一個 if 陳述

if (a > 1 || !valid) {
    printf("valid = 0\n");
    valid = 1;
}

a 大於 1 為真,雖然後面還有條件,但由於是用或運算子連接,或運算式中測試到第一個為真的條件,就會停止繼續的條件測試,直接執行底下的程式區塊,所以同樣的第二個 if 陳述

if (a < 3 || !valid) {
    printf("valid = 1\n");
    valid = 0;
}

a 小於 3 為真,底下的字串就會直接被列印,程式不會繼續測試變數 valid 的值。

且及非運算子都具有這樣的特性,許多 C 程式都利用此特性增加程式的執行效率。

回 C 速查手冊首頁