什么是逻辑运算中的短路效应?

开头

大家好,我叫这是我58。今天,我们要来介绍一下逻辑运算中的短路效应。

1.什么是逻辑运算中的短路效应?

逻辑运算中的短路效应,是一种用来节省计算资源,提高代码的执行效率1的一种效应,用来使一些东西不参与运算,而且,逻辑运算中的短路效应也是一种比较方便、轻便的效应。其中,除了逻辑非“!”以外,逻辑与“&&”和逻辑或“||”都会执行短路效应。

2.怎样使逻辑与“&&”或逻辑或“||”执行短路效应?

逻辑与&&

在逻辑与“&&”中,只要逻辑与“&&”的左边为0,就会执行短路效应,因为下面的逻辑与的真值表。

输入A 输入B 输出
0 0 0
0 1 0
1 0 0
1 1 1

在这张表里,我们能够知道只要逻辑与的输入A为0,那逻辑与输出的就肯定0,而如果输入A为1,那逻辑与输出的就要么是0,要么是1了,因此,只要逻辑与“&&”的左边为0,就会执行短路效应,不会执行右边的东西了。

逻辑或||

而逻辑或“||”中,只要逻辑或“||”的左边为1,也会执行短路效应,因为下面的逻辑或的真值表。

输入A 输入B 输出
0 0 0
0 1 1
1 0 1
1 1 1

在这张表里,我们能够知道只要逻辑或的输入A为1,那逻辑或输出的就肯定1,而如果输入A为0,那逻辑与输出的就要么是0,要么是1了,因此,只要逻辑与“||”的左边为1,就会执行短路效应,跟逻辑与的短路效应一样也不会执行右边的东西了。

3.逻辑运算中的短路效应的实际运用

“0变成3 2变成1”

第一种解法

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
	int i = 0;
	scanf("%d", &i);
	(i || (i = 3,0),(2 == i) && (i = 1, 0));
	printf("%d", i);
	return 0;
}

第二种解法

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
	int i = 0;
	scanf("%d", &i);
	if (!i) {
		i = 3;
	}
	else if (2 == i){
		i = 1;
	}
	printf("%d", i);
	return 0;
}

第三种解法

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
	int i = 0;
	scanf("%d", &i);
	switch (i) {
	case 0:
		i = 3;
		break;
	case 2:
		i = 2;
		break;
	}
	printf("%d", i);
	return 0;
}

其中,第一种解法只有176个字节的大小,第二种解法有193个字节的大小,而第三种解法足足有212个字节的大小呢!因此,这也说明了逻辑运算中的短路效应比较轻便的特点。

“求1加到你输入的正整数的和”(只能用逻辑运算中的短路效应,不能使用其他关于条件判断的关键字或操作符)

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
unsigned int sigma(unsigned int u) {
	unsigned int uret = 0;
	uret = u;
	return u + (u && (uret = sigma(u - 1)),uret);
}
int main() {
	unsigned int u = 0;
	scanf("%u", &u);
	printf("%u", sigma(u));
}

4.某些代码的运行方式

在看完上面的辑运算中的短路效应的实际运用之后,有的人可能就对这里面的(i || (i = 3,0),(2 == i) && (i = 1, 0));return u + (u && (uret = sigma(u - 1)),uret);给搞不清楚他是怎么运行的了,那么,如果你真的是这样的话,就看一下下面的流程图吧。

(i || (i = 3,0),(2 == i) && (i = 1, 0));

开始
i?
2 == i?
设i为1
0用来防止把“i=1”当作“&&”右边的结果
结束
设i为3
0用来防止把“i=3”当作“||”右边的结果

return u + (u && (uret = sigma(u - 1)),uret);

至于return u + (u && (uret = sigma(u - 1)),uret);呢,就更简单了,因为在它中,如果u为真,就把uret的值设为sigma(u - 1),并在这之后,就返回u加上现在的uret的结果了,而如果u为假,就把uret的值原封不动,并跟刚才一样也返回u加上现在的uret的结果了。

结尾

在看到这里之后,如果你喜欢这篇博客,可以评论来互动一下我哦。


  1. 选自江明涛的博客中的“Java中boolean与逻辑运算的短路效应” ↩︎

相关推荐

  1. 什么逻辑运算短路效应

    2024-07-11 19:08:02       23 阅读
  2. C语言阶乘(只用逻辑运算短路效应判断)

    2024-07-11 19:08:02       20 阅读
  3. mysql binlog 位点生成逻辑什么

    2024-07-11 19:08:02       34 阅读
  4. C语言逻辑运算

    2024-07-11 19:08:02       24 阅读
  5. mapper文件逻辑运算符替换

    2024-07-11 19:08:02       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 19:08:02       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 19:08:02       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 19:08:02       57 阅读
  4. Python语言-面向对象

    2024-07-11 19:08:02       68 阅读

热门阅读

  1. 开发指南043-自定义注解

    2024-07-11 19:08:02       24 阅读
  2. C语言 比较两个字符串

    2024-07-11 19:08:02       20 阅读
  3. Andt Desgin Vue Pro 项目添加前缀访问解决

    2024-07-11 19:08:02       17 阅读
  4. MDA协议

    2024-07-11 19:08:02       23 阅读
  5. Spring Boot中集成DJL运行Python PyTorch模型:MNIST实战

    2024-07-11 19:08:02       18 阅读
  6. GraphSAGE项目练手

    2024-07-11 19:08:02       22 阅读
  7. el-dialog弹框里面的组件第二次打开create不生效

    2024-07-11 19:08:02       19 阅读
  8. 测试类型介绍-功能测试入门指南

    2024-07-11 19:08:02       22 阅读
  9. 【ARMv8/v9 GIC 系列 1.8 -- PE 中断处理的前期评估】

    2024-07-11 19:08:02       20 阅读
  10. VUE与React的生命周期对比

    2024-07-11 19:08:02       16 阅读
  11. 设计模式:建造者模式

    2024-07-11 19:08:02       24 阅读
  12. Puppeteer 生成图片 生成 PDF

    2024-07-11 19:08:02       17 阅读