|之间有什么区别?和|| 在MATLAB?

Lay*_*Lay 5 matlab short-circuiting logical-operators

是什么之间的区别|,并||在MATLAB逻辑运算符?

Dav*_*nan 5

我相信你已经阅读了短路运算符元素运算符的文档.

一个重要的区别是元素操作符可以在数组上操作,而短路操作符只适用于标量逻辑操作数.

但可能关键的区别在于短路问题.对于短路运算符,表达式从左到右进行评估,一旦确定最终结果,就不会评估剩余项.

例如,考虑一下

x = a && b
Run Code Online (Sandbox Code Playgroud)

如果a评估为false,那么我们知道a && b评估结果与评估结果false无关b.所以没有必要进行评估b.

现在考虑这个表达式:

NeedToMakeExpensiveFunctionCall && ExpensiveFunctionCall
Run Code Online (Sandbox Code Playgroud)

在哪里我们想象ExpensiveFunctionCall需要很长时间才能评估.如果我们可以执行其他一些便宜的测试,允许我们跳过调用ExpensiveFunctionCall,那么我们就可以避免调用ExpensiveFunctionCall.

所以,假设NeedToMakeExpensiveFunctionCall评估为false.在那种情况下,因为我们使用了短路运算符,所以ExpensiveFunctionCall不会被调用.

相反,如果我们使用元素方式运算符并编写如下函数:

NeedToMakeExpensiveFunctionCall & ExpensiveFunctionCall
Run Code Online (Sandbox Code Playgroud)

然后ExpensiveFunctionCall永远不会跳过调用.

事实上,我希望您已阅读的MATLAB文档包含一个很好的例子,可以很好地说明这一点:

x = (b ~= 0) && (a/b > 18.5)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,a/b如果b为零,我们就无法执行.因此测试b ~= 0.使用短路运算符意味着我们避免计算a/b何时b为零,从而避免可能出现的运行时错误.显然,元素逻辑运算符将无法避免运行时错误.

有关短路评估的更长时间的讨论,请参阅有关该主题的维基百科文章.

  • +1:值得注意的是,`|`也可以对数组进行操作,而`||'仅对标量进行操作.此外,[Loren Shure](http://blogs.mathworks.com/loren/)指出[这里](http://stackoverflow.com/a/1393606/1336150)```也可以短路( !!),但仅限于`if` /`while`语句. (3认同)