if子句中逻辑表达式中的值的顺序

Ste*_*fen 6 matlab

if 1 | []
    disp('1 | []');
end

if [] | 1
    disp('[] | 1');
end
Run Code Online (Sandbox Code Playgroud)

结果1 | [].第一个if被执行.

怎么来这个行为?我认为两者都有相同的结果.

Jon*_*nas 4

我想说,这很可能是解释器引起的错误,尽管 MathWorks 可能声称这是未定义的行为。

在命令行上, 和cond1 = 1|[];cond2 = []|1;计算结果都是[],因为所有操作都涉及[]return []。由于[]计算结果为falseif 在条件中使用,因此如果在 if 子句中使用,人们会期望两种情况的行为方式相同。

除了数组逻辑运算符之外,Matlab 还提供短路运算符,如果仅通过查看部分条件即可清楚结果,则停止条件评估。在命令行上计算,数组操作1|[]返回[],而短路操作1||[]返回1。请注意,这[]||1会引发错误,因为短路运算符仅适用于标量条件,除非它永远不需要评估它们。

到目前为止,一切都如预期。我怀疑在我们意外的情况下发生的情况是解释器在 if 子句中隐式替换了1|[]by 1||[],可能是因为操作以标量开始,而[]不是数组。

如果可能的话,您应该避免使用 进行计算[],并使用 捕获潜在的此类情况isempty

  • 有趣的是*直到最后*才被解释为错误。这意味着 ` ([ ] | 1)| 1` 是假的。 (2认同)