C 語言快速導覽 - 邏輯運算

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

運算子功能範例
!!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://pydoing.blogspot.com/
    檔名:logicnot.c
    功能:示範邏輯運算子「非」的使用
    作者:張凱慶
    時間:西元2010年4月 */


編譯後執行,結果如下



由於一開始變數 valid 就被設定為 0 ,因此第 7 行
if (!valid) {


為真,所以第七行底下的程式區塊就會執行,印出字串後就會將 valid 就被設定為 1 ,所以第 12 行
if (!valid) {


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


以下例子示範邏輯運算子「且」的使用
#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://pydoing.blogspot.com/
    檔名:logicand.c
    功能:示範邏輯運算子「且」的使用
    作者:張凱慶
    時間:西元2010年4月 */


編譯後執行,結果如下



由於一開始變數 valid 設定為 0 , a 設定為 2 ,所以第 8 行
if (a > 1 && !valid) {


a 大於 1 且非 0 為真,所以底下的程式區塊會執行,變數 valid 會重新設定為 1 。到第 13 行
if (a < 3 && !valid) {


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://pydoing.blogspot.com/
    檔名:logicor.c
    功能:示範邏輯運算子「或」的使用
    作者:張凱慶
    時間:西元2010年4月 */


編譯後執行,結果如下



一開始變數 valid 設定為 0 , a 設定為 2 ,所以第 8 行
if (a > 1 || !valid) {


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


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


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




2 則留言:

匿名 提到...

請問!
以下例子示範邏輯運算子「非」的使用
#include

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://pydoing.blogspot.com/
檔名:logicnot.c
功能:示範邏輯運算子「非」的使用
作者:張凱慶
時間:西元2010年4月 */

這部份程試碼是不是錯了

列印出來的應該是
valid = 1
這樣的結果吧!
還是我誤會了!感謝您

Kaiching Chang 提到...

任何完整範例都可編譯執行,對錯請以編譯執行的結果為準 xd

此例的 valid 初值設為 0
亦即是邏輯上的「假」
因此 !valid 的運算結果會為「真」
於是先印出
valid = 0
然後將 valid 設為 1
導致再下來 !valid 的運算結果為「假」
既然是「假」,下面大括弧的區塊就不會被執行囉