设e1
和e2
是两个 bool 表达式。那么e1 && e2
是否等同于C语言中的e2 && e1
?
我的直觉告诉我是的。通过简单的逻辑,A & B
等同于 B & A
。在 C 中也是如此吗?
最佳答案
从逻辑上讲,是的。从逻辑的角度来看,e1 && e2
永远不会有与 e2 && e1
不同的结果。
但是从代码的角度来看,如果 e1
或 e2
的计算有副作用,那么没有,它们并不完全等价。
具体来说,有时人们使用 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/