gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:10:48 29 4
gpt4 key购买 nike

我在阅读计算机体系结构课的教科书时看到了这个陈述。

A second important distinction between the logical operators '&&' and '||' versus their bit-level counterparts '&' and '|' is that the logical operators do not evaluate their second argument if the result of the expression can be determined by evaluating the first argument. Thus, for example, the expression a && 5/a will never cause a division by zero, and the expression p && *p++ will never cause the dereferencing of a null pointer. (Computer Systems: A Programmer's Perspective by Bryant and O'Hallaron, 3rd Edition, p. 57)

我的问题是为什么 C 语言中的逻辑运算符会这样?使用作者的 a && 5/a 示例,C 是否不需要评估整个表达式,因为 && 要求两个谓词都为真?不失一般性,我的同样问题适用于他的第二个例子。

最佳答案

短路是一种性能增强,恰好可用于其他目的。

你说“C 不需要评估整个表达式,因为 && 要求两个谓词都为真吗?”但是想想看。如果 && 的左侧为 false,那么右侧的计算结果是否重要? false && truefalse && false,结果是一样的:false。

因此,当 && 的左侧被确定为假时,或者 || 的左侧被确定为真时,上的值右边无所谓,可以跳过。通过消除评估可能昂贵的第二次测试的需要,这使代码更快。想象一下,如果右侧调用一个函数来扫描整个文件中的给定字符串?如果第一个测试意味着您已经知道组合答案,您不想跳过该测试吗?

C 决定超越保证短路以保证评估顺序,因为这意味着像您提供的那样的安全测试是可能的。只要测试是幂等的,或者只有在未短路时才会出现副作用,就需要此功能。

关于c - 为什么 C 中的逻辑运算符在不必要时不计算整个表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39613707/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com