滴水逆向联盟
标题:
什么是逻辑短路
[打印本页]
作者:
夺命书生
时间:
2014-11-19 06:39
标题:
什么是逻辑短路
只有在电路中才听说过短路,逻辑短路,不像是什么好词,这个词不是描述人的,
是描述C语言程序的,它是执行程序时的一种特殊的跳跃状态,那逻辑短路具体是什么呢?
在C语言中,表示条件时用关系表达式,即由关系运算符,> >= < <= == != 六个运算符
之一连接起来的表达式,当表示复杂条件时,可以将多个关系表达式用逻辑运算符连接,构成逻辑表达式。
C语言中有3个逻辑运算符,
&& 用于连接两个条件,当着两个条件同时成立时,整个条件成立。
|| 用于连接两个条件,这两个条件只要有一个成立,那么整个条件成立。
! 只有在其后连接一个表达式,取与这个表达式结果相对的逻辑值,即 真变假 假变真。
在 && 中, 如:a>0&&a<=100 ,这时如果a的值等于 -5 ,这时条件的前一部分就不成立,对于 && 来说
不管后面的条件是否成立,整个条件都不成立,(真两个条件同时成立,整个条件就成立)
或者说, && 后面的条件执行不执行都不会改变整个表达式的取值,这样后半部分就没有执行的必要了,
在C语言中,既然没必要执行,那就不执行,这种一部分代码别跳过,不执行的情况就叫逻辑短路。
&& 可以构成逻辑短路,|| 也可以,如果前一半条件成立,后一般不用执行了,这就是有 || 构成的逻辑短路。
只有这两种方式构成逻辑短路,看下面的代码:
#include<stdio.h>
int main()
{
int a=1,b=2,c=3,d=4,e=5;
if(a>b&&c++>d)
{
e++;
}
printf("%d,%d\n",c,e);
return 0;
}
复制代码
运行结果如图:
1.png
(2.79 KB, 下载次数: 374)
下载附件
保存到相册
2014-11-19 06:29 上传
因为 a>b 不成立,后面的c++>d 没获得执行,因此C仍为3,而if条件不成立,e++ 么有执行,e的值仍然为5.
如果程序中 if 行改为 if(a<b&&c++>d) 其他的不变,结果应为 4,5 以为此时 a<b 成立,对于 && 来说,
前面部分的成立,不能代表整个表达式的值,(如果后半部分成立,整体也就成立)不构成个逻辑短路
因此后半部分还要执行,结果为 4,5
if(n>0&&s/n>60)
...
复制代码
这样的程序在C语言中是正确的,在其他没有逻辑短路的语言中,如VB 是错误的,如果没有逻辑短路
以上程序会存在安全隐患,因为当n=0时,就会出现除0错误,系统直接异常退出,有逻辑短路做保障
以上程序可以正C语言中正常运行。
作者:
大禹治水
时间:
2014-11-19 06:41
好文章,最好多整点。
作者:
bcjc209
时间:
2016-12-9 13:16
学习了 逻辑短路
欢迎光临 滴水逆向联盟 (http://dtdebug.com/)
Powered by Discuz! X3.2