滴水逆向联盟

标题: 什么是逻辑短路 [打印本页]

作者: 夺命书生    时间: 2014-11-19 06:39
标题: 什么是逻辑短路


只有在电路中才听说过短路,逻辑短路,不像是什么好词,这个词不是描述人的,

是描述C语言程序的,它是执行程序时的一种特殊的跳跃状态,那逻辑短路具体是什么呢?

在C语言中,表示条件时用关系表达式,即由关系运算符,> >=  <  <= == != 六个运算符

之一连接起来的表达式,当表示复杂条件时,可以将多个关系表达式用逻辑运算符连接,构成逻辑表达式。

C语言中有3个逻辑运算符,


&&    用于连接两个条件,当着两个条件同时成立时,整个条件成立。
||      用于连接两个条件,这两个条件只要有一个成立,那么整个条件成立。
!     只有在其后连接一个表达式,取与这个表达式结果相对的逻辑值,即 真变假  假变真。


在 && 中, 如:a>0&&a<=100 ,这时如果a的值等于 -5 ,这时条件的前一部分就不成立,对于 && 来说


不管后面的条件是否成立,整个条件都不成立,(真两个条件同时成立,整个条件就成立)

或者说, && 后面的条件执行不执行都不会改变整个表达式的取值,这样后半部分就没有执行的必要了,

在C语言中,既然没必要执行,那就不执行,这种一部分代码别跳过,不执行的情况就叫逻辑短路。

&& 可以构成逻辑短路,|| 也可以,如果前一半条件成立,后一般不用执行了,这就是有 || 构成的逻辑短路。

只有这两种方式构成逻辑短路,看下面的代码:

  1. #include<stdio.h>
  2. int main()
  3. {
  4.         int a=1,b=2,c=3,d=4,e=5;
  5.         if(a>b&&c++>d)
  6.         {
  7.                 e++;
  8.         }
  9.         printf("%d,%d\n",c,e);
  10.         return 0;
  11. }
复制代码
运行结果如图:


因为 a>b 不成立,后面的c++>d 没获得执行,因此C仍为3,而if条件不成立,e++ 么有执行,e的值仍然为5.

如果程序中 if 行改为 if(a<b&&c++>d) 其他的不变,结果应为 4,5 以为此时 a<b 成立,对于 && 来说,

前面部分的成立,不能代表整个表达式的值,(如果后半部分成立,整体也就成立)不构成个逻辑短路

因此后半部分还要执行,结果为 4,5

  1. if(n>0&&s/n>60)
  2. ...
复制代码

这样的程序在C语言中是正确的,在其他没有逻辑短路的语言中,如VB 是错误的,如果没有逻辑短路

以上程序会存在安全隐患,因为当n=0时,就会出现除0错误,系统直接异常退出,有逻辑短路做保障

以上程序可以正C语言中正常运行。



作者: 大禹治水    时间: 2014-11-19 06:41
好文章,最好多整点。
作者: bcjc209    时间: 2016-12-9 13:16
学习了  逻辑短路




欢迎光临 滴水逆向联盟 (http://www.dtdebug.com/) Powered by Discuz! X3.2