if 1 | []
disp('1 | []');
end
if [] | 1
disp('[] | 1');
end
Run Code Online (Sandbox Code Playgroud)
结果1 | [].第一个if被执行.
怎么来这个行为?我认为两者都有相同的结果.
我想说,这很可能是解释器引起的错误,尽管 MathWorks 可能声称这是未定义的行为。
在命令行上, 和cond1 = 1|[];的cond2 = []|1;计算结果都是[],因为所有操作都涉及[]return []。由于[]计算结果为falseif 在条件中使用,因此如果在 if 子句中使用,人们会期望两种情况的行为方式相同。
除了数组逻辑运算符之外,Matlab 还提供短路运算符,如果仅通过查看部分条件即可清楚结果,则停止条件评估。在命令行上计算,数组操作1|[]返回[],而短路操作1||[]返回1。请注意,这[]||1会引发错误,因为短路运算符仅适用于标量条件,除非它永远不需要评估它们。
到目前为止,一切都如预期。我怀疑在我们意外的情况下发生的情况是解释器在 if 子句中隐式替换了1|[]by 1||[],可能是因为操作以标量开始,而[]不是数组。
如果可能的话,您应该避免使用 进行计算[],并使用 捕获潜在的此类情况isempty。