逻辑运算符是用于在布尔逻辑运算中处理二进制位(通常是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 总结
-
&&:同真为真; ||:有真为真; ! :真非为假
-
判断一个数在另两个数范围内,用 && 实现
-
短路特性:运算符左侧表达式可直接得结论,则右侧表达式不执行
-
利用短路特性:&&,将易假表达式放左侧;||,将易真表达式放左侧
欢迎您同步关注我们的微信公众号!!!