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

gor*_*ndy 2 c

e1e2是两个布尔表达式.那么,e1 && e2相当于e2 && e1C?

我的直觉告诉我是的.通过简单的逻辑A & B相当于B & A.这在C中也是如此吗?

bob*_*obo 14

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

但从代码的角度来看,如果评估e1e2有副作用,那么,它们并不完全等效.

具体来说,有时人们会使用链中的函数&&.

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和许多其他语言.

  • 例如,`if(y!= 0 && x/y == 3)`避免除以零. (7认同)
  • 标称结果是等价的,但行为在C中不等效.如果`&&'的第一个操作数为false,则不会计算第二个操作数,并且不会发生任何副作用. (2认同)
  • 副作用不是唯一的问题; 如果第一个表达式为false,则第二个表达式可能具有其他不期望的行为,例如取消引用空指针. (2认同)