第四章 逻辑运算和判断选择(二)

2023-12-13 06:24:37

在 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。

从上述针对&&和 || 这两个逻辑运算符的求值举例中可以看到 ,很多逻辑表达式只需要计算其中的一部分内容 ,就可以得到整个逻辑表达式的值 ,这种逻辑表达式的求值特性,也称为逻辑表达式的“短路求值”特性,只要最终的结果已经可以确定是真或假 ,求值过程便终止。?

文章来源:https://blog.csdn.net/weixin_30479905/article/details/134945763
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。