逻辑运算符和逻辑表达式详解

引入

首先,我们思考一个问题:

if (fabs(data2) <= 1e - 7)

是否等同于下面这个语句:

if (-1e - 7 <= data2 <= 1e - 7)

众所周知,数学上的表达式a > b > c是“a大于b并且b大于c”的意思。但是,在C语言中,a > b > c这种表达式虽然没错,但在逻辑上面却并不能表达“a大于b并且b大于c”的意思。
在C语言中,用1表示表达式的值为真,用0表示表达式的值为假,并且关系运算符具有左结合性,因此,若假设a,b,c的值分别为3,2,1,那么a > b > c的计算过程则为:a > b > c <=> (a > b) > c = 1 > c = 0(假)。所以说,**在数学上正确的表达式在C语言的逻辑上不一定总是正确的。**因此,上面的两个语句并不等价。

逻辑运算符和逻辑表达式

1、逻辑运算符
C语言中的逻辑运算也称为布尔运算,C语言提供的逻辑运算符如下:

逻辑运算符类型含义优先级结合性
单目运算符逻辑非最高从右向左
&&双目运算符逻辑与较高从左向右
II双目运算符逻辑或较低从左向右

注意:
这三个逻辑运算符的优先级各不相同。其中,运算符!只需要一个操作数,所以叫单目运算符,也叫一元运算符,因为一元运算符的优先级比其他运算符高,所以表中!的优先级最高,其次是&&,再次是II。

2、逻辑表达式
用逻辑运算符连接操作数组成的表达式称为逻辑表达式。逻辑表达式的值,即逻辑运算的结果值同样只有真和假两个值,C语言规定用1表示为真,用0表示假。但是在需要判断一个数值表达式(不一定是逻辑表达式)真假的时候,**由于任意一个数值表达式的值不只局限于0和1两种情况,因此根据表达式的值为非0还是0来判断其真假。若果表达式的值为非0,则表示为真,如果表达式的值为0,则表示为假。只是大多时候用1和0表示真假。**逻辑运算规则如下:

A的取值B的取值!A(逻辑非)A && B(逻辑与)A II B(逻辑或)
非0非0011
非00001
0非0101
00100

运算法则:

1、逻辑与运算的特点是:仅当两个操作数都为真的时候,运算结果才为真;只要有一个为假,运算结果就为假。简记(一假则假,否则为真)
因此,当要表示两个条件必须同时成立,即“…,并且…”这样的条件时,可使用逻辑与运算符来连接这两个条件。
2、逻辑或运算的特点是:两个操作数中只有一个为真,运算结果为真;仅当两个操作数都为假,运算结果才为假。简记(一真则真,否则为假)
因此,当需要表达“或者…或者…”这样的条件时,可使用逻辑或运算符来连接这两个条件。
3、逻辑非运算的特点:若操作数的值为真,则其逻辑非运算的结果为假;反之,则为真。简记(若真则假,若假则真)
了解完这些逻辑运算符和表达式后,我们再来看上面说过的数学表达式a > b > c,那么用C语言就应该表示为:

(a > b) && (b > c)

同理,下面两条语句也是等价的:

if (fabs(data2) <= 1e - 7)
if (data2 >= -1e - 7 && data2 <= 1e - 7)

例子

下面再举个常见的例子
判断某一年year是否是闰年?
那么需要满足以下两个条件:
(1)能被4整除,但不能被100整除
(2)能被400整除
用代码实现即:

((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)/*带括号的写法*/
year % 4 == 0 && year % 100 != 0 || year % 400 == 0/*无括号写法*/

以上两种写法是等价的,但第二种需要明确各种运算符的优先级才能正确对其进行计算,而前者加上括号后计算的先后顺序一目了然,即使忘记了各种运算符的优先级,也能对其正确计算。
之所以如此,是因为在C语言中,圆括号也是一种运算符,而且它的优先级永远是最高的。因此,如果表达式中的运算符较多,则宜用圆括号来确定表达式的计算顺序,这样可以避免使用默认的优先级。

注意事项(短路特性)

运算符&&和||都具有“短路”特性。也就是说,若含有逻辑运算符(&&和||)的表达式的值可由先计算的做操作数的值单独推导出出来,那么将不再计算有操作数的值,这意味着表达式中的某些操作数可能不会被计算。
例如,在逻辑表达式a > 1 && b++ > 2中,仅当前面的表达式a > 1为真时,后面表达式b++ > 2中的b++才会被计算。反之,若改成b++ > 2 && a > 1,则b++ 就一定会被计算了。当然,更好的办法是单独对b进行自增计算。
因此,为了保证运算的正确性,提高程序的可读性,良好的程序设计风格不建议在程序使用多用途、复杂而晦涩难懂的复合表达式。

以上就为大家总结了C语言的逻辑运算符和逻辑表达式,最后的注意事项一定要记住噢,还得下去多练,多操作就会很快记住啦!如果大家在读完这篇博客后有所帮助,请给我点个赞关注一下吧!谢谢大家了。如果有什么问题,可以在下方评论,或者加我QQ:1423759736,我会及时回复的!

  • 10
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值