设e1和e2是两个布尔表达式.那么,e1 && e2相当于e2 && e1C?
我的直觉告诉我是的.通过简单的逻辑A & B相当于B & A.这在C中也是如此吗?
bob*_*obo 14
从逻辑上讲,是的. 从逻辑的角度来看,e1 && e2永远不会有不同的结果e2 && e1.
但从代码的角度来看,如果评估e1或e2有副作用,那么不,它们并不完全等效.
if( isHungry() && hasFood() ) eat() ;
Run Code Online (Sandbox Code Playgroud)
通常你会希望把最便宜的要评价条件第一,并且只选择第2条件:第一条件捧为真. 短路评估是保证这种情况发生的原因.如果AND逻辑运算中的第一个条件为false,则甚至不评估第二个语句,因为最终结果不会为TRUE (FALSE && (TRUE && TRUE && TRUE && TRUE)) == FALSE).
换句话说,如果你甚至不饿,你就不会费心去检查冰箱.
有时人们会依赖于短路评估会发生的事实,并编写依赖于它的代码.这种类型的东西显示在下面的评论中:
if( x && x->eval() ) { /* do something */ }
Run Code Online (Sandbox Code Playgroud)
所以,x=NULL如上所述.会发生什么?尝试依赖空指针?应该写成
if( x )
{
if( x->eval() )
{
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
我说没有!短路评价意味着,如果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和许多其他语言.