关系运算符只是测试左右两个值之间的关系(把它们相互比较),逻辑运算符(logical operator)则是把多个关系表达式组合起来,判断最终的结果是“真”还是“假”。因而,有时候逻辑运算符又称为复合关系运算符(compound relation operator)。C语言提供了 3 种逻辑运算符,如表 1 所示。
运算符 | 含义 | 说明 | 示例 |
---|---|---|---|
&& | 逻辑与 | 运算符两边的表达式都成立(真),返回 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 展示了一个复杂条件表达式的运算顺序。
图 2 分别展示了逻辑与、逻辑或、逻辑非的饼图及运算规则。
表 2 和表 3 分别展示了逻辑运算符混合运算的运算规则和示例。
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 |
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 |