C语言逻辑运算符及其用法

关系运算符只是测试左右两个值之间的关系(把它们相互比较),逻辑运算符(logical operator)则是把多个关系表达式组合起来,判断最终的结果是“真”还是“假”。因而,有时候逻辑运算符又称为复合关系运算符(compound relation operator)。C语言提供了 3 种逻辑运算符,如表 1 所示。

表 1:C语言的逻辑运算符说明
运算符 含义 说明 示例
&& 逻辑与 运算符两边的表达式都成立(真),返回 1;只要有一个不成立(假),返回 0 (2==3)&&(3==3) 的值为 0
(2<3)&&(3==3) 的值为 1
|| 逻辑或 运算符两边的表达式只要有一个成立,返回 1;只有两边的表达式都不成立时,返回 0 (2==3)||(3==3) 的值为 1
(2<1)||(2==3) 的值为 0
逻辑非 运算符后边的表达式成立(真),返回 0,否则返回 1 !(2==3) 的值为 1
!(2<3) 的值为 0

对于逻辑运算符优先级的问题,逻辑非!的优先级最高,不仅优先于关系运算符,甚至优先于算术运算符,其次是逻辑与&&,逻辑或||优先级最低,而逻辑与&&和逻辑或||的优先级低于关系运算符。当一个判断条件表达式中同时出现关系运算符、逻辑运算符、算术运算符时,其运算优先关系如下:
( ) 函数、! *、/、%  +、-  <、>、!=、<=、>=  &&、||

图 1 展示了一个复杂条件表达式的运算顺序。

复杂条件表达式的运算顺序
图 1:复杂条件表达式的运算顺序

图 2 分别展示了逻辑与、逻辑或、逻辑非的饼图及运算规则。

逻辑与、逻辑或、逻辑非的饼图及运算规则
逻辑与、逻辑或、逻辑非的饼图及运算规则
图 2:逻辑与、逻辑或、逻辑非的饼图及运算规则

表 2 和表 3 分别展示了逻辑运算符混合运算的运算规则和示例。

表 2:逻辑运算符混合运算的运算规则
p q !q p&&!q p||!q !(p&&q) !(p||q)
0 0 1 0 1 1 1
0 1 0 0 0 1 0
1 0 1 1 1 1 0
1 1 0 0 1 0 0

表 3:逻辑运算符混合运算的示例
p q m p&&q p||q p&&q||m
5+2>10 0 0 0 0 0
5+2==10 1 0 0 1 0
5*2==10 0 1 0 1 1
5+2<10 1 1 1 1 1