TA的每日心情 | 怒 2014-12-12 07:01 |
---|
签到天数: 8 天 [LV.3]偶尔看看II
逆向联盟VIP会员
   
- 积分
- 344
|
只有在电路中才听说过短路,逻辑短路,不像是什么好词,这个词不是描述人的,
是描述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;
- }
复制代码 运行结果如图:
因为 a>b 不成立,后面的c++>d 没获得执行,因此C仍为3,而if条件不成立,e++ 么有执行,e的值仍然为5.
如果程序中 if 行改为 if(a<b&&c++>d) 其他的不变,结果应为 4,5 以为此时 a<b 成立,对于 && 来说,
前面部分的成立,不能代表整个表达式的值,(如果后半部分成立,整体也就成立)不构成个逻辑短路
因此后半部分还要执行,结果为 4,5
这样的程序在C语言中是正确的,在其他没有逻辑短路的语言中,如VB 是错误的,如果没有逻辑短路
以上程序会存在安全隐患,因为当n=0时,就会出现除0错误,系统直接异常退出,有逻辑短路做保障
以上程序可以正C语言中正常运行。
|
|