C 語言提供了以下三種邏輯運算子。
-
一元:!(邏輯非)。
-
二元:&&(邏輯與)、||(邏輯或)。
以上三種邏輯運算子中,邏輯非 ! 的優先順序最高,邏輯與 && 次之,邏輯或 || 優先順序最低。即算術、邏輯、賦值運算子的優先順序順序為:
邏輯非 ! >算術 > 邏輯與 &&、邏輯或 || > 賦值=
邏輯表示式的值為邏輯值,即布林型(bool),該型別為 C99 新增的,一些編譯器可能還不支援該型別。
邏輯值分為邏輯真值和邏輯假值。一般情況下,在判斷時,僅有零值被判斷為邏輯假值(false),一切非零值均可被判斷為邏輯真值(true);在儲存和表示時,
通常,使用 1 表示邏輯真值,0表示邏輯假值。
邏輯與 && 運算子的運算規則:只有兩個運算元均為邏輯真時,結果才為真。其餘情況,結果均為假。
邏輯或 || 運算子的運算規則:只有兩個運算元均為邏輯假時,結果才為假。其餘情況,結果均為真。
例如,設有定義語句
int a=3,b=5;
則有:
-
!a:由於 a 非零,為真,!a 為假,其值為 0。
-
a||b:由於 a 和 b 均非零,均為真,故邏輯或的結果為真,其值為 1。
-
a&&b:由於 a 和 b 均非零,均為真,故邏輯與的結果為真,其值為 1。
-
!a||b&&2:由於邏輯非 ! 優先順序最高,首先與 a 結合,而 && 優先順序高於 ||,相當於(!a)||(b&&2), 即 0||1 為真,其值為 1。
邏輯與 &&、邏輯或 || 均有“短路”特性:
-
邏輯與&&“短路”:當邏輯與&&的左運算元為邏輯假時,就足以判斷該邏輯運算的結果為假了,故右運算元就不再被執行。
-
邏輯或||“短路”:當邏輯或||的左運算元為邏輯真時,就足以判斷該邏輯運算的結果為真了,故右運算元就不再被執行。
例如:
int a=1,b=2,c;
c=a||++b;
printf("a=%d,b=%d,c=%dn",a,b,c);
由於 a 為非零值,即為真,而當邏輯或 || 的左運算元為真時,就足以判斷該邏輯操作的結果為真。故發生“短路”,即右運算元 ++b 不被執行。輸出結果為:a=1,b=2,c=1。
分析以下程式,輸出其執行結果。
#include<stdio.h>
int main(void)
{
int a=0,b=2,c;
c=!a||++b&&a--;
printf("a=%d,b=%d,c=%dn",a,b,c);
return 0;
}
程式碼分析:
混合表示式 c=!a||++b&&a-- 中含有的運算子有邏輯非 !、邏輯或 ||、邏輯與 &&、算術字首 ++、算術字尾 --、賦值號 = 等6個運算子。邏輯運算子、算術運算子、賦值運算子的優先順序的關係為:
邏輯非! > 算術 > 邏輯與&&、邏輯或 || > 賦值 =
由於該表示式中賦值運算子優先順序最低,故最後賦值。
根據優先順序的高低,表示式 !a||++b&&a-- 等價於 (!a)||((++b)&&(a--)),而邏輯或 || 的左運算元 !a 為真,此時足以判斷該表示式的值為真。故發生“短路”,即 || 的整個右運算元 ((++b)&&(a--)) 不再被執行。
執行結果為:
a=0,b=2,c=1