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

开头

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

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

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

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

逻辑与&&

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

输入A输入B输出
000
010
100
111

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

逻辑或||

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

输入A输入B输出
000
011
101
111

在这张表里,我们能够知道只要逻辑或的输入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与逻辑运算的短路效应” ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值