use*_*493 5 c short-circuiting logical-operators
我正在为我的计算机体系结构课阅读我的教科书,我发现了这个说法。
逻辑运算符 '
&&
' 和 '||
' 与其位级对应物 '&
' 和 '|
'之间的第二个重要区别是,如果表达式的结果可以通过计算第一个参数来确定,则逻辑运算符不计算它们的第二个参数。因此,例如,表达式a && 5/a
永远不会导致被零除,并且表达式p && *p++
永远不会导致取消引用空指针。(Computer Systems: A Programmer's Perspective by Bryant and O'Hallaron,第 3 版,第 57 页)
我的问题是为什么 C 中的逻辑运算符的行为如此?使用作者的示例a && 5/a
,C 是否不需要计算整个表达式,因为&&
要求两个谓词都为真?不失一般性,我同样的问题适用于他的第二个例子。
一个典型的例子是空指针检查:
if(ptr != NULL && ptr->value) {
....
}
Run Code Online (Sandbox Code Playgroud)
如果没有短路评估,当取消引用空指针时,这会导致错误。
程序首先检查左侧部分ptr != NULL
。如果计算结果为false
,则不必计算第二部分,因为已经很清楚结果将是false
。