大话C语言:第12篇 运算符之逻辑运算符

        逻辑运算符是用于在布尔逻辑运算中处理二进制位(通常是0和1)的运算符。在计算机编程中,它们用于评估表达式的结果是否满足某些条件。

        典型应用场景,例如,去京东买手机。 筛选条件: 128G并且120w 快充 ,京东的搜索框后台程序该怎么做? 用运算判断,满足展示,不满足不展示。如果用户就想买华为者小米手机,后台用运算,筛选厂商对应的手机。

1 基础语法

运算符术语示例结果速记
&&2>1 && 3>2&&两边同为真,结果为真,否则为假。同真为真
||2>1||3 > 5||两边有一个为真,结果为真,二者同为假,结果为假。有真为真
!! (2>1)取反!表达式为假,加 ! 为真;表达式为真,加 ! 为假。真非为假

其中,将多个条件放在一起运算,最终返回 真(1)或 假(0)

  • 综合案例1 ,该案例需求:手机存储大于 128,手机屏幕尺寸大于等于 6.35

// 目标: 掌握逻辑运算符语法特性
int main(void)
{
	int storage = 256;		// 手机存储
	double size = 6.3;		// 屏幕尺寸

	// 需求1: 手机存储大于128, 同时 屏幕尺寸大于等于6.7
	printf("%d\n", storage > 128 && size >= 6.7);  // && 同真为真

	// 需求2: 手机存储大于128, 或者 屏幕尺寸大于等于6.7
	printf("%d\n", storage > 128 || size >= 6.7);	// || 有真为真

	// !非,取反的意思
	printf("%d\n", !6);			// 非真为假
	printf("%d\n", !0);			// 非假为真
	printf("%d\n", !(7 < 9));	// 思考结果是什么?  --> 0
    
    //(使用时特殊情况)判断 20 是介于 10 和 30 之间的数
    // 错误写法
	printf("%d\n", 30 > 20 > 10); 	// C 语言不支持,数学中连续判断的语法

	// 正确写法
	printf("%d\n", 30 > 20 && 20 > 10);

	return 0;
}
  • 综合案例2 ,该案例需求:判断 20 是介于 30 和 10 之间的数。

// 错误写法
printf("%d\n", 30 > 20 > 10); 	// C 语言不支持,数学的这种连续判断的语法

// 正确写法
printf("%d\n", 30 > 20 && 20 > 10);

2 短路运算

        逻辑运算符的特性,导致实际应用中一部分表达式不执行,也能得出整个表达式结果。这一特点经常作为考点出现在计算机二级、期末考试题中。

在程序中:

  • 判断 表达式 a && (b+c) 的结果:

    • 当 a 为假时,不必计算 b+c,可直接得出表达式为假的结论。

  • 判断 表达式 a || (b+c) 的结果:

    • 当 a 为真时,则不必计算 b+c,就能判断出表达式的值为 真。

概念:逻辑表达式 运算过程中,只运算左边表达式,就能直接得出整个逻辑表达式的结果。—— 短路运算

短路运算作用:

在代码中利用短路运算,可 避免不必要运算,提高程序执行效率。 比如有如下代码:

int a = 5, b = 28;
int c = (a > 3) || ((b / 7)*4 % 2 != 0)
printf("c = %d\n", c);

        现要计算 c 值。= 右侧表达式含有逻辑或 || 运算符,运算特性 有真为真。|| 左边表达式很容易判断为 真,可确定整个表达式结果为 真。 右侧 b 相关的 复杂表达式 不需要计算 。

3 短路运算特性

左表达式能直接得逻辑表达式结果,右表达式不执行。

  • 综合案例 1:以下代码执行后,a、b、c 的值依次是多少?

// 目标: 掌握运算特性
int main(void)
{
	int a = 1, b = 2, c = 3;
	(a = b + c) || (++b) ;   	
	printf("a=%d, b=%d, c=%d\n", a, b, c);
    
    return 0;
}

        简单分析代码。 很可能得出结论: a = 5,b = 3,c = 3;但是,实际上这里的 b 并没有完成自增运算,值还是 2。 为什么 有前缀 ++ 自增,b 值还是 2 呢? 因为 短路运算!++b 并未执行。

        逻辑 || 运算符,运算特性有真为真。 左侧 a = b+c 赋值表达式很容易得出结果为真。 因此 整个 表达式得出结论为真,右侧 ++b 并不需要执行。 因此,即使是 前缀自增,b 没有执行机会,值依然为 2。

正确输出结果:a = 5,b = 2,c = 3

  • 综合案例 2:分析代码,推测 a, x, y 的值分别是什么?

// 目标: 掌握运算特性
int main(void)
{
	int x = 1, y = 5, a;
	a = --x && ++y;  
	printf("a=%d, x=%d, y=%d\n", a, x, y);  
    
    return 0;
}    

        同样是逻辑运算表达式,逻辑与&& 运算符,运算特性 同真为真。 x 初值为 1,前缀 --x 执行 结果为 0,假。依然会触发短路运算特性。右侧 ++y 不执行。因此,输出结果为:a=0, x=0, y=5

  • 综合案例 3: 依然上述案例 2代码,将 --x 修改为 x--,输出结果为何?

// 目标: 掌握运算特性
int main(void)
{    
    int x = 1, y = 5, a;
	a = x-- && ++y;  
	printf("a=%d, x=%d, y=%d\n", a, x, y);  
    
    return 0;
}

        修改后,x-- 由于是 后缀,因此 先取值 1 为真(而后再-1),所以没有触发 短路运算,继续运算 右侧 ++y,将 y 值自增为 6。 1 && 6 结果为真, a 值为 1。因此,输出结果为:a=1, x=0, y=6

扩展知识:合理利用短路运算特性,提高程序执行效率

  • 编写含表达式1&&表达式2的表达式时,&& 同真为真,左表达式值为假时,右表达式不计算, 建议将 易假的表达式放左边。

  • 编写含表达式1||表达式2的表达式时,|| 有真为真,左表达式值为真时,右表达式不计算。 建议将 易真 的表达式放左边。

4 总结

  • &&:同真为真; ||:有真为真; ! :真非为假

  • 判断一个数在另两个数范围内,用 && 实现

  • 短路特性:运算符左侧表达式可直接得结论,则右侧表达式不执行

  • 利用短路特性:&&,将易假表达式放左侧;||,将易真表达式放左侧


欢迎您同步关注我们的微信公众号!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值