C 語(yǔ)言中的邏輯運(yùn)算符
在之前的 C 語(yǔ)言標(biāo)準(zhǔn)中,邏輯運(yùn)算符是表示兩個(gè)數(shù)值之間邏輯關(guān)系的運(yùn)算符。通常用 0 和 1 來(lái)表示假值和真值。但是在 C 語(yǔ)言中會(huì)認(rèn)為非 0 的數(shù)值在邏輯運(yùn)算中都為 1 。邏輯運(yùn)算的返回值也是整數(shù)型,不是 0 就是 1 ,這點(diǎn)和其他很多編程語(yǔ)言是不同的。
但是,在 C99 標(biāo)準(zhǔn)中引入了布爾類型。所以 C 語(yǔ)言中的邏輯運(yùn)算就簡(jiǎn)單了很多。要想使用布爾類型,需要引入 stdbool.h 這個(gè)庫(kù)即可。但是遺憾的是,到目前為止還沒(méi)有可以直接輸出布爾值的打印語(yǔ)句。所以即使定義了布爾類型,在輸出的時(shí)候還是只能直接輸出整數(shù)值。當(dāng)然可以通過(guò)后面介紹的三目運(yùn)算符來(lái)很輕松的解決這個(gè)問(wèn)題。我們留到后面介紹。
A | B | A && B(A與B) | A || B(A或B) | !A(非A) | !B(非B) |
---|---|---|---|---|---|
1 | 0 | 0 | 1 | 0 | 1 |
0 | 1 | 0 | 1 | 1 | 0 |
0 | 0 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 | 0 |
1. 案例演示
Tips:示例程序在 GCC 7.5.0 下測(cè)試通過(guò),請(qǐng)大家使用支持 C99 標(biāo)準(zhǔn)的編譯器。
# include <stdio.h>
# include <stdbool.h>
int main()
{
bool x,y,z;
x=false;
y=true;
printf("x = %d; y = %d\n",x,y);
z=x||y;
printf("x || y = %d\n",z);
z=x&&y;
printf("x && y = %d\n",z);
printf("!x = %d\n",!x);
printf("!y = %d\n",!y);
return 0;
}
運(yùn)行結(jié)果
x = 0; y = 1
x || y = 1
x && y = 0
!x = 1
!y = 0
從實(shí)際的程序可以看到,和我們上一節(jié)中介紹的表格中的運(yùn)算結(jié)果是一致的。
如果不使用布爾類型,直接使用整數(shù)會(huì)怎樣?下面我就通過(guò)實(shí)際的程序來(lái)看一下結(jié)果。
# include <stdio.h>
int main()
{
int x,y,z;
x=0;
y=10;
printf("x = %d; y = %d\n",x,y);
z=x||y;
printf("x || y = %d\n",z);
z=x&&y;
printf("x && y = %d\n",z);
printf("!x = %d\n",!x);
printf("!y = %d\n",!y);
return 0;
}
運(yùn)行結(jié)果
x = 0; y = 10
x || y = 1
x && y = 0
!x = 1
!y = 0
雖然由布爾類型變?yōu)榱苏麛?shù)類型,但是最后的結(jié)果是一致的。這也就是 C 語(yǔ)言在出現(xiàn)布爾類型之前經(jīng)常用到的形式。
2. 小結(jié)
C 語(yǔ)言在前期是沒(méi)有布爾類型的,但是采用了整數(shù)類型來(lái)直接替代布爾類型使用。一般情況下,非零的值都被認(rèn)為是真值,而零值則被認(rèn)為是假值。這點(diǎn)上與其他的編程語(yǔ)言,如 C#, JAVA 等是不同的。因?yàn)檫@些語(yǔ)言是內(nèi)置有布爾類型的。
但是這點(diǎn)在 C99 標(biāo)準(zhǔn)之后有了一個(gè)進(jìn)步,就是提供了 stdbool 這個(gè)程序庫(kù),可以提供布爾類型。但是稍顯遺憾的是,還是沒(méi)有辦法直接輸出布爾類型,只能輸出整數(shù)類型。