目录
引入
首先,我们思考一个问题:
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 | 非0 | 0 | 1 | 1 |
非0 | 0 | 0 | 0 | 1 |
0 | 非0 | 1 | 0 | 1 |
0 | 0 | 1 | 0 | 0 |
运算法则:
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,我会及时回复的!