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

本文介绍了C语言中逻辑运算符(&&,||)的概念、使用方法、真值表,以及逻辑表达式的优先级和短路求值特性。通过实例阐述了如何在编程中运用这些逻辑判断进行不同条件下的程序控制。
摘要由CSDN通过智能技术生成

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值