为什么 C 中的逻辑运算符在不需要时不计算整个表达式?

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 是否不需要计算整个表达式,因为&&要求两个谓词都为真?不失一般性,我同样的问题适用于他的第二个例子。

ala*_*ain 1

一个典型的例子是空指针检查:

if(ptr != NULL && ptr->value) {
    ....
}
Run Code Online (Sandbox Code Playgroud)

如果没有短路评估,当取消引用空指针时,这会导致错误。

程序首先检查左侧部分ptr != NULL。如果计算结果为false,则不必计算第二部分,因为已经很清楚结果将是false