第四章 逻辑运算和判断选择(二)
在 C 语言编程中,总少不了一些逻辑运算和条件判断,比如当心情好时吃火锅,而心情不好的时候 ,吃巧克力,换句话说,在不同的条件下会触发程序的不同执行动作。这章就是学会如何利用关系、逻辑、条件运算符以及各种相关的逻辑判断语句实现这些需求。
一、关系运算符、关系表达式与逻辑运算符 、逻辑表达式
2、逻辑运算符和逻辑表达式
1)基本概念
用逻辑运算符将关系表达式连接起来,就构成了逻辑表达式。
例:如果希望 a>3并且b>4,这里的"并且”就是逻辑运算符 ,那么,整个(a>3 并且 b>4)就是一个逻辑表达式。
逻辑表达式的值,也是"真"或者"假",也就是1或者0。
C语言提供了三种逻辑运算符。
逻辑运算符 | 含义 | 说明 | 用法 |
&& | 逻辑与(相当于其他语言中的 and) | 双目运算符 | 两个运算分量,如(a>b) && (c>d) |
|| | 逻辑或(相当于其他语言中的 or) | 双目运算符 | 两个运算分量,如(a>b) || (c>d) |
! | 逻辑非(相当于其他语言中的 not) | 单目运算符 | 一个运算分量,如!(a>b) |
说明:
(1)a&&b:若a和b为真,则a&&b才为真,否则为假。
(2)a||b:若a和b有一个为真,贝a||b为真,否则为假。
(3)!a:若a为真,则!a为假,若a为假,则!a为真。
将上述三条规则整理成一个表格 ,称为逻辑运算真值表,如下:
a | b | !a | !b | a&&b | a||b |
真 | 真 | 假 | 假 | 真 | 真 |
真 | 假 | 假 | 真 | 假 | 真 |
假 | 真 | 真 | 假 | 假 | 真 |
假 | 假 | 真 | 真 | 假 | 假 |
规律:
(1)&&运算符,全真出真,有假出假,两个运算分量必须全为真 ,结果才为真 ,否则结果为假。
(2)|| 运算符,有真出真,全假出假,两个运算分量只要有真,结果就为真,只有两个运算分量全部为假 ,结果才为假。
(3)! 运算符,只需要一个运算分量,这个逻辑运算符用于取反操作,原来是真 ,使用了 ! 后就变成假,原来是假,使用了 ! 后就变成真。
注意:
(1)不要把 && 写成 &,也不要把 || 写成 |,否则,得到的逻辑运算结果是不对的。因为一个&、|都是位运算符。
(2)进行逻辑判断的时候 ,不等于 0 的数值全部被认为是 true。总结来说,由系统给出的逻辑运算结果,不是0(假)就是1(真)。在逻辑表达式中作为参加逻辑运算的对象 ,是 0 就表示假 ,非 0 就表示真。
例:
上面这行代码得到结果是0,也就是假,4可以被认为是真,但是它却不等于 true,true实际等于1。
例:
上面这行得到结果是1(真),上面说过,非0应该是真,所以这里4 和 5 都表示真。两个真会是做"&&"运算,结果为真,也就是1。
2)逻辑运算符优先级问题
在一个逻辑表达式中,如果包含了多个逻辑运算符,比如:
!a && b || x > y && c? (不建议这么写,太混乱了)
逻辑 、算术 、关系 、赋值运算符优先级 | ||
优选级(数字越小越高) | 运算符 | 优先级小标识 |
1 | !逻辑非运算符 | 从高 . . . 到低 |
2 | 算术运算符 | |
3 | 关系运算符 | |
4 | &&、|| | |
5 | 赋值运算符 |
上表中,可以看到逻辑运算符中的"&&"和"||"优先级低于关系运算符,而逻辑运算符中的 ! 优先级高于算术运算符。
!a && b || x > y && c? 等价于 (((!a)&&b) || (x>y))&&c
a>b&&x>y? ? 等价于(a>b)&&(x>y)
a==b||x==y? 等价于(a==b)||(x==y)
!a||a>b? 等价于(!a)||(a>b)
实际上逻辑运算符两侧的对象可以是任何类型数据,比如字符型、实型甚至指针类型(后面会细讲)等。
例:
'c' && 'd'? ? //比较的是字符的 ASCII 码,它们的 ASCll 码都不为 0,所以结果为真
上面这种写法并不常见,逻辑运算符最常用的地方还是进行各种关系比较运算。比如:a>b&&x>y
例:在角色扮演类网络游戏中,玩家的的血大于0(玩家还活着)并且魔法大于0,那么玩家才可以使用魔法攻击敌人。
在逻辑判断的时候 ,非0值都看作真,0值都看作假。逻辑运算扩展真值表如下:
a | b | !a | !b | a&&b | a||b |
非0 | 非0 | 0 | 0 | 1 | 1 |
非0 | 0 | 0 | 1 | 0 | 1 |
0 | 非0 | 1 | 0 | 0 | 1 |
0 | 0 | 1 | 1 | 0 | 0 |
3)逻辑运算符求值问题
在逻辑表达式求解中,不是所有逻辑运算符都会被执行,只有在必须执行下一个逻辑运算才能求出整个表达式的结果时,才执行该运算 ,这块的内容中包含面试陷阱,请注意。
(1)a && b && c
这个逻辑表达式中,根据 && 全真出真,有假出假的规则,得到一个结论:只有 a 为真(非 0)才需要判断 b,只有 a 和 b 都为真才需要判断 c,只要 a 为假,就不必判断 b,如果 a 为真 b 为假,就不需要判断 c。
例:
3<5 为真,所以会继续执行&&后面的内容,也就是 5>4,所以if语句中的a=8会被执行。
把 3<5 修改为 3> 5 ,结果为假,因为3>5肯定为假,后面的5>4不会被执行,所以a=1。
(2)a || b || c
这个逻辑表达式中 ,根据 || 有真出真,全假出假的规则,得到一个结论 : 只要 a 为真,就不必判断 b 和 c,只有 a 为假时 ,才需要判断 b,只有 a 和 b 都为假,才需要判断 c。
5>3为真,后面的4<5不会被执行,所以结果为a=8。
改成5<3,因为5<3为假,所以||后面的4>5会继续执行,最终结果都为假,所以a=8不会执行,结果为a=1。
从上述针对&&和 || 这两个逻辑运算符的求值举例中可以看到 ,很多逻辑表达式只需要计算其中的一部分内容 ,就可以得到整个逻辑表达式的值 ,这种逻辑表达式的求值特性,也称为逻辑表达式的“短路求值”特性,只要最终的结果已经可以确定是真或假 ,求值过程便终止。?
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!