目录
开头
大家好,我叫这是我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));
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
的结果了。
结尾
在看到这里之后,如果你喜欢这篇博客,可以评论来互动一下我哦。