gpt4 book ai didi

c - e1 && e2 是否等同于 e2 && e1?

转载 作者:行者123 更新时间:2023-12-02 05:30:32 25 4
gpt4 key购买 nike

e1e2 是两个 bool 表达式。那么e1 && e2是否等同于C语言中的e2 && e1

我的直觉告诉我是的。通过简单的逻辑,A & B 等同于 B & A。在 C 中也是如此吗?

最佳答案

从逻辑上讲,是的。从逻辑的角度来看,e1 && e2 永远不会有与 e2 && e1 不同的结果。

但是从代码的角度来看,如果 e1e2 的计算有副作用,那么没有,它们并不完全等价。

具体来说,有时人们使用 functions in a chain of && .

if( isHungry() && hasFood() )  eat() ;

通常您希望将最便宜放在评估条件第一个,并且只检查第二个条件如果第一个条件为真短路评估 可确保发生这种情况。如果 AND 逻辑运算中的第一个条件 为 false,则甚至不会评估第二个语句,因为最终结果无论如何都不会为 TRUE (FALSE && (TRUE && TRUE &&真 && 真)) == 假)

换句话说,如果您不饿,您就不会费心去检查冰箱。

有时人们依赖会发生短路评估这一事实,并编写依赖于它的代码。此类事情显示在下面的评论中:

if( x && x->eval() ) { /* do something */ }

因此,假设上面的 x=NULL。会发生什么?尝试引用空指针?是不是应该写成

if( x )
{
if( x->eval() )
{
// do something
}
}

我说不行!短路评估意味着,如果 x==0&& 运算符的正确操作数 甚至不会在 if 中查看 ( x && x->eval() )x->eval() 不会被求值,也不会出现空指针异常。

您必须注意的另一件事是如果您在 if 语句中运行的函数有副作用,例如递增某种计数器。因此,如果 hasFood() 有一个内部计数器增量,例如 fridgeCount++

即使是短的 cct 评估,该函数也不会运行,因此您预期在点击 if 语句时会发生的任何副作用都可能不会发生。

OR 运算符也有短路评估,仅在 if( e1 || e2 ) 中,如果 e1 为 TRUE,则语句短路为 TRUE (然后甚至不评估 e2,整个表达式被视为 TRUE)。

这种行为适用于 C/C++、Java、JavaScript、PHP、Python 和许多其他语言。

关于c - e1 && e2 是否等同于 e2 && e1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18772675/

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