8.5.2短路布尔运算符

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

boolean1&& boolean2

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

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

boolean1|| boolean2

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

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

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

a ____ b

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

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

函数f(a,b,c)如果(nargin>2&&ischar(c))。。。

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

函数f(a,b,c)如果(nargin>2)如果(ischar(c))。。。

函数f(a,b,c)如果(nargin>2&ischar(c))。。。

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

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

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

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

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

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

在数组掩码的情况下,两者tval未来值必须是标量或维度等于的数组面具.结果构造如下:

结果(掩码)=tval(掩码);result(!mask)=fval(!掩码);

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

编程说明:如果其他是的别名合并并且可以互换使用。

详见: 必然的, diff.


版权所有 © 2024 Octave中文网

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