一、问题
只有电路中才听说过短路。逻辑短路,不像是什么好词⼉。这个词不是描述⼈的,是描述C语⾔程序的。它是程序执⾏时的⼀种特殊的跳跃状态。那么逻辑短路具体是什么呢?
二、解答
C语⾔中,表⽰条件时⽤关系表达式,即由关系运算符>、>=、<、<=、==、!=六个运算符之⼀连接起来的表达式。当表⽰复杂条件时,可以将多个关系表达式⽤逻辑运算符连接,构成逻辑表达式。
C语⾔中的逻辑运算符有3个:1、&&⽤于连接两个条件,当这两个条件同时成⽴时,整个条件成⽴。2、||⽤于连接两个条件,这两个条件只要有⼀个成⽴,整个条件就成⽴。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;
}
运行结果如下:
3,5
因为 a>b 不成⽴,后⾯的 c++>d 没获得执⾏,因此。仍为3,⽽让条件不成⽴,e++ 没执⾏,e的值仍为5。
如果程序中 迁⾏改为 证a<b&&c++>d),其他不变,结果应为“4,5”。因为此时 a<b成⽴,对&&来说,前半部分成⽴,不能决定整个表达式的值(如果后半部分成⽴,整体 就成⽴,后半部分不成⽴,整体就不成⽴),不构成逻辑短路。因此后半部分还要执⾏,结果为4,5。
三、总结
在计算平均分是否及格的程序中,前⾯程序经运算得出 n 为科⽬数,§为总成绩,n有可能得0。程序可以写成:
if (n > 0 && s / n > 60)
{...
}
这样的程序在C语⾔中是正确的,在其他没有逻辑短路的语⾔中是错误的。 如果没有逻辑短路,以上程序就会存在安全隐患,因为当n=0 时,就会出现除0错,系统 直接异常退出。有逻辑短路做保障,以上程序可以在C语⾔中正确运⾏。