8.5.2短路布尔运算符

结合中到标量值的隐式转换ifwhile条件下,Octave的按元素布尔运算符通常足以执行大多数逻辑运算。然而,有时需要停止对布尔表达式进行求值,因为可以确定总体真值。Octave的短路布尔运算符是这样起作用的。

boolean1 && boolean2

表达式boolean1使用等效的运算计算并转换为标量all (boolean1(:))如果boolean1不是逻辑值,如果其值为非零,则视为true,如果其为零,则为false。如果boolean1是一个数组,只有当它不是空的并且所有元素都不是零时,它才为真。如果boolean1如果计算结果为false,则过集合表达式的结果为false。如果为真,表达式boolean2以与相同的方式评估boolean1如果它为真,那么整个表达式的结果就为真。否则,过集合表达式的结果为false。

警告与evaluation等价的一个例外all (boolean1(:))是何时boolean1一个空数组。对于MATLAB兼容性,空数组的真值总是false所以[] && true计算为false尽管all ([])true.

广告
boolean1 || boolean2

表达式boolean1使用等效的运算计算并转换为标量all (boolean1(:))如果boolean1不是逻辑值,如果其值为非零,则视为true,如果其为零,则为false。如果boolean1是一个数组,只有当它不是空的并且所有元素都不是零时,它才为真。如果boolean1如果计算结果为true,则过集合表达式的结果为true。如果为false,则表达式boolean2以与相同的方式评估boolean1如果它为真,那么整个表达式的结果就为真。否则,过集合表达式的结果为false。

警告空矩阵的真值总是false,有关详细信息,详见上一个列表项。

广告

在确定表达式的总体真值之前,可能不会对两个操作数进行求值,这一事实可能很重要。例如,在表达式中

a && b++

变量的值b仅当变量a为非零。

这可以用来编写更简洁的代码。例如,这可能是写

function f (a, b, c)
  if (nargin > 2 && ischar (c))
    ...

而不是必须使用两个if语句,以避免试图对不存在的参数求值。例如,如果没有短路函数,则需要写入

function f (a, b, c)
  if (nargin > 2)
    if (ischar (c))
      ...

function f (a, b, c)
  if (nargin > 2 & ischar (c))
    ...

将导致错误,如果f使用一个或两个参数调用,因为Octave将被迫尝试计算运算符的两个操作和&’.

MATLAB具有特殊行为,允许运算符&|在真理表达式中使用时短路ifwhile语句。Octave的行为与兼容性相同,但是,使用&|强烈劝阻以这种方式操作,并将报警告。相反,您应该使用&&||总是有短路行为的运算符。

最后,Octave中不支持三元运算符(?:)。如果短路不重要,可以用ifelse作用

 
: M = merge (mask, tval, fval)
: M = ifelse (mask, tval, fval)

合并的元素true_valfalse_val,取决于的值mask.

如果mask是一个逻辑标量,其他两个参数可以是任意值。否则mask必须是逻辑数组,并且tval,fval应该是匹配类的数组或元胞数组。在标量掩模的情况下,tval如果mask为真,否则fval返回。

在数组掩码的情况下,两者tvalfval必须是标量或维度等于的数组mask.结果构造如下:

result(mask) = tval(mask);
result(! mask) = fval(! mask);

mask也可以是任意数字类型,在这种情况下,它首先转换为逻辑类型。

编程说明:ifelse是的别名merge并且可以互换使用。

详见: logical, diff.

广告

版权所有 © 2024-2025 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-2