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